[英]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.