在 VBA 中处理工作表时指定工作簿
Specify the workbook when working on a worksheet in VBA
我想获取单元格的值。我有多个工作簿,其中一些工作簿有 sheet 个同名。
例如,test.xlsx
和 test2.xlsx
都有一个名为 sheet1.xlsx
的 sheet
因此,在处理 sheet 时,我想指定工作簿。我一直使用 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
的 sheet
当您打开工作簿时,Open
方法会为您提供 Workbook
对象引用 - 保留它而不是丢弃它:
Dim wb As Workbook
Set wb = Workbooks.Open(path)
这样您就永远不需要查询 Workbooks
集合并提供硬编码文件名来获取您的工作簿。
接下来,Worksheet
参考:
Set sh1 = Worksheets("Sheet1")
Worksheets
集合是属于 Workbook
对象的 属性。事实上,这还不够 "specific":如果你不 限定 调用 属性,那么你就是在隐含地引用 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
.
I use wb.sh.expression all the time
如果您的代码曾经有效,我保证您不会。
我想获取单元格的值。我有多个工作簿,其中一些工作簿有 sheet 个同名。
例如,test.xlsx
和 test2.xlsx
都有一个名为 sheet1.xlsx
因此,在处理 sheet 时,我想指定工作簿。我一直使用 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
当您打开工作簿时,Open
方法会为您提供 Workbook
对象引用 - 保留它而不是丢弃它:
Dim wb As Workbook
Set wb = Workbooks.Open(path)
这样您就永远不需要查询 Workbooks
集合并提供硬编码文件名来获取您的工作簿。
接下来,Worksheet
参考:
Set sh1 = Worksheets("Sheet1")
Worksheets
集合是属于 Workbook
对象的 属性。事实上,这还不够 "specific":如果你不 限定 调用 属性,那么你就是在隐含地引用 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
.
I use wb.sh.expression all the time
如果您的代码曾经有效,我保证您不会。