2015-07-20 107 views
1

我有一個程序開始下面的代碼:VBA工作表自動化錯誤

Dim ws1 As Worksheet 
Dim ws2 As Worksheet 
Dim ws3 As Worksheet 

Set ws1 = Workbooks.Open(ThisWorkbook.Sheets(1).[b4]).Sheets(1) 
Set ws2 = Workbooks.Open(ThisWorkbook.Sheets(1).[b6]).Sheets(1) 
Set ws3 = Workbooks.Open(ThisWorkbook.Sheets(1).[b8]).Sheets(1) 

ws1.Move after:=ThisWorkbook.Sheets("MAIN") 
ws2.Move after:=ThisWorkbook.Sheets("MAIN") 
ws3.Move after:=ThisWorkbook.Sheets("MAIN") 

'// remove redundant data 
With ws1 
    With .Range("A2:A" & .Cells(.Rows.Count, 1).End(xlUp).Row) 
    ... 

似乎一切都很好,直到第二With塊,當我得到一個自動化錯誤:

Run-time error '-2147221080 (800401a8)':

Automation Error

每的文件是帶有單張紙的CSV文件,如果我在當地人窗口中查看它們,他們會按照我的預期顯示爲Worksheet/Sheet1。然而,一旦我將表單移動到ThisWorkbook,我注意到類型更改爲Worksheet/Worksheet,我不再使用各自的變量引用ws1,ws2ws3。這些變量在本地窗口中顯示爲工作表對象,並且似乎設置爲一個對象,但是當我展開該變量的節點時,它僅表示<No Variables>

我還沒有在VBA中見過這種行爲,所以任何解釋或建議將不勝感激。

在此先感謝。

+0

是不是傻的東西像WS1不受關注? – 99moorem

+0

@ 99moorem不應該有所作爲,因爲我指的是在內存中設置的對象,但仍然無法工作 - 它似乎在保持指向對象的指針,而不是它的任何屬性或方法。非常奇怪... –

+0

你可以在出現錯誤後立即在窗口中輸入(「A2:A」&.Cells(.Rows.Count,1).End(xlUp).Row).address嗎?例如你可以手動重現嗎? – 99moorem

回答

2

問題是,當您從1工作簿移動工作表時,它將關閉工作簿。需要參考當前工作簿中的工作表,而不是打開的工作簿中的工作表。類似於下面的代碼將起作用。

Sub tt() 
Dim ws1 As Worksheet 

Set ws1 = Workbooks.Open(ThisWorkbook.Sheets(1).[b1]).Sheets(1) 
ws1_Name = ws1.Name 

ws1.Move after:=ThisWorkbook.Sheets(1) 

'// remove redundant data 
With ThisWorkbook.Sheets(ws1_Name) 
    With .Range("A2:A" & .Cells(.Rows.Count, 1).End(xlUp).Row) 

    End With 
End With 
End Sub 

您也可以重置WS1到正確的紙張

Set ws1 = ThisWorkBook.Sheets(ws1_Name) 
+0

我會投票,因爲這是我得出的結論,但我仍然很想知道_why_這是怎麼回事。 –

+1

你在問爲什麼表格正在關閉,ws1正在丟失其參考文件,或者爲什麼ws1在移動時不保持與同一張表單鏈接? – 99moorem

+0

爲什麼它不保持鏈接 - 如果你設置了一個對象,它應該設置對該對象的特定實例的引用。從一個工作簿移動到另一個工作簿不會更改_instance_,因此該變量仍應保持功能。 –