提问人:Simon 提问时间:5/23/2009 最后编辑:Simon 更新时间:2/22/2021 访问量:95138
如何使用VBA从Excel中的公式中获取单元格值?
How do I get the cell value from a formula in Excel using VBA?
问:
我在工作表中的一系列单元格中有一个公式,其计算结果为数值。如何从传递到函数的范围内获取 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
答:
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节省器是关闭屏幕更新。
评论