我已修改下面的vba功能以满足我的需求。
我有很多工作簿,工作表包含4500多行,我使用该函数搜索两个给定值(作为边界)。然后,它选择行作为范围。最后,在该范围内做任何事情。功能:
Function GeoM(A, B)
Application.Volatile
Dim x As Integer
Dim y As Integer
Dim rng As Range
x = Application.WorksheetFunction.Match(A, Range("B:B"), 0) ' looking in col B
y = Application.WorksheetFunction.Match(B, Range("B:B"), 0) ' looking in col B
Set rng = Range(Cells(x, 18), Cells(y, 18)) 'Im working on col 18
GeoM = Application.WorksheetFunction.GeoMean(rng)
End Function
问题是,除了GeoMean
n之外,此代码的工作正常。我注意到当数据范围相对较小(数据单元的数量)时,它返回一个值。但是,如果范围大于约。 126个单元格,返回#value!
。
我陷入困境并致力于解决这个问题。 GeoMean
函数是否仅限于给定数量的数据?
由于
答案 0 :(得分:2)
我对早期Excel版本的测试似乎有170个字符限制(我在xl03中测试过),在此Mr Excel thread验证
(Xl10在较长的数据集上运行良好)
我也尝试过:
Evaluate
样本失败
Dim X
Set rng1 = Range("A1:A171")
MsgBox Evaluate("GeoMean(A1:A171)")
X = Application.Transpose(rng1)
MsgBox Application.WorksheetFunction.GeoMean(X)
无济于事。
所以我认为你的两个解决方法是:
GeoMean
的派生,即=EXP(AVERAGE(LN(Range)))
建议的方法
MsgBox Evaluate("EXP(AVERAGE(LN(A1:A171)))")
答案 1 :(得分:1)
感谢brettdj
,我修复了该功能,现在可以正常运行:
Function GeoM(A, B)
Application.Volatile
Dim x As Integer
Dim y As Integer
Dim rng As Range
Dim LnValue As Double
Dim count As Integer
x = Application.WorksheetFunction.Match(A, Range("B:B"), 0) 'look in col. B
y = Application.WorksheetFunction.Match(B, Range("B:B"), 0) 'look in col. B
Set rng = Range(Cells(x, 18), Cells(y, 18)) 'set range of rows on col# 18
Do
LnValue = LnValue + Math.Log(Cells(x, 18)) 'calculates sum of ln(value)
x = x + 1
count = count + 1 'calculates the total number of values
Loop Until x > y 'stop when x (upper row#) is greater than y (lower row#)
GeoM = Math.Exp((1 / count) * LnValue) 'GeoMean formula
End Function
此函数在指定列中搜索两个值作为上限和下限(注意:这意味着您不应该在该列中具有重复值。换句话说,该列应具有唯一值)。然后,它在其他列上找到值的GeoMean
,其值具有相同的行范围。