我想得到细胞的价值。我有多个工作簿,有些工作簿具有相同名称的工作表。
例如,test.xlsx
和test2.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
答案 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
如果你的代码有效,我保证你没有。