繁体   English   中英

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

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

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM