您会这么认为,但这会因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
复制到活动工作表中。
有什么想法吗?
答案 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,不要混淆你。