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

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”。如果将其更改为数字(例如,sheet(1)),则B将被更改。

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

编辑:谢谢sancho.s ! 看起来像Workbook.Open不能引用工作簿时,位于它的子。 使用Set A = ThisWorkbook似乎也适用。 我想知道为什么。

这个位于一个单独的工作簿,按预期执行

 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 

尝试重现这一点。

使用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工作簿中。 检查代码和工作表名称之间的拼写。 这假定您正在运行第三个工作簿中的代码。

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

 Set A = ThisWorkbook 

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

 Set B = ThisWorkbook