Как скомпилировать и объединить данные из нескольких рабочих книг и листов в один новый файл Excel в VBA

Как скомпилировать и объединить данные из нескольких рабочих книг и листов в один новый файл Excel в VBA

Я пытаюсь скомпилировать и сопоставить данные из разных рабочих книг в один лист Excel. Я пытаюсь вытащить данные в A1:D1 из двух рабочих книг, Secondtest1 и Secondtest2, в ThisWorkbook. Вот мой код на данный момент.

Sub collateData()

    Dim SourceArray
    Dim SheetName As String, SourceRange As String
    Dim TargetWorkbook As Workbook, sourceFile As Workbook
    Dim TargetSheet As Worksheet
    Dim i As Integer
    Dim LastRow As Long

    SourceArray = Array("H:\Secondtest1.xlsx", "H:\Secondtest2.xlsx")
    SheetName = "Sheet1"
    SourceRange = "A1:D1"
    Set TargetWorkbook = ThisWorkbook
    Set TargetSheet = TargetWorkbook.Sheets("Sheet1")
    For i = 0 To UBound(SourceArray)
        Set sourceFile = Workbooks.Open(SourceArray(i))
        **LastRow = TargetSheet.Cells(TargetSheet.Rows.Count, 1).End(x1Up).Row**
        With sourceFile
            .Sheets(SheetName).Range(SourceRange).Copy Destination:=TargetSheet.Range("A" & i & ":D" & i)

            .Close
        End With
    Next

End Sub

Я отметил звездочкой строку, в которой получаю ошибку. Ошибка, которую я получаю, это "Application-defined or object-defined error". Буду признателен за любую помощь, спасибо.

решение1

Так и должно быть xlUp(это строчная буква «L», а не цифра «1»).

Редактировать

Несколько моментов:

  • Всегда используйте Option Explicitв верхней части своих модулей, даже если это не для производственной среды. Это сразу бы указало вам на ошибку в вашем коде.
  • Выберите одно соглашение об именовании и следуйте ему последовательно (в основном вы используете заглавные буквы, но объявили одну переменную как sourceFile).
  • Некоторые люди могут предпочесть именование процедур, используя иное соглашение, нежели то, которое используется для переменных (это на ваше усмотрение).
  • Если вы открываете книгу ввода без намерения ее дальнейшего изменения, лучше использовать аргумент ReadOnlyи, возможно, также аргумент UpdateLinks, например:

    Workbooks.Open(SourceArray(i), ReadOnly:=False, UpdateLinks:=False)
    

    Передача Falseпредотвратит UpdateLinksпоявление диалогового окна обновления ссылки.

  • Используйте Longвместо , Integerдаже если вы уверены, что ваши значения будут в пределах диапазона переменной Integer. Я где-то читал, что Longтип данных стал более эффективным в последних версиях VBA.

Связанный контент