2017-07-14 4 views
0

Ich habe ein Makro geschrieben, das die ersten drei Spalten von Quell-Excel-Arbeitsmappen in ein Übersichtsblatt anfügt.Kopierbereich in VBA wirft Laufzeitfehler 1004

Der Code kopiert die nicht leeren Zellen in den ersten drei Spalten von der Registerkarte "Tabellendaten" der Quellarbeitsmappen beginnend mit dem Namen "Log * .xls" und fügt sie den Spalten in der Übersicht hinzu. Alle Daten in Zusammenfassungsblatt wird horizontal angehängt.

Jetzt funktioniert der Code völlig in Ordnung, wenn es ein paar hundert Zeilen von Daten in meiner Quelle xls ist (mit dem Namen „Log *“ ab)

Allerdings, wenn die „“ Log * .xsl“Dateien überspannen tausende, erhalte ich einen Laufzeitfehler, wenn Daten aus Quelldatei Bewältigungs

Fehler in Zeile:.

WorkBk.Worksheets("Tabular Data").Range("A1", Cells(lastRow, "C")).Copy 

Makro wie folgt:

Sub MergeAllWorkbooks() 

Dim SummarySheet As Worksheet 
Dim FolderPath As String 
Dim NRow As Integer 
Dim NextCol As Long 
Dim lastRow As Long 
Dim FileName As String 
Dim WorkBk As Workbook 


' Create a new workbook and set a variable to the first sheet. 
Set SummarySheet = Workbooks.Add(xlWBATWorksheet).Worksheets(1) 

' Modify this folder path to point to the files you want to use. 
FolderPath = ThisWorkbook.Path 


' Call Dir the first time, pointing it to all Excel files in the folder path. 
FileName = Dir(FolderPath & "\" & "Log*.xls") 
NRow = 1 

' Loop until Dir returns an empty string. 
Do While FileName <> "" 



    ' Open a workbook in the folder 
    Set WorkBk = Workbooks.Open(FolderPath & "\" & FileName) 


    ' Find the last non-empty cell in the last row of col C from each Source sheet 
    ' Set the source range to be A:1 through C:lastrow 

    'lastRow = WorkBk.Worksheets("Tabular Data").Range("C" & Rows.Count).End(xlUp).Row 
    'Set SourceRange = WorkBk.Worksheets("Tabular Data").Range("A1:C" & lastRow).Copy 

    lastRow = WorkBk.Worksheets("Tabular Data").Range("A65536").End(xlUp).Row 
    WorkBk.Worksheets("Tabular Data").Range("A1", Cells(lastRow, "C")).Copy 


    If NRow = 1 Then 
     SummarySheet.Range("A65536").End(xlUp).PasteSpecial 
     NRow = NRow + 1 

    Else 
     NextCol = SummarySheet.Cells(1, Columns.Count).End(xlToLeft).Column 
     SummarySheet.Cells(1, Columns.Count).End(xlToLeft).Offset(0, 1).PasteSpecial 
     'SummarySheet.Range("A65536").End(xlUp).Offset(0, 1).PasteSpecial 

    End If 

    ' Close the source workbook without saving changes. 
    Application.CutCopyMode = False 
    WorkBk.Close savechanges:=False 

    ' Use Dir to get the next file name. 
    FileName = Dir() 


Loop 

' Call AutoFit on the destination sheet so that all 
' data is readable. 
SummarySheet.Columns.AutoFit 
SummarySheet.SaveAs (FolderPath & "\" & "Consolidated_Temp_Data.xls") 
MsgBox (NRow & " Files Read ") 

End Sub 

Bitte kann mir jemand helfen, was die Ursache und Lösung für mein Problem ist?

Vielen Dank im Voraus.

Antwort

1

Code Änderung dieses

With WorkBk.Worksheets("Tabular Data") 
    .Range("A1", .Cells(lastRow, "C")).Copy 
End If 
+0

mögen, das ist wahr, aber die PO eine Erklärung geben, warum, warum er alle seine 'Cells' qualifizieren sollte und' Range' mit dem 'Worksheet' Objekt usw. –

+0

Zellen (lastRow, "C") ist keine Zelle von WorkBk.Worksheets ("Tabular Data"). es ist die Zelle des aktiven Blattes. Es ist ein Fehler aufgetreten. Es sollte in WorkBk.Worksheets ("Tabular Data") konvertiert werden. Cells (lastRow, "C"). Verwenden Sie With-Anweisung, um dies einfach zu machen. –

Verwandte Themen