在VBA中处理工作表时指定工作簿

时间:2017-09-19 15:16:57

标签: excel vba excel-vba object worksheet

我想得到细胞的价值。我有多个工作簿,有些工作簿具有相同名称的工作表。

例如,test.xlsxtest2.xlsx都有一张名为sheet1.xlsx

的工作表

因此,在处理工作表时,我想指定工作簿。我一直使用wb.sh.*expression*,我很惊讶这不起作用。

我在概念上错过了什么?

代码:

set wb1 = Workbooks("Test1.xlsx")
Set sh1 = Worksheets("Sheet1")
Debug.Print wb1.sh1.Range("A1").Value

可行的代码,但不够具体:

set wb1 = Workbooks("Test1.xlsx")
Set sh1 = Worksheets("Sheet1")
Debug.Print sh1.Range("A1").Value

注意:Test1.xlsx有一张名为Sheet1

的工作表

1 个答案:

答案 0 :(得分:0)

当您打开工作簿时,Open方法会为您提供Workbook对象引用 - 保留它而不是丢弃它:

Dim wb As Workbook
Set wb = Workbooks.Open(path)

这样您就不需要查询Workbooks集合并提供硬编码的文件名来获取工作簿。

接下来,Worksheet参考:

Set sh1 = Worksheets("Sheet1")

Worksheets集合是属于Workbook对象的属性。实际上,这不够“具体”:如果你没有限定财产电话,那么你隐含地指的是ActiveWorkbook - 这可能是也可能不是你需要的工作簿正在使用。

这就是wb引用发挥作用的地方:

Set sh1 = wb.Worksheets("Sheet1")

最后,你在这里有什么:

Debug.Print wb1.sh1.Range("A1").Value

不仅非法,而且过度杀伤:sh1 已经知道它所属的Workbook对象 - 您可以通过sh1.Parent获取该对象引用并进行比较它到wb参考:

Debug.Assert sh1.Parent Is wb

sh1是一个局部变量,不是Workbook界面的成员:这就是为什么你不能wb1.sh1

  

我一直使用wb.sh.expression

如果你的代码有效,我保证你没有。