我想将某些工作簿(单元格列“B”中的路径)中的工作表(sheet2)复制到另一个工作簿(模板)。
我尝试了以下一个但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
你能帮助我吗?
谢谢, 伊万
答案 0 :(得分:0)
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
应包含对象引用,因此您不会为其分配单元格的值,而是<获取< em>细胞本身。
然后你这样做:
Worlbooks.Open("x").Sheets(Sheet2).Range("A1:U1000").Copy
如果这是编译,那只是因为Option Explicit
未指定。 Worlbooks
在任何地方都不存在,这是一个错字 - 但由于Option Explicit
未被指定,VBA允许您在不声明变量的情况下使用变量,因此很乐意编译{{} 1}}并将其分辨率推迟到运行时间......此时会弹出另一个错误。
这会解决它:
Worlbooks
除了......它在循环内部:在该循环的每次迭代中,您尝试打开名为Workbooks.Open("x").Sheets(Sheet2).Range("A1:U1000").Copy
的工作簿(很可能不存在)。如果"x"
表示"x"
中包含的文件名,则ThisWorkbook.Sheets("SelectedFiles").Range("B" & C)
应声明为x
变量,您可以这样引用它:
String
你会在循环之外做,这样你就不会在每次循环迭代时尝试打开同一个工作簿:IIRC打开一个工作簿已经打开将引发另一个运行时错误。
如果每次迭代都应该使用不同的工作簿/文件,那么每次迭代也应关闭该工作簿,否则最终会打开12个工作簿,其中11个不再需要。
因此,您要保留对要使用的工作簿对象的引用:
Dim source As Workbook
Set source = Workbooks.Open(x)
与目的地一书相同:
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
您打开相同的文件11次,而不是关闭一次。然后从源书籍粘贴到目的地书中......
Set Z = Workbooks.Open("D:\PTP\MASTERDATA\SPACCHETTAMENTO FILE\TEMPLATE.Template.xlsx")
...每次都覆盖上一次迭代的工作,并保存11次。
因此,该代码中存在很多严重问题。回顾一下:
Z.Sheets("SPLIT TAB").Range("A1:U1000").PasteSpecial
。学习使用调试器。 F9 设置断点,停止执行;从那时起,您可以使用 F8 一次运行一个指令代码,并且可以使用立即窗格( Ctrl + < kbd> G )在当前执行上下文中输出任何内容。使用 locals 工具窗口可视化当前作用域可访问的所有内容。
答案 1 :(得分:0)
您不需要在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