Excel Geomean返回#value! 有时?
我已经修改了下面的vba函数来满足我的需求。
我有很多包含4500多行的工作簿,我使用该函数search两个给定的值(作为边界)。 然后,select行作为范围。 最后,在这个范围内做任何事情。 function:
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
函数是否限于给定数量的数据?
谢谢
对于早期的Excel版本(我在xl03中testing过),我的testing似乎有170个字符的限制,在这个Mr Excel线程中validation
(Xl10在更长的数据集上工作良好)
我也试过:
- 使用
Evaluate
- 使用一维数组
失败的样本
Dim X Set rng1 = Range("A1:A171") MsgBox Evaluate("GeoMean(A1:A171)") X = Application.Transpose(rng1) MsgBox Application.WorksheetFunction.GeoMean(X)
无济于事。
所以我认为你的两个解决方法是:
- 通过VBA插入一个公式到Excel中并使用这个结果
- 根据MrExcel线程使用
GeoMean
的推导,即=EXP(AVERAGE(LN(Range)))
build议的方法
MsgBox Evaluate("EXP(AVERAGE(LN(A1:A171)))")
感谢brettdj
,我修复了这个function,现在它可以工作:
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
这个函数在指定的列中search两个值作为上限和下限(注意:这意味着你不应该在该列中有重复的值,换句话说,该列应该有唯一的值)。 然后,它find其他列上值的GeoMean
,其值落在相同的行范围内。