Excel Geomean返回#value!有时?

时间:2013-02-10 01:35:21

标签: excel vba excel-formula

我已修改下面的功能以满足我的需求。

我有很多工作簿,工作表包含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函数是否仅限于给定数量的数据?

由于

2 个答案:

答案 0 :(得分:2)

我对早期Excel版本的测试似乎有170个字符限制(我在xl03中测试过),在此Mr Excel thread验证

(Xl10在较长的数据集上运行良好)

我也尝试过:

  • 使用Evaluate
  • 使用1D阵列

样本失败

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)))
  3. 建议的方法

    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,其值具有相同的行范围。