【问题标题】:VBA Copy data from a file and Paste it at the end of another fileVBA 从文件复制数据并将其粘贴到另一个文件的末尾
【发布时间】:2025-11-27 17:45:01
【问题描述】:

我有这个宏文件(“graphPrint.xls”),它通过复制并粘贴到宏文件中从文件中读取数据,该文件使用粘贴的数据生成图形。 现在,我需要修改这个宏,使它可以从 4 个文件中读取数据,并将宏文件中的所有数据组合在一起,并生成一个包含所有数据的图表。

我想做的是

  1. 打开要从中读取数据的文件,
  2. 复制文件中的数据,
  3. 粘贴到宏文件中,
  4. 关闭文件。我想在 for 循环中重复这个过程。

这里的问题在(3)处,当我把读取的数据粘贴到宏文件中时,我必须确保每次都粘贴在数据的末尾,这样就不会替换之前的数据。

假设文件名是file0.csv 直到file3.csv。 我有这个宏:

Dim readFile As String;
For i = 0 To 3
    readFile = "file" + CStr(i) + ".csv"  'get file name
    WorkbooksOpen Filename:= readFile     'open file
    ActiveSheet.Cells.Select   'select all data from the file
    lastRow = Range("A1").End(xlDown).Row    'edited
    Selection.Copy             'copy all
    Windows("graphPrint.xls").Activate   'open macro file

    ActiveSheet.Paste                   'paste here in macro file        

    Application.CutCopyMode = False    'cancel the copy mode
    Windows(readFile).Activate   
    ActiveWindow.Close            'close this file
Next i

但是,此宏每次粘贴时都会用新数据替换旧数据,因此,显示的图表将仅使用最后读取的文件中的数据。文件列从“A1”到“Z1”,所以我改变了

 ActiveSheet.Paste

 Range(Range("A1:Z1" & lastRow), ActiveCell.End(xlDown)).Offset(1,0).PasteSpecial

,希望它每次都能将其粘贴到宏文件的末尾,这样我就可以将所有数据反映到图表中。然而,这给了

“对象'_Worksheet'的方法'范围'失败”

错误。

有人可以指导我解决问题吗?谢谢。

【问题讨论】:

  • 您的lastrow 是否在某处定义?
  • 是的,我在上面的代码中跳过了那行。我编辑了它。我仍然遇到同样的错误。我刚刚意识到,每次 lastRow 得到 65536...
  • 好的。那么,如果您有最后一行数据,为什么不以简单的方式使用它呢? ;) Range("A" & lastrow) 为您提供 A 列中的最后一个单元格。再次检查您在 Range("A1:Z1" & lastRow) 中的操作。

标签: vba excel copy-paste


【解决方案1】:

尝试下面的代码,使用Find 函数从“A:Z”列中获取LastRow

Dim readFile As String
Dim LastCell As Range
Dim LastRow As Long

For i = 0 To 3
    readFile = "file" + CStr(i) + ".csv"  'get file name
    Workbooks.Open Filename:=readFile ' open file

   ' get last row in columns "A:Z" using the Find method
    Set LastCell = ActiveSheet.Range("A:Z").Find(What:="*", After:=Cells(1), Lookat:=xlPart, LookIn:=xlFormulas, _
                        SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False)

    If Not LastCell Is Nothing Then
        LastRow = LastCell.Row ' get last Row with data
    End If

    ' Copy >> Paste in 1 line
    Range("A1:Z" & LastRow).Copy Destination:=Workbooks("graphPrint.xls").ActiveSheet.Range("A1")

    Application.CutCopyMode = False    'cancel the copy mode
    Windows(readFile).Activate
    ActiveWindow.Close            'close this file
Next i

【讨论】:

  • @Wang Dang 你试过我的答案和代码了吗?有什么反馈吗?