对于每个Ws循环不切换工作表

时间:2018-06-22 14:08:09

标签: excel vba excel-vba

我有一个小宏,它应该将数据从Book1中的工作表1复制/粘贴到新的工作簿(Book2)中。之后,我希望它在Book1的其余工作表中循环并复制/粘贴到Book2中,但不包含标题。

下面的宏完成了第一步,但随后每次都继续复制/粘贴工作表1中的记录,而不是切换工作表以复制/粘贴新数据。

Sub CopyData()

' Copy A:D from all sheets to template

Dim ws As Worksheet
Dim sheetIndex As Integer

sheetIndex = 1

'First Sheet pulls in headers and data

    Windows("Book1.xlsx").Activate
    Sheets(1).Select
    Range("A1:D" & Cells(Rows.Count, "C").End(xlUp).Row).Copy
    Windows("Book2.xlsm").Activate
    ActiveSheet.Paste
    Windows("Book1.xlsx").Activate

'Every other worksheet only copies over data

For Each ws In ActiveWorkbook.Worksheets
   If ws.Index <> 1 Then
    Windows("Book1.xlsx").Activate
    Range("A2:D" & Cells(Rows.Count, "C").End(xlUp).Row).Copy
    Windows("Book2.xlsm").Activate
    Range("A1").End(xlDown).Offset(1).Select
    ActiveSheet.Paste
   End If
    sheetIndex = sheetIndex + 1
Next ws
End Sub

我不太有经验,所以如果上面的代码没有优化,我深表歉意。预先感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

快速且非常脏的解决方案:

For Each ws In ActiveWorkbook.Worksheets
    ws.Activate
    'rest of the code
Next ws

如果将工作簿分配给变量并在不使用ActivateSelect的情况下遍历工作表,那就更好了。

答案 1 :(得分:1)

您快到了,但是您需要具体说明要处理的工作表和工作簿。另外,您无需选择它们即可复制/粘贴。

假设要粘贴到Book2.xlsm中的工作表是Sheet1:

Sub CopyData()

' Copy A:D from all sheets to template

Dim ws As Worksheet, ws2 as worksheet
Dim sheetIndex As Integer
Dim wb1 as workbook, wb2 as workbook

Set wb1 = Workbooks("Book1.xlsx")
set wb2 = Workbooks("Book2.xlsx")

Set ws = wb1.sheets(1)
set ws2 = wb2.sheets(2)


'First Sheet pulls in headers and data

 ws.Range("A1:D" & Cells(Rows.Count, "C").End(xlUp).Row).Copy ws2.range("A1")

'Every other worksheet only copies over data

For Each ws In wb1
   If ws.Index <> 1 Then
       ws.Range("A2:D" & Cells(Rows.Count, "C").End(xlUp).Row).Copy ws2.Range("A1").End(xlDown).Offset(1,0)
   End If
Next ws

End Sub

答案 2 :(得分:1)

要实现这样的目标,重要的是要知道如何初始化工作簿和工作表。请花时间研究如何在vba中初始化对象,因为这将在将来对您有所帮助。

 Sub CopyData()

' Copy A:D from all sheets to template

Dim ws As Worksheet
Dim sheetIndex As Integer
Dim wbBook1 As Workbook, wbBook2 As Workbook

sheetIndex = 1

'First Sheet pulls in headers and data
Set wbBook1 = ThisWorkbook              'The Workbook where we will copy the data;     This contains the macro
Windows("Book2.xlsx").Activate          'Because we don't know the book name we will just activate it to initialize
                                    'the second workbook where we will copy our data from Book1
Set wbBook2 = ActiveWorkbook

'Every other worksheet only copies over data

'Now that we initialize our two workbooks we will now copy it in the corresponding sheets

For Each ws In wbBook1.Worksheets
    With ws
        If ws.Index = 1 Then
         .Range("A2:D" & Cells(Rows.Count, "C").End(xlUp).Row).Copy wbBook2.Sheets(1).Range("A1")

        Else:
            sheetIndex = sheetIndex + 1
            wbBook2.Worksheets.Add After:=wbBook2.Sheets(sheetIndex - 1) 'Add additional worksheet on the end to paste our other data
            .Range("A2:D" & Cells(Rows.Count, "C").End(xlUp).Row).Copy wbBook2.Sheets(sheetIndex).Range("A1")

        End If
    End With
Next ws
End Sub