Excel不支持将离线单元格范围引用传递给函数吗?

时间:2014-10-02 23:58:38

标签: excel-vba vba excel

您会这么认为,但这会因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复制到活动工作表中。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我怀疑你确实需要这种扭曲的逻辑,但如果你真的这样做,请修复你的RefersTo

Names.Add Name:="sheet1Avg", RefersTo:="=sheet1!$C$2:$C$24"

并更改引用创建范围的方式 - 您不能使用Range取消引用它,因为它应该在其父工作表上返回一个范围,而不是在任何其他工作表上:

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

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

答案 1 :(得分:0)

GSerg已经很好地解释了,所以请他回答 以下是使用Evaluate功能获取平均值的另一种方法。

avg = Evaluate("AVERAGE(" & Split(Names(1).RefersTo, "=")(1) & ")")

如果你正确地创建了Name,就像GSerg所指出的那样(在你的地址前面添加=)就可以正常工作,因为它会返回你指定地址的平均值。

另一种方法是明确指定名称。而不是在 Sheet2 中设置范围,而是在工作簿中设置它。类似的东西:

ThisWorkbook.Names.Add Name:="sheet1Avg2", RefersTo:="=Sheet1!$C$2:$C$24"

然后你需要明确地调用它:

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

其中 Sheet1 Sheet Codename 。 HTH,不要混淆你。