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

Specify the workbook when working on a worksheet in VBA

我想获取单元格的值。我有多个工作簿,其中一些工作簿有 sheet 个同名。

例如,test.xlsxtest2.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

如果您的代码曾经有效,我保证您不会。