VBA - 将工作表复制到另一个工作簿
我想从某些工作簿(单元格列“B”中的路径)复制工作表(工作表2)到另一个工作簿(模板)。VBA - 将工作表复制到另一个工作簿
我试过下面的一个,但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
开始,那会修复这个错误。
当引用行号(无论您需要哪个行)时,我强烈建议使用整数(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 +摹)输出任何东西在当前执行上下文。使用工具窗口当地人可视化当前范围有权访问的所有内容。
您不需要在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
'Z'已经是一个工作簿,不需要工作簿包装: –
所以说:'Z.SaveAs文件名:=“PROVA.xlsx”' –
请花一分钟取[旅游]) – R3uK