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) 

无济于事。

所以我认为你的两个解决方法是:

  1. 通过VBA插入一个公式到Excel中并使用这个结果
  2. 根据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 ,其值落在相同的行范围内。