Vba 显示IF公式而不是结果

Vba 显示IF公式而不是结果,vba,excel,excel-formula,Vba,Excel,Excel Formula,当Excel为我的宏执行某些VBA代码时,我在获得正确的结果方面遇到了一些问题 它不是将公式放在所需的单元格中,而是给出该公式的结果,在本例中为真或假 此代码工作正常,它将公式放入单元格中,结果如下所示: Range("AL12").Select ActiveCell.Formula = "=SUM" & ActiveCell.Formula 此代码无效,我收到一个错误: Range("AL12").Select ActiveCell.Formula = "=IF" & Act

当Excel为我的宏执行某些VBA代码时,我在获得正确的结果方面遇到了一些问题

它不是将公式放在所需的单元格中,而是给出该公式的结果,在本例中为真或假

此代码工作正常,它将公式放入单元格中,结果如下所示:

Range("AL12").Select
ActiveCell.Formula = "=SUM" & ActiveCell.Formula
此代码无效,我收到一个错误:

Range("AL12").Select
ActiveCell.Formula = "=IF" & ActiveCell.Formula
这段代码有效,但没有给出公式,只有结果:

Range("AL12").Select
ActiveCell.Formula = "" = "IF" & ActiveCell.Formula

如何让宏将公式放入单元格中,以便公式可以计算其结果,该结果应为0或1,而不是真或假。就像在第一行代码中一样

不,这些不是“工作,而是把结果而不是公式”。他们只是在向单元格写入
FALSE
。因为例如,第一句话的意思是:

其中,RHS是一种比较,明显导致
False

至于你作品中的其他形式,即


您只是将
“=SUM”
预加到现有公式,或者在旧单元格为空的情况下不预加任何内容;在任何情况下,生成的公式都有错误的语法。

如果activecell中已经有一个公式,并且您希望使用VBA修改或增强该公式,则必须注意前导的=

假设我们有一个单元格,其中包含:

=SUM(A1:A123)
我们运行:

Sub Vig()
    Dim s As String
    s = ActiveCell.Formula
    MsgBox s
End Sub
我们得到:

如果我们想将其嵌入到If语句中,我们可以使用如下内容:

Sub Vig_2()
    Dim s As String
    s = Mid(ActiveCell.Formula, 2)
    ActiveCell.Formula = "=IF(" & s & "=0,9999," & s & ")"
End Sub


MID()删除原始的=

这永远不会顺利进行。你设计的系统有太多的不稳定性。正确的方法是获取每个数据并将其写入某个位置,在安全地写入所有数据之前,不要开始进行任何计算

您可以写入工作簿单元格。它们可以在您想要得到结果的同一个工作表中,在可见或隐藏列中,或者在另一个可见或隐藏或非常隐藏的工作表上(这意味着没有VBA的帮助,用户无法使其可见)。您还可以“写入”内存,这意味着将值分配给变量

同样的方法也应适用于参数。例如,web地址不应包含在公式中。它应该位于单元格中,或者位于代码中声明的常量中。事实上,你应该学会遵守的第一条规则之一就是永远不要在任何公式中写入任何常数。公式处理数据。它们不包含它们


在修改结构的同时,我还建议您检查VBA和工作表函数之间的关系。使用VBA编写函数的情况相当罕见。通常,VBA不是作为功能的补充,而是作为功能的替代品。工作表功能并不意味着要像您试图让他们做的那样做非常复杂的工作。结果代码是复杂的,最终无法解决问题(因为这是您当前的经验)。把所有这些都放到VBA中,你花了好几个星期才达成妥协,只需要几个小时就可以达到完美。

我明白了,是的,我只是在为现有公式预加“=SUM”。我这样做的原因是因为源公式是一个连接公式,当我只将此连接公式的值复制到另一个单元格时,它会给我正确的结果(另一个公式),但我需要手动输入单元格并单击“enter”使公式工作。通过在“=SUM”前面加上前缀,我成功地让它工作了,但我不能用“IF”来实现这一点。谢谢您的输入。“通过预加“=SUM”我成功地使它工作了”Doh,您一定是在使用其他东西,而不是Excel。可能是标记错误。无论如何,这绝对是Excel,谢谢。总有一天我会找到办法让它工作的。谢谢Gary,我根据你的代码尝试了一些变体,但我仍然只得到了没有公式的结果。我会继续摆弄,谢谢你的投入。用未知的部分构造公式是不太可能的。对于第一个示例,ActiveCell似乎包含类似于
(A3:A12)
的内容。因此,您的第一个示例是有效的。但是您的第二个示例在ActiveCell中必须具有完全不同的值,因为您可能不会期望
=IF(A3:12)”给出任何结果。因此,请为您的每个示例公开
ActiveCell.Formula`的格式。'ActiveCell.FormulaR1C1=“=连接(“=ALS('D:\Google Drive\Pat Bud\Begrotingen[Begroting”“、RC3”“、RC2”“-”、RC7”“.xlsx]Totaal”“!$L$66=0”“、”、”1”“、”、”0”“)”)““所有单元格都有
general”格式
。我正在做的是减少这种连接:
ActiveCell.FormulaR1C1=“=连接(“=IF('D:\Google Drive\Pat-Bud\Begrotingen\[Begroting”“,RC3”“,”RC2”“,“-”,RC7”“,.xlsx]Totaal'!$L$66=0”“,“,”1“;”,”0“)”)“
到下一个公式,使用
Copy.Value
,结果是(示例):
=IF('D:\Google Drive\Pat Bud\Begrotingen\[Begroting 207.17-1.xlsx]Totaal'!$L$66=0;1;0)
这正是我想要的,但它需要手动输入才能开始工作。工作的代码的作用完全相同,但将
=SUM
而不是
=IF
放入相同的生成公式中(当然没有Excel
IF
语句)。就像你说的那样。感谢Variatus,这是一个关于如何构造正确宏的非常清晰的见解。看起来我有很多事情要做,以改进结构,但我感到有动力:)
ActiveCell.Formula = "=SUM" & ActiveCell.Formula
=SUM(A1:A123)
Sub Vig()
    Dim s As String
    s = ActiveCell.Formula
    MsgBox s
End Sub
Sub Vig_2()
    Dim s As String
    s = Mid(ActiveCell.Formula, 2)
    ActiveCell.Formula = "=IF(" & s & "=0,9999," & s & ")"
End Sub