2017-03-08 392 views
0

我想從某些工作簿(單元格列「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

回答

0

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 +)輸出任何東西在當前執行上下文。使用工具窗口當地人可視化當前範圍有權訪問的所有內容。

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 
相關問題