多个工作簿打开时如何在特定工作簿中引用正确的工作表?

时间:2017-08-10 02:42:02

标签: excel vba excel-vba

Sub debug_tester()

    Dim A As Workbook
    Set A = Workbooks.Open("D:\a.xlsm")

    Dim B As Workbook
    Set B = Workbooks.Open("D:\b.xlsm")

    A.Sheets("sheet1_in_test").range("A1").Value = "test" 'pop out "subscript out of range" on this line

End Sub

A中存在“sheet1_in_test”。如果我将其更改为数字(即表(1)),则B更改为。

编辑: 纠正错别字。工作簿A有一个名为“sheet1_in_test”的工作表。工作簿B有一个名为“sheet1”的工作表。

编辑: 谢谢 sancho.s !似乎Workbook.Open无法在子工作簿上找到工作簿。使用Set A = ThisWorkbook似乎也很有用。我想知道为什么会这样。

2 个答案:

答案 0 :(得分:1)

sub位于单独的工作簿中,按预期执行

Sub open_test()
    Dim wb1 As Workbook
    Dim wb2 As Workbook
    Set wb1 = Workbooks.Open("C:\Users\user1\Documents\a.xlsx")
    Set wb2 = Workbooks.Open("C:\Users\user1\Documents\b.xlsx")    
    wb1.Sheets("Hoja1").Range("A1").Value = "test"
    wb2.Sheets(1).Range("A1").Value = "test2"
End Sub

尝试复制这个。

答案 1 :(得分:-3)

使用Workbooks.Open()使打开的工作簿成为活动工作簿。这就是使用工作表(1)进入工作簿B的原因。它是最后打开的工作簿,因此是活动工作簿。使用Workbook.Activate使A成为活动工作簿。

Sub debug_tester()

    Dim A As Workbook
    Set A = Workbooks.Open("D:\a.xlsm")

    Dim B As Workbook
    Set B = Workbooks.Open("D:\b.xlsm")

    A.Activate
    A.Sheets("sheet1_in_test").range("A1").Value = "test" 

End Sub

如果你仍然得到"下标超出范围"消息," sheet1_in_test"工作表不在A工作簿中。检查代码和工作表名称之间的拼写。这假设您正在运行第3个工作簿中的代码。

如果从工作簿A运行此代码,Excel将关闭A的打开实例并重新打开它,但代码不会运行。在这种情况下,您可以使用

Set A = ThisWorkbook

或者如果代码在工作簿B中使用

Set B = ThisWorkbook