1

我已经修改了下面的函数以满足我的需要。

我有许多工作簿,其中包含 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

问题是,除了GeoMeann 之外,这段代码工作得很好。我注意到当数据范围相对较小(数据单元格的数量)时,它会返回一个值。但是,如果范围大于约。126 个细胞,它返回#value!.

我被困住了,正在努力解决这个问题。该GeoMean功能是否仅限于给定数量的数据?

谢谢

4

2 回答 2

2

我对早期 Excel 版本的测试似乎有 170 个字符的限制(我在 xl03 中测试),在这个Excel 先生线程中验证

(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)))

建议的方法

MsgBox Evaluate("EXP(AVERAGE(LN(A1:A171)))")
于 2013-02-10T02:03:01.367 回答
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其他列上的值,该列的值位于同一行范围内。

于 2013-02-10T13:38:47.343 回答