[英]VBA - Copy a sheet to another workbook
我想將工作表(sheet2)從某些工作簿(單元格列“ B”中的路徑)復制到另一個工作簿(模板)。
我嘗試了以下操作,但是Excel向我返回了以下錯誤“運行時錯誤'1004':應用程序定義的錯誤或對象定義的錯誤”。
Private Sub SplitFile_Click()
Dim C As Integer
Dim x As Variant
Dim Z As Workbook
For C = 0 To 10
Set x = ThisWorkbook.Sheets("SelectedFiles").Range("B" & C)
Worlbooks.Open("x").Sheets(Sheet2).Range("A1:U1000").Copy
Set Z = Workbooks.Open("D:\PTP\MASTERDATA\SPACCHETTAMENTO FILE\TEMPLATE.Template.xlsx")
Z.Sheets("SPLIT TAB").Range("A1:U1000").PasteSpecial
Workbooks("Z").SaveAs Filename:="PROVA.xlsx"
Next C
End Sub
你能幫助我嗎?
謝謝,伊萬
VBA在這條線上很火爆:
Set x = ThisWorkbook.Sheets("SelectedFiles").Range("B" & C)
由於C
值為0,並且0不是有效的行號B0
不是有效的范圍地址。 因此,您可以從C = 1
開始,這樣可以解決此錯誤。
強烈建議在引用行號時使用Long
整數(32位)而不是Integer
(16位)(無論您需要哪幾行)。 一個Integer
的最大值是32,767,並且一個工作表可以具有更多的行。
x
被聲明為Variant
。 這意味着它幾乎可以成為您所做的任何事情。
如果您這樣做:
x = ThisWorkbook.Sheets("SelectedFiles").Range("B" & C)
然后x
將包含Range
調用所引用的單元格的值。
但是您這樣做:
Set x = ThisWorkbook.Sheets("SelectedFiles").Range("B" & C)
這指示VBA x
應該包含一個對象引用 ,因此,您無需獲取單元格的值 ,而是獲取單元格本身 。
然后您執行以下操作:
Worlbooks.Open("x").Sheets(Sheet2).Range("A1:U1000").Copy
如果編譯成功,這僅是因為未指定Option Explicit
。 Worlbooks
不存在任何地方,這是一個錯字-但由於Option Explicit
沒有指定,VBA允許您使用的變量沒有聲明,並很爽快編譯Worlbooks
並按照其分辨率運行時......此時另一錯誤會彈出。
這將解決它:
Workbooks.Open("x").Sheets(Sheet2).Range("A1:U1000").Copy
除了……它在循環內:在該循環的每次迭代中,您都嘗試打開一個名為"x"
的工作簿(該工作簿很可能不存在)。 如果"x"
意味着要包含在ThisWorkbook.Sheets("SelectedFiles").Range("B" & C)
,那么x
應該被聲明為String
變量,您可以這樣引用它:
Dim source As Workbook
Set source = Workbooks.Open(x)
而且您可以在循環外部進行操作 ,這樣就不必在每次循環進行迭代時都嘗試打開同一工作簿:IIRC打開已經打開的工作簿會引發另一個運行時錯誤。
如果每個迭代都應使用不同的工作簿/文件,則每個迭代也應關閉該工作簿,否則最終將打開12個工作簿,其中11個不再需要。
因此,您保留對要使用的工作簿對象的引用:
For C = 1 To 11
x = ThisWorkbook.Sheets("SelectedFiles").Range("B" & C).Value
Set source = Worlbooks.Open(x)
source.Sheets(Sheet2).Range("A1:U1000").Copy
'...
source.Close
Next
與目的地書相同:
Set Z = Workbooks.Open("D:\PTP\MASTERDATA\SPACCHETTAMENTO FILE\TEMPLATE.Template.xlsx")
您將打開同一文件11次,而不是關閉一次。 然后從源書粘貼到目標書中...
Z.Sheets("SPLIT TAB").Range("A1:U1000").PasteSpecial
...每次都覆蓋上一次迭代的工作,並節省11次。
因此,該代碼中存在很多嚴重的問題。 概括:
Option Explicit
。 學習使用調試器。 F9設置一個斷點,該斷點停止執行; 從那時起,您可以使用F8一次運行一條指令,並且可以使用即時窗格 ( Ctrl + G )在當前執行上下文中輸出任何內容。 使用本地工具窗口可可視化當前范圍可以訪問的所有內容。
您不需要在Workbook之間復制和粘貼數據,因為它會運行得更慢。 這里有一些示例代碼,希望它能對您有所幫助。
Option Explicit
Public Sub SplitFile_Click()
Dim C As Integer
Dim x As Range
Dim Z As Workbook
For C = 1 To 10
Set x = ThisWorkbook.Sheets("SelectedFiles").Range("B" & C)
Set Z = Workbooks.Open("D:\Template.xlsx")
Z.Sheets("SPLIT TAB").Range("A1") = x 'this code is faster that copy & paste
Z.SaveAs "PROVA" & C & ".xlsx" 'workbook should have a unique filename
Z.Close 'close workbook
Next C
End Sub
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.