如何用VBA将Excel公式计算值(非公式)写入单元格?
解决Excel VBA写入公式计算值而非公式本身的问题
嘿,我来帮你搞定这个问题!你现在的代码之所以没达到预期,是因为你把公式字符串直接赋值给了单元格的.Value属性,Excel自然会把它当成公式保存,而不是计算后的结果。咱们来一步步修正:
原代码的核心问题
你这段代码里,Res = "=CONCATENATE(RC[1],RC[14])"是把公式文本赋值给变量,随后直接塞给单元格,这相当于手动在单元格里输入公式,当然会保留公式本身。另外还有个潜在坑:Range(Cells(2, 1), Cells(ZmAntal, 1))里的Cells没有指定工作表,要是当前活动表不是Zmbistad,就会引用错误的单元格!
两种可行的修正方案
方案1:先写入公式,再转换为计算值
这是最直观的方法——先让Excel计算公式,再把单元格内容替换成计算后的结果:
Sub WriteCalculatedValues() Dim ZmAntal As Long Dim CountryRange As Range, C As Range ZmAntal = Worksheets("Maskinerum").Cells(8, 4).Value ' 修正:明确指定Cells所属的工作表,避免跨表引用错误 Set CountryRange = Sheets("Zmbistad").Range(Sheets("Zmbistad").Cells(2, 1), Sheets("Zmbistad").Cells(ZmAntal, 1)) For Each C In CountryRange ' 用R1C1格式写入公式 C.FormulaR1C1 = "=CONCATENATE(RC[1],RC[14])" ' 关键一步:将公式转换为计算后的静态值 C.Value = C.Value Next C End Sub
方案2:直接计算公式结果再写入
如果你不想让单元格短暂显示公式,可以用Evaluate直接算出结果,再写入单元格:
Sub WriteCalculatedValues() Dim ZmAntal As Long Dim CountryRange As Range, C As Range Dim Res As Variant ZmAntal = Worksheets("Maskinerum").Cells(8, 4).Value Set CountryRange = Sheets("Zmbistad").Range(Sheets("Zmbistad").Cells(2, 1), Sheets("Zmbistad").Cells(ZmAntal, 1)) For Each C In CountryRange ' 基于当前单元格的上下文计算公式结果 Res = C.Worksheet.Evaluate("CONCATENATE(RC[1],RC[14])", C) ' 只有结果不是错误值时才写入 If Not IsError(Res) Then C.Value = Res End If Next C End Sub
额外说明
- 方案1的优势是简单可靠,Excel会自动处理公式的计算逻辑,适合大多数场景。
- 方案2里的
IsError判断才真正有用,因为Evaluate会返回公式的计算结果(包括错误值),而原代码里判断字符串Res是否为错误是没有意义的。
内容的提问来源于stack exchange,提问作者Kjeld Ostersen




