VBA - 在长公式

时间:2015-05-15 20:02:51

标签: vba excel-vba excel-formula excel

说我在Excel中的某个单元格上有一个很长的公式

  

= IF(SUM(D3:D6)> 1," A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z 01",   IF(SUM(D3:D6)大于1," A-B-C-d-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z   02&#34 ;,   IF(SUM(D3:D6)大于1," A-B-C-d-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z   03&#34 ;,   IF(SUM(D3:D6)大于1," A-B-C-d-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z   04&#34 ;,   IF(SUM(D3:D6)大于1," A-B-C-d-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z   05&#34 ;,   IF(SUM(D3:D6)大于1," A-B-C-d-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z   06&#34 ;,   IF(SUM(D3:D6)大于1," A-B-C-d-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z   07&#34 ;,   IF(SUM(D3:D6)大于1," A-B-C-d-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z   08&#34 ;,   IF(SUM(D3:D6)大于1," A-B-C-d-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z   09&#34 ;,   IF(SUM(D3:D6)大于1," A-B-C-d-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z   10&#34 ;,   IF(SUM(D3:D6)大于1," A-B-C-d-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z   11&#34 ;,   IF(SUM(D3:D6)大于1," A-B-C-d-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z   12&#34 ;,   IF(SUM(D3:D6)大于1," A-B-C-d-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z   13&#34 ;,   IF(SUM(D3:D6)大于1," A-B-C-d-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z   14""无" ))))))))))))))

我运行以下VBA代码

Private Sub ExecuteFormula()
    Dim sFormula As String, vReturn As Variant
    sFormula = Selection.Formula

    vReturn = Application.Evaluate(sFormula)
    If VarType(vReturn) <> vbError Then
        MsgBox vReturn, vbInformation
    Else
        MsgBox "Error", vbExclamation
    End If
End Sub
然后我得到&#34;错误&#34;。对于较短的公式,它工作正常,所以我想知道是否有办法使用VBA评估长公式(一般)。

1 个答案:

答案 0 :(得分:3)

根据Microsoft documentation,这是导致错误的原因:

  

参数

     

姓名:姓名

     

必需/可选:必需

     

数据类型:变体

     

描述:使用Microsoft Excel的命名约定的公式或对象的名称。名称的长度必须小于或等于255个字符

请注意,在说明中它还说您可以使用“对象的名称”而不是公式。

然而,进一步阅读将有助于缩小评估长公式的选项范围。下一节为我们提供了此方法可以使用的“名称”:

  

Microsoft Excel中的以下类型的名称可用于此方法:

     
      
  • 公式。
  •   
  • A1风格的参考。您可以使用任何单个引用   A1格式的单元格。所有参考文献都被认为是   绝对参考。
  •   
  • 范围。您可以使用范围,交叉和   联合运算符(分别为冒号,空格和逗号)   引用。
  •   
  • 定义名称。您可以使用该语言指定任何名称   的宏。
  •   
  • 外部参考。你可以使用!操作员   引用一个单元格或另一个工作簿中定义的名称 - for   例如,评估(“[BOOK1.XLS] Sheet1!A1”)。
  •   
  • 图表对象。您可以   指定任何图表对象名称,例如“图例”,“绘图区域”或   “系列1”,用于访问该对象的属性和方法。对于   例如,图表(“Chart1”)。评估(“图例”)。字体名称返回   图例中使用的字体名称。
  •   

然后是具体的例子:

[a1].Value = 25 
Evaluate("A1").Value = 25 

trigVariable = [SIN(45)] 
trigVariable = Evaluate("SIN(45)") 

Set firstCellInSheet = Workbooks("BOOK1.XLS").Sheets(4).[A1] 
Set firstCellInSheet = _ 
    Workbooks("BOOK1.XLS").Sheets(4).Evaluate("A1")

考虑到所有这些,向我们表明我们可以使用单元格的地址来执行计算,而不是将整个公式带来。

这意味着我们可以修改您的sub以使用单元格地址:

Private Sub ExecuteFormula()
    Dim sFormula As String, vReturn As Variant
    sFormula = Selection.Address ' use the cells address not the formula

    vReturn = Application.Evaluate(sFormula)
    If VarType(vReturn) <> vbError Then
        MsgBox vReturn, vbInformation
    Else
        MsgBox "Error", vbExclamation
    End If
End Sub