5

我在工作表的一系列单元格中有一个公式,它计算为数值。如何从传递给函数的范围中获取 VBA 中的数值?

假设工作表中 A 列的前 10 行包含 rand() 并且我将其作为参数传递给我的函数...

public Function X(data as Range) as double

    for c in data.Cells
        c.Value    'This is always Empty
        c.Value2   'This is always Empty
        c.Formula  'This contains RAND()
    next

end Function

我从一个单元格调用函数......

=X(a1:a10)

如何获得单元格值,例如 0.62933645?

Excel 2003, VB6

4

3 回答 3

6

从 VBA (Excel 2003) 运行时,以下代码适用于我:

Public Function X(data As Range) As Double

For Each c In data.Cells
    a = c.Value     'This works
    b = c.Value2    'This works too (same value)
    f = c.Formula   'This contains =RAND()
Next

End Function

a 和 b 相同且等于我传入的内容(这是其中包含 Rand() 的单元格范围)。我不确定这里还有什么。

啊哈!你需要设置X,不是吗?我不确定你希望这个函数做什么,但你需要将 X (函数的名称)设置为你想要返回的值。添加这一行:

X = a
于 2009-05-23T12:44:34.157 回答
2

我无法使用您发布的布局复制问题。我注意到您发布的代码中有一些语法错误(即:“for”应该是“for each”)。但是当我将 =RAND() 放入 A1:A10 和 =X(A1:A10) 时,我得到了一个很好的回报:

Public Function X(data As Range) As Double
    Dim c As Excel.Range
    Dim sum As Double
    For Each c In data.Cells
        sum = sum + c.Value
    Next
    X = sum
End Function

但是,只是为了进一步扩展您遇到的其他一些问题。您可以评估公式的结果,如下所示:

Public Function X(data As Range) As Double
    Dim c As Excel.Range
    Dim sum As Double
    For Each c In data.Cells
        sum = sum + Excel.Evaluate(c.Formula)
    Next
    X = sum
End Function

但一般来说你不会想要,因为这基本上是计算相同的值两次。

于 2009-05-27T08:54:41.440 回答
0

确保在请求值之前进行计算。

为了加快宏的速度,通常会执行以下操作..

'Set Reasonable default
Application.CutCopyMode = False
Application.ScreenUpdating = False
Application.Interactive = False
Application.Calculation = xlCalculationManual

在这种状态下,您必须在值可用之前强制计算。

Public Function X(data As Range) As Double
    'You may need the following as well
    'Application.Calculate
    Dim c As Range
    For Each c In data.Cells
        c.Calculate
        c.Value    'This is now has a value
        c.Value2   'This is now has a value
        c.Formula  'This contains RAND()
    Next
End Function
于 2010-03-17T01:13:48.977 回答