2015-07-20 106 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_,因此该变量仍应保持功能。 –