如何使用VBA从Excel中的公式中获取单元格值?

How do I get the cell value from a formula in Excel using VBA?

提问人:Simon 提问时间:5/23/2009 最后编辑:Simon 更新时间:2/22/2021 访问量:95138

问:

我在工作表中的一系列单元格中有一个公式,其计算结果为数值。如何从传递到函数的范围内获取 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

VBA Excel-2003

评论

0赞 Richard Morgan 5/23/2009
我做了一些快速的VBA代码,我得到了单元格Rand()的值;没问题。也许发布更多代码以查看还发生了什么?
0赞 Simon 5/23/2009
理查德,没有更多的代码了,就是这样......我想做的就是获取单元格值,它们都是“空的”
0赞 GSerg 5/23/2009
还请说明您在什么条件下使用该功能。特别是,单元格是同一工作表上的单元格,并且在您使用它时处于活动状态,例如对话框或某些 Excel 功能(某些 Range 方法在某些情况下在 Excel 中不起作用)。
0赞 barrowc 5/24/2009
For 循环的开始行不正确 - 应为:For Data 中的每个 c。单元格 认为这是一个错别字,因为程序不会编译 Each 缺少
0赞 Oorang 5/27/2009
这不应该是“每个人”吗?

答:

6赞 Richard Morgan 5/23/2009 #1

从 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

评论

0赞 Simon 5/23/2009
如果单元格包含以下内容,我可以让它工作:一个值,一个对值的引用,一个由两个值组成的公式,但如果我直接引用一个包含 rand() 函数的单元格,它永远不会起作用。
0赞 Richard Morgan 5/23/2009
也许把你如何调用X函数?同样,我能想到的每一种方法都在为我工作。
0赞 barrowc 5/24/2009
问题中写的 X 函数对 c.Value、c.Value2 或 c.Formula 没有任何作用。假设我们需要在循环中对 c.Value 执行一些操作,例如,a = a + c.Value 在循环中,然后 X = a 如上所述
2赞 Oorang 5/27/2009 #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

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

评论

0赞 aliqandil 8/13/2019
再次评估公式(尽管在大多数情况下是多余的)对我来说非常方便。我想缓存另一个工作簿中的值,但它的单元格会返回“空”,因为它们稍后将在 excel 想到的任何队列中计算。
0赞 Frobbit 3/17/2010 #3

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

为了加快宏的速度,通常会预先形成如下内容。.

'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

评论

0赞 Adarsha 4/25/2011
Application.Calculate 不是必需的,因为即使计算模式设置为 xlManual,Excel 也会计算公式的新值。如果你每次都必须调用Application.Compute,那么你就违背了将其设置为手动的整个目的,从而加快了速度,对吧?
0赞 Frobbit 9/15/2011
不是真的,因为你只计算那个单元格。不是整张纸。除了最大的CPU节省器是关闭屏幕更新。