说我在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评估长公式(一般)。
答案 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