使用VBA评估公式并将结果添加到范围

时间:2014-10-09 14:29:49

标签: excel vba excel-vba

我已经编写了一个宏来准备一些文件,并希望在每个行中添加以下公式作为此自动化的一部分。每行的公式是相同的,但问题是公式很长。

=UPPER(CONCATENATE(IF(J2=0,"",AlphaNumericOnly(SUBSTITUTE(J2,"0",""))),IF(M2=0,"",LEN(M2)),IF(N2=0,"",UPPER(AlphaNumericOnly(SUBSTITUTE(N2,"0","")))),IF(P2=0,"",UPPER(AlphaNumericOnly(SUBSTITUTE(P2,"0","")))),IF(R2=0,"",UPPER(AlphaNumericOnly(SUBSTITUTE(R2,"0","")))),IF(W2=0,"",UPPER(AlphaNumericOnly(SUBSTITUTE(W2,"0","")))),IF(X2=0,"",UPPER(AlphaNumericOnly(SUBSTITUTE(X2,"0","")))),IF(Y2=0,"",UPPER(AlphaNumericOnly(SUBSTITUTE(Y2,"0","")))),IF(Z2=0,"",SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(Z2,"-","1"),".",""),"0","")),IF(AD2=0,"",SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(AD2,"-","1"),".",""),"0",""))))

我已经尝试记录要添加的公式以提供帮助,但结果已删除部分宏。几乎就好像它太长了。

是否有人可以提供将此公式添加到每一行的方法?我已经读过您可以在vba中评估公式结果并返回结果,而不是将公式添加到工作表中。我应该看看这条路吗?

1 个答案:

答案 0 :(得分:2)

在模块表的顶部放置此声明(如果它在Option Explicit下)。

Public Const csFORMULA = "=UPPER(CONCATENATE(IF(J2=0,"""",AlphaNumericOnly(SUBSTITUTE(J2,""0"",""""))),IF(M2=0,"""",LEN(M2)),IF(N2=0,"""",UPPER(AlphaNumericOnly(SUBSTITUTE(N2,""0"","""")))),IF(P2=0,"""",UPPER(AlphaNumericOnly(SUBSTITUTE(P2,""0"","""")))),IF(R2=0,"""",UPPER(AlphaNumericOnly(SUBSTITUTE(R2,""0"","""")))),IF(W2=0,"""",UPPER(AlphaNumericOnly(SUBSTITUTE(W2,""0"","""")))),IF(X2=0,"""",UPPER(AlphaNumericOnly(SUBSTITUTE(X2,""0"","""")))),IF(Y2=0,"""",UPPER(AlphaNumericOnly(SUBSTITUTE(Y2,""0"","""")))),IF(Z2=0,"""",SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(Z2,""-"",""1""),""."",""""),""0"","""")),IF(AD2=0,"""",SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(AD2,""-"",""1""),""."",""""),""0"",""""))))"

现在您可以将公式填入任何范围。例如:

Range("L2:L10").Formula = csFORMULA
'Range("L2:L10") = Range("L2:L10").Value

如果您想要从插入的公式中恢复值,则第二个注释行。请注意,我使用的是.Formula而不是.FormulaR1C1