Пытаетесь скопировать определенный диапазон из многих листов в рабочей книге на один лист в другой рабочей книге vba excel?

#excel #vba #loops

#excel #vba #циклы

Вопрос:

Я новичок в VBA, и у меня есть проблема в вышеупомянутой теме, которую я хочу скопировать определенный диапазон из многих листов в рабочей книге на один лист в другой рабочей книге Я искал в сети и, наконец, дошел до кода, который запускается, но он дает мне только данные последнего листа, а не все листы

У меня есть рабочая книга (WB1) — Текущая рабочая книга

У меня есть другая рабочая книга (WB2) — Копировать из книги

У меня есть WS1 в текущей книге

У меня есть WS2 в копии из книги

Имена рабочих листов в WB2 — это такие числа, как 1,2 и так далее

Я использовал следующий код

     Sub CollectData()
    Dim wb1 As Workbook
    Dim wb2 As Workbook
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Application.DisplayAlerts = False
    Set wb1 = ThisWorkbook
    Set wb2 = Workbooks.Open("Path")
    Set ws1 = wb1.Sheets("Jan")
    For Each ws2 In wb2.Sheets
    If Len(ws2.Name) > 0 Then
    ws2.Range("A2:G50").Copy Destination:=ws1.Range("A2:G50")
    End If
    Next ws2
    Application.DisplayAlerts = True
    wb2.Close (savechanges = True)
  

Код дает мне данные только на последнем листе?? в этом случае 2

Ценю вашу поддержку.

Спасибо, с уважением

Комментарии:

1. Добро пожаловать в SO . Не могли бы вы объяснить, что должны делать следующие: If Len(ws2.Name) > 0 Then и Application.DisplayAlerts = False ? На первый вопрос можно ответить так, как я не хочу включать рабочие листы, которые… и на второй вопрос можно ответить так, как я не хочу, чтобы диалог всплывал, когда … .

Ответ №1:

Я тоже новичок, и я печатаю на своем планшете, поэтому не могу протестировать ваш код, но похоже, что вы всегда вставляете в один и тот же диапазон, перезаписывая предыдущие вставки в своем цикле. Ваш целевой диапазон должен быть динамическим для вставки в следующий пустой диапазон, чтобы избежать перезаписи.

Обновить:

Мне пришлось вернуться к этому, и, как я и предполагал, вы копировали предыдущие вставки при каждом запуске вашего цикла. Мой код, вероятно, немного грубый, но, как я уже сказал, я все еще изучаю основы самостоятельно. Обновите «путь» в книгах.откройте строку и попробуйте. Это должно сработать для вас.

 Sub CollectData()
    Dim wb1 As Workbook
    Dim wb2 As Workbook
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    
    Dim NextRow As Long
    
    Set wb1 = ThisWorkbook
    Set ws1 = wb1.Sheets("Jan")
  
    Application.DisplayAlerts = False
    
    Set wb2 = Workbooks.Open("Path")
   
    For Each ws2 In wb2.Sheets
    If Len(ws2.Name) > 0 Then
    NextRow = ws1.Cells(Rows.Count, 1).End(xlUp).Row   1
    ws2.Range("A2:G50").Copy ws1.Range("A" amp; NextRow)
    End If
    Next ws2
    Application.DisplayAlerts = True
    wb2.Close True
End Sub
  

Ответ №2:

Копировать диапазон из нескольких листов

 Option Explicit

Sub CollectData()

    ' Paste
    Dim wb1 As Workbook
    Set wb1 = ThisWorkbook
    Dim ws1 As Worksheet
    Set ws1 = wb1.Sheets("Jan")
    Dim rng1 As Range ' Paste Range (First Cell Only)
    
    ' Copy
    Dim wb2 As Workbook
    Set wb2 = Workbooks.Open("F:Test64010480.xlsm")
    Dim ws2 As Worksheet
    Dim rng2 As Range ' Copy Range
    
    ' Loop through worksheets in Copy Workbook.
    For Each ws2 In wb2.Worksheets
        ' Check if the current worksheet's name contains only one character
        ' (it cannot contain 0 characters).
        If Len(ws2.Name) < 2 Then
            ' Define Copy Range.
            Set rng2 = ws2.Range("A2:G50")
            ' Define first cell range of Paste Range.
            Set rng1 = ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Offset(1)
            ' Either (if you only need values)...
            ' Write values from Copy Range to Paste Range.
            rng1.Resize(rng2.Rows.Count, rng2.Columns.Count).Value = rng2.Value
            ' ...or (if you also need formulas and formats).
            ' Copy data from Copy Range to Paste Range.
            'rng2.Copy Destination:=rng1
        End If
    Next ws2
    
    ' Close Copy Workbook.
    wb2.Close SaveChanges:=False ' No need to save it, we were just reading.
     
    ' Maybe you want to save the Paste Workbook.
    'wb1.Save
     
End Sub