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

在VBA中处理工作表时指定工作簿,vba,excel,object,worksheet,Vba,Excel,Object,Worksheet,我想得到单元格的值。我有多个工作簿,有些工作簿有同名的工作表 例如,test.xlsx和test2.xlsx都有一个名为sheet1.xlsx 因此,在处理工作表时,我希望指定工作簿。我一直在使用wb.sh.*表达式*,我很惊讶这不起作用 我在概念上遗漏了什么 代码: 可以工作但不够具体的代码: set wb1 = Workbooks("Test1.xlsx") Set sh1 = Worksheets("Sheet1") Debug.Print sh1.Range("A1").Value 注

我想得到单元格的值。我有多个工作簿,有些工作簿有同名的工作表

例如,
test.xlsx
test2.xlsx
都有一个名为
sheet1.xlsx

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

我在概念上遗漏了什么

代码:

可以工作但不够具体的代码:

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

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

的工作表打开工作簿时,
open
方法为您提供了
工作簿
对象引用-保留它,而不是丢弃它:

Dim wb As Workbook
Set wb = Workbooks.Open(path)
这样,您就不需要查询
工作簿
集合并提供硬编码文件名来获取工作簿

接下来是
工作表
参考:

Set sh1 = Worksheets("Sheet1")
Debug.Assert sh1.Parent Is wb
工作表
集合是属于
工作簿
对象的属性。事实上,这还不够“具体”:如果您没有限定属性调用,那么您就隐式地引用了
ActiveWorkbook
——它可能是您需要使用的工作簿,也可能不是

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

Set sh1 = wb.Worksheets("Sheet1")
最后,这里有:

Debug.Print wb1.sh1.Range("A1").Value
它不仅是非法的,而且是滥杀:
sh1
已经知道它所属的
工作簿
对象-您可以通过
sh1.Parent
获取该对象引用,并将其与
wb
引用进行比较:

Set sh1 = Worksheets("Sheet1")
Debug.Assert sh1.Parent Is wb
sh1
是一个局部变量,不是
工作簿
界面的成员:这就是为什么不能执行
wb1.sh1

我一直使用wb.sh.expression


如果你的代码曾经工作过,我保证你不会。什么不工作?另外,当设置
sh1
s时,您可以执行
Set sh1=wb1.工作表(“Sheet1”)
…这样您就不必每次都包含工作簿名称。这是不起作用的:
wb1.sh1…
您不能嵌套这样声明的对象。它需要是
wb1.Sheets(“Sheet1”)…
,或者只是
sh1…
。如果要为
sh1
变量指定工作簿,请在设置行中执行该操作:
Set sh1=wb1.Sheets(“Sheet1”)
,然后可以通过查看它的.Parent.Name属性来检查它是哪个工作簿的一部分:
Debug.Print sh1.Parent.Name
如何打开工作簿?看起来您正在丢弃由
工作簿返回的
工作簿
对象引用。请打开
,在下面的某个位置。谢谢,这对我帮助很大。