簡體   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-2024 STACKOOM.COM