VBA工作表自动化错误

时间:2015-07-20 08:43:42

标签: vba excel-vba excel

我在例行程序的开头有以下代码:

Background Fetch

在第二个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) ... 块之前,当我收到自动化错误时,一切似乎都很好:

  

运行时错误' -2147221080(800401a8)':

     

自动化错误

每个文件都是带有单个工作表的CSV文件。如果我在设置它们时查看本地窗口,它们会显示为With。我将表单移至Worksheet/Sheet1后,我注意到类型更改为ThisWorkbook,我无法再引用Worksheet/Worksheetws1或{{1}使用各自的变量。变量在本地窗口中显示为工作表对象,并且似乎设置为对象,但是当我展开变量的节点时,它只是表示ws2

我以前在VBA中没有看到这种行为,所以任何解释或建议都会受到高度赞赏。

提前致谢。

1 个答案:

答案 0 :(得分: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)