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 +摹)輸出任何東西在當前執行上下文。使用工具窗口當地人可視化當前範圍有權訪問的所有內容。
'Z'已經是一個工作簿,不需要工作簿包裝: –
所以說:'Z.SaveAs文件名:=「PROVA.xlsx」' –
請花一分鐘取[旅遊]) – R3uK