VBA - 在长公式上使用 Application.Evaluate 时出错
VBA - Error when using Application.Evaluate on Long Formula
假设我在 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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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",
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","no" ))))))))))))))
我运行以下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
然后我得到 "Error"。对于较短的公式,它工作得很好,所以我想知道是否有一种方法可以使用 VBA.
来评估长公式(通常)
根据 Microsoft documentation 这是导致您的错误的原因:
Parameters
Name: Name
Required/Optional: Required
Data Type: Variant
Description: A formula or the name of the object, using the naming convention of Microsoft Excel. The length of the name must be less than or equal to 255 characters.
请注意,在说明中还说您可以使用“对象的名称”而不是公式。
然而,进一步阅读将有助于缩小评估长公式的选项范围。下一节将向我们介绍此方法可以使用的“名称”:
The following types of names in Microsoft Excel can be used with this method:
- Formulas.
- A1-style references. You can use any reference to a single
cell in A1-style notation. All references are considered to be
absolute references.
- Ranges. You can use the range, intersect, and
union operators (colon, space, and comma, respectively) with
references.
- Defined names. You can specify any name in the language
of the macro.
- External references. You can use the ! operator to
refer to a cell or to a name defined in another workbook — for
example, Evaluate("[BOOK1.XLS]Sheet1!A1").
- Chart Objects. You can
specify any chart object name, such as "Legend", "Plot Area", or
"Series 1", to access the properties and methods of that object. For
example, Charts("Chart1").Evaluate("Legend").Font.Name returns the
name of the font used in the legend.
然后是具体例子:
[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
假设我在 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", 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", 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", 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", 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", 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", 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", 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", 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", 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", 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", 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", 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","no" ))))))))))))))
我运行以下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
然后我得到 "Error"。对于较短的公式,它工作得很好,所以我想知道是否有一种方法可以使用 VBA.
来评估长公式(通常)根据 Microsoft documentation 这是导致您的错误的原因:
Parameters
Name: Name
Required/Optional: Required
Data Type: Variant
Description: A formula or the name of the object, using the naming convention of Microsoft Excel. The length of the name must be less than or equal to 255 characters.
请注意,在说明中还说您可以使用“对象的名称”而不是公式。
然而,进一步阅读将有助于缩小评估长公式的选项范围。下一节将向我们介绍此方法可以使用的“名称”:
The following types of names in Microsoft Excel can be used with this method:
- Formulas.
- A1-style references. You can use any reference to a single cell in A1-style notation. All references are considered to be absolute references.
- Ranges. You can use the range, intersect, and union operators (colon, space, and comma, respectively) with references.
- Defined names. You can specify any name in the language of the macro.
- External references. You can use the ! operator to refer to a cell or to a name defined in another workbook — for example, Evaluate("[BOOK1.XLS]Sheet1!A1").
- Chart Objects. You can specify any chart object name, such as "Legend", "Plot Area", or "Series 1", to access the properties and methods of that object. For example, Charts("Chart1").Evaluate("Legend").Font.Name returns the name of the font used in the legend.
然后是具体例子:
[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