Cómo compilar y cotejar datos de varios libros y hojas en un nuevo archivo de Excel en VBA

Cómo compilar y cotejar datos de varios libros y hojas en un nuevo archivo de Excel en VBA

Estoy intentando compilar y cotejar datos de diferentes libros en una hoja de Excel. Estoy intentando extraer datos en A1:D1 de dos libros de trabajo, Secondtest1 y Secondtest2 en ThisWorkbook. Aquí está mi código hasta ahora.

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

He marcado con un asterisco la línea en la que aparece un error. El error que recibo es "Error definido por la aplicación o por el objeto". Agradecería cualquier ayuda, gracias.

Respuesta1

Debería serlo xlUp(es una 'L' minúscula, no el número '1').

Editar

Algunos puntos:

  • Úselo siempre Option Expliciten la parte superior de sus módulos, incluso si no es para un entorno de producción. Hacer esto le habría señalado el error de inmediato en su código.
  • Elija una convención de nomenclatura y sígala de manera consistente (usará principalmente palabras en mayúscula, pero ha declarado una variable como sourceFile).
  • Algunas personas pueden preferir nombrar procedimientos usando una convención diferente a la que se usa para las variables (depende de usted).
  • Si está abriendo un libro de entrada sin la intención de modificarlo más, es mejor usar el ReadOnlyargumento, y quizás también el UpdateLinksargumento, como este:

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

    Pasar Falsea UpdateLinksevitará que aparezca el cuadro de diálogo del enlace de actualización.

  • Úselo Longen lugar de Integerincluso si está seguro de que sus valores estarán dentro del rango de una Integervariable. Leí en alguna parte que el Longtipo de datos se ha vuelto más eficiente en las versiones recientes de VBA.

información relacionada