vba excel sheets.range.value错误

vba excel sheets.range.value错误,vba,excel,Vba,Excel,所以,有时当我试图执行这个命令时,它会给我一个错误。问题是它非常不一致。在某些情况下,它是有效的,而在其他情况下,它就是不起作用 这是getCellVal函数的一行。cellName是字符串,s是整数 getCellVal = Sheets(s).Range(cellName).Value 这次它给了我: 运行时错误“438”: 对象不支持此属性或方法 这条生产线实际上在不久前还没出问题。我添加了一些其他使用它的函数,现在它不再工作了 想知道为什么吗?对工作表集合的非限定调用隐式引用当前活动的

所以,有时当我试图执行这个命令时,它会给我一个错误。问题是它非常不一致。在某些情况下,它是有效的,而在其他情况下,它就是不起作用

这是getCellVal函数的一行。cellName是字符串,s是整数

getCellVal = Sheets(s).Range(cellName).Value
这次它给了我: 运行时错误“438”: 对象不支持此属性或方法

这条生产线实际上在不久前还没出问题。我添加了一些其他使用它的函数,现在它不再工作了


想知道为什么吗?

工作表
集合的非限定调用隐式引用当前活动的任何工作簿,重要的是要知道集合包含
工作表
对象,…但也包含
图表
对象

由于您打算使用
工作表
,请改用
工作表
集合

如果您没有得到“索引越界”错误,那么您请求的工作表确实存在。但错误438指向该工作表不是
工作表
(因此没有
范围
成员)

我打赌活动工作簿在索引
s
处有一张图表

解决方案就是要明确

如果要使用包含正在运行的代码的工作簿,请使用
thiswoolk
限定
workbook
成员调用:

getCellVal = ThisWorkbook.Worksheets(s).Range(cellName).Value
如果要使用工作簿,则需要在打开工作簿时获得工作簿对象的所有权:

Dim wb As Workbook
Set wb = Application.Workbooks.Open(path)
'...
getCellVal = wb.Worksheets(s).Range(cellName).Value

如果
cellName
是具有工作簿作用域的
命名范围
,则从右侧删除
工作表。
。@RonRosenfeld unqualified
范围
调用隐式引用活动工作表(除非您在工作表的代码后面)-这实际上会使事情变得更糟;-)@如果它是一个带有工作簿范围的
定义名称
,我就不会这么自鸣得意了,这就是我写的。@RonRosenfeld Fine。但那将是错误1004,而不是438。FWIW访问定义的名称时,应通过工作簿范围名称的
工作簿.names
集合,以及工作表范围名称的
工作表.names
集合<代码>范围的行为已中断且不直观。