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 

你能帮我吗?

谢谢, 伊万

+1

'Z'已经是一个工作簿,不需要工作簿包装: –

+2

所以说:'Z.SaveAs文件名:=“PROVA.xlsx”' –

+0

请花一分钟取[旅游]) – R3uK

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