不应该';Excel是否支持将工作表单元格范围引用传递给函数?

不应该';Excel是否支持将工作表单元格范围引用传递给函数?,excel,vba,Excel,Vba,您可能会这么想,但这失败了,出现了1004错误 Rem This macro is running on sheet2 Dim avg As double Names.Add Name:="sheet1Avg", RefersTo:="sheet1!$C$2:$C$24" avg = Application.WorksheetFunction.Average(range("sheet1Avg")) 这也是: avg = Application.WorksheetFunction.Avera

您可能会这么想,但这失败了,出现了1004错误

Rem This macro is running on sheet2

Dim avg As double

Names.Add Name:="sheet1Avg", RefersTo:="sheet1!$C$2:$C$24"
avg = Application.WorksheetFunction.Average(range("sheet1Avg"))
这也是:

avg = Application.WorksheetFunction.Average(range("sheet1!$C$2:$C$24))
每次我想使用数学函数时,我都不愿意将
C2:C24
复制到活动工作表中


有什么想法吗?

我怀疑您是否真的需要这种扭曲的逻辑,但如果您真的需要,请修复您的
参考:

Names.Add Name:="sheet1Avg", RefersTo:="=sheet1!$C$2:$C$24"
并更改引用已创建范围的方式-不能使用
range
解除对其的引用,因为它应该在其父工作表上返回范围,而不是在任何其他工作表上:

avg = Application.WorksheetFunction.Average(Names("sheet1Avg").RefersToRange)


否则,将范围引用存储在
range
类型的局部变量中,并且仅在运行时不需要定义命名范围时才使用命名范围。

GSerg已经对此进行了很好的解释,所以接受他的回答。
下面是使用
Evaluate
函数获取平均值的另一种方法。

avg = Evaluate("AVERAGE(" & Split(Names(1).RefersTo, "=")(1) & ")")
如果您按照GSerg所指出的正确创建了
名称
(在前面添加
=
您的地址),那么它将按照您的预期工作,返回您指定的地址的平均值

另一种方法是显式地指定名称。在工作簿中设置范围,而不是在Sheet2中设置范围。比如:

ThisWorkbook.Names.Add Name:="sheet1Avg2", RefersTo:="=Sheet1!$C$2:$C$24"
然后您需要像这样显式地调用它:

avg = Application.WorksheetFunction.Average(Sheet1.Range("sheet1Avg2"))

其中Sheet1是工作表代码名。嗯,别把你搞糊涂了。

这很有魅力。非常感谢。不过,我觉得令人震惊的是,像将可寻址工作表上的单元格范围传递给函数这样简单而平常的事情需要如此多的Excel专业知识才能完成——事实上,在这种情况下,需要在stackoverflow上召开全球电话会议来确定调用参数的语法。这是该语言严重不足的一个很好的例子,也是一个很好的商业机会。bitdigester将一系列单元格传递给函数很容易<代码>调宽r作为范围
设置r=工作表(“表1”)。范围(“C2:C24”)
,然后
平均值=应用程序。工作表功能。平均值(r)
。名称用于其他用途,例如,当您使用命名范围预先设置工作表一次,然后从代码中引用它们时,但即使如此,名称通常也会引用它们自己工作表中的范围。或者,您可以制作一个,而不是您正在使用的本地版本,这将使您的
范围(“sheet1Avg”)
也能工作。但这不起作用。但是谢谢你的帮助。Sheet1代码名未被识别为对象——这只是Excel VBA中许多操作方法之一,其中大多数操作都会导致失败。@bitdigester在范围地址中使用时,工作表名称是工作表标签,用户可以看到。当直接从代码中使用时,图纸名称是实际的图纸名称,用户不可见,并且独立于图纸标签。这些名称可以在代码编辑器的“属性”窗格中看到。显然,您有一张带有标签
Sheet1
和其他实际名称的工作表。在
平均值(Sheet1.Range())
中使用实际名称,或者将其替换为
平均值(工作表(“Sheet1”).Range())
@bitdigester是它将根据您正在处理或希望处理的工作表而有所不同。您可以在项目窗口中看到这一点。默认情况下,在excel中打开新工作簿时,它包含3张名为sheet1到sheet3的工作表。他们的代号是一样的。要使用工作表名称获取代码名,您可以使用即时窗口并键入此
?工作表(“工作表名称”)。代码名
。或者你可以按照@GSerg在评论中的建议去做。