VBA - 将工作表复制到另一个工作簿

时间:2017-03-08 14:33:18

标签: excel vba excel-vba

我想将某些工作簿(单元格列“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

你能帮助我吗?

谢谢, 伊万

2 个答案:

答案 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