簡體   English   中英

使用單元格引用復制/粘貼數據 (VBA)

[英]Copy/Paste Data with Cell References (VBA)

我正在嘗試將數據從一個文件復制到另一個文件中。 首先,我想找到源文件中的最后一行/列並使用該信息來復制數據。 但是,我似乎無法使用對所使用的最后一行和列的引用來復制/粘貼代碼。 這是我目前擁有的:

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 循環中以命中每個文件(一旦我可以復制/粘貼它!)

每當您使用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

你在一些地方這樣做了,但不是到處都這樣做。 IE:
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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM