【问题标题】:How do I get the cell value from a formula in Excel using VBA?如何使用 VBA 从 Excel 中的公式中获取单元格值?
【发布时间】:2009-05-23 12:21:16
【问题描述】:

我在工作表的一系列单元格中有一个公式,它计算为数值。如何从传递给函数的范围中获取 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 代码,我得到了单元格 Rand(); 的值没问题。也许发布更多代码以查看发生了什么?
  • Richard,没有更多代码了,就是这样......我要做的就是获取单元格值,它们都是“空的”
  • 请说明您在什么条件下使用该功能。特别是,同一工作表上的单元格是否在您使用它时处于其他活动状态,例如对话框或某些 Excel 功能(某些 Range 方法在某些情况下在 Excel 中不起作用)。
  • For 循环的开头行不正确 - 应该是: For Each c in data.Cells 假设这是一个错字,因为程序不会在缺少 Each 的情况下编译
  • 不应该是“每个人”吗?

标签: vba excel-2003


【解决方案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

【讨论】:

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

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

【讨论】:

  • 再次评估公式(尽管在大多数情况下是多余的)对我来说非常方便。我想缓存另一个工作簿中的值,但它的单元格将返回“空”,因为它们稍后将在 Excel 所考虑的任何队列中计算。
【解决方案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

【讨论】:

  • Application.Calculate 不是必需的,因为即使计算模式设置为 xlManual,Excel 也会计算公式的新值。如果您每次都必须调用 Application.Calculate,那么您就违背了将其设置为手动并因此加快速度的整个目的,对吗?
  • 并非如此,因为您只计算一个单元格。不是整张纸。除了最大的 CPU 节省程序之外,关闭屏幕更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多