使用单元格引用(VBA)复制/粘贴数据

时间:2016-05-04 15:57:24

标签: excel vba excel-vba copy-paste

我试图将数据从一个文件复制到另一个文件中。首先,我想找到源文件中的最后一行/列,并使用该信息来复制数据。但是,我似乎无法使用对最后一行和列的引用来复制/粘贴代码。这就是我目前所拥有的:

Dim G7_Tab_Name As String
   G7_Tab_Name = "G7"
Dim wkbDest As Workbook
   Set wkbDest = ActiveWorkbook
Dim SheetToCopy As Worksheet

LastInputRow = wkbSource.Sheets(1).Cells(Cells.Rows.Count, "A").End(xlUp).Row
LastInputColumn = wkbSource.Sheets(1).Cells(1, Columns.Count).End(xlToLeft).Column
Set SheetToCopy = wkbSource.Sheets(1)
CopyRange = Range(SheetToCopy.Cells(LastInputRow, 1), SheetToCopy.Cells(1, LastInputColumn))

'Check if any existing data
If Len(wkbDest.Sheets(G7_Tab_Name).Range("A1").Value) > 0 Then
    wkbDest.Sheets(G7_Tab_Name).UsedRange.ClearContents
    CopyRange.Copy _
    Destination:=Range(wkbDest.Sheets(G7_Tab_Name).Cells(LastInputRow, 1), Cells(1, LastInputColumn))
    Else
       CopyRange.Copy _
       Destination:=Range(wkbDest.Sheets(G7_Tab_Name).Cells(LastInputRow, 1), Cells(1, LastInputColumn))
End If

我很确定我没有在我的CopyRange定义中捕获正确的范围,但我不知道为什么。在这种情况下,lastRow=27lastColumn=13。所以,我认为范围定义为"A1:M27"

我定义这些范围是因为我需要循环遍历多个文件并从每个文件的第一张中复制数据。此代码将包含在一个更大的For循环中以命中每个文件(一旦我可以将其复制/粘贴!)

1 个答案:

答案 0 :(得分:1)

每当您使用Cells()Range()Columns()Rows()等时,请确保让VBA知道您希望使用的工作表, 否则,它将使用ActiveSheet,这可能会导致错误。你在某些地方这样做了,但没有其他地方。下面我已经完成了使用With语句的混合 为那些名字很长的床单让生活更轻松。阅读下面的内容,看看你是否能看到我做了什么。如果您有任何问题,请告诉我们!

Sub t()

Dim G7_Tab_Name As String
G7_Tab_Name = "G7"
Dim wkbDest As Workbook
Set wkbDest = ActiveWorkbook
Dim SheetToCopy As Worksheet
Set SheetToCopy = wkbSource.Sheets(1)

With sheetToCopy
    LastInputRow = .Cells(.Cells.Rows.Count, "A").End(xlUp).Row
    LastInputColumn = .Cells(1, .Columns.Count).End(xlToLeft).Column
End With

CopyRange = SheetToCopy.Range(SheetToCopy.Cells(LastInputRow, 1), SheetToCopy.Cells(1, LastInputColumn))

'Check if any existing data
Dim destWS  As Worksheet
If Len(wkbDest.Sheets(G7_Tab_Name).Range("A1").Value) > 0 Then
    wkbDest.Sheets(G7_Tab_Name).UsedRange.ClearContents
    Set destWS = wkbDest.Sheets(G7_Tab_Name)
    CopyRange.Copy Destination:=destWS.Range(destWS.Cells(LastInputRow, 1), destWS.Cells(1, LastInputColumn))
Else
    CopyRange.Copy Destination:=destWS.Range(destWS.Cells(LastInputRow, 1), destWS.Cells(1, LastInputColumn))
End If

End Sub

你是在地方做到的,但不是到处都是。 I.E:
LastInputRow = wkbSource.Sheets(1).Cells(Cells.Rows.Count, "A").End(xlUp).Row

您正确告诉第一个 Cells()要使用哪个工作表,但VBA不会“记住”任何内容,因此下一个Cells.Rows.Count将位于活动工作表上,不一定是您的wkbSource.Sheets(1)表。将该行更改为

LastInputRow = wkbSource.Sheets(1).Cells(wkbSource.Sheets(1).Cells.Rows.Count, "A").End(xlUp).Row

(注意:这可能无法解决您的问题,但它绝对有助于收紧代码并为减少错误留出空间)。

修改:尝试将CopyRange替换为:

With sheetToCopy
copyRange = .Range(.Cells(1, 1), .Cells(LastInputRow, LastInputColumn))
End With

这将产生从A1到最后一列中最后一行的范围。

Edit2:你发布的代码CopyRange的代码并不清楚,但你应该这样做:

Dim CopyRange as Range
Set CopyRange = .Range(.Cells(1, 1), .Cells(LastInputRow, LastInputColumn))