【问题标题】:copy range in vba throws runtime error 1004vba 中的复制范围引发运行时错误 1004
【发布时间】:2026-01-15 07:40:01
【问题描述】:

我编写了一个宏,将源 Excel 工作簿中的前 3 列附加到摘要表中。

代码从源工作簿的“表格数据”选项卡中复制前 3 列中的非空单元格,以名称“Log*.xls”开头,并将其附加到摘要表中的列。摘要中的所有数据表格是水平附加的。

如果我的源 xls 中有 100 行数据(以名称“Log*”开头),现在代码可以正常工作

但是,每当“L​​og*.xsl”文件跨越数千个时,我在从源文件处理数据时就会收到运行时错误。

行错误:

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

宏如下:

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

请任何人帮助我解决我的问题的原因和解决方案?

提前致谢。

【问题讨论】:

    标签: excel runtime-error vba


    【解决方案1】:

    你的代码变成了这样

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

    【讨论】:

    • 确实如此,但是请给 PO 一些解释为什么,为什么他应该用 Worksheet 对象等来限定他的所有 CellsRange 等等。
    • Cells(lastRow, "C") 不是 WorkBk.Worksheets("Tabular Data") 的单元格。它是 activesheet 的单元格。发生错误。它应该转换为 WorkBk.Worksheets("Tabular Data").Cells(lastRow, "C") 。使用 With 语句使这变得简单。
    • 太糟糕了,没有任何解释,所以这个答案对其他人没有用