VBA中最强大的命令:Evaluate

2023-09-21 19:42:45 浏览数 (2)

标签:VBA,Evaluate

可能很少有人注意到Evaluate命令,也很少被使用,然而,它非常强大且有用。

例如,直接在VBA中使用工作表公式,Evaluate就可以做到:

代码语言:javascript复制
Sub Neato()
 MsgBox Evaluate("SUM(A1:A6)")
End Sub

当然,你可以不使用Evaluate实现同样的结果:

代码语言:javascript复制
Set Fn = Application.WorksheetFunction
x = Fn.Sum(Range("A1:A10"))

或者,简化为:

代码语言:javascript复制
x = Application.Sum(Range("A1:A10"))

但,为什么要这么麻烦呢?

还有,就是引用单元格区域:

代码语言:javascript复制
Range("A1:A6").Select

可以使用简写括号:

代码语言:javascript复制
[A1:A6].Select

实际上,这个括号就是Evaluate的简写。也就是说:

代码语言:javascript复制
[A1:A6].Select

等同于:

代码语言:javascript复制
Evaluate("A1:A6").Select

这样,上文中的第一段代码可简化为:

代码语言:javascript复制
MsgBox [SUM(A1:A6)]

这些括号,就像是VBA中的单元格,形不形象?

还有一个“秘密”就是,也可以在定义的单元格区域名称中使用EVALUATE,因此有一些方法可以在不使用VBA的情况下访问单元格公式中EVALUATE的功能。

Evaluate的基本功能如下:

1.将数学表达式字符串转换为值。

2.将一维和二维字符串数组转换为它们的等效数组。

3.能够处理工作表单元格可以处理的任何公式。

真的,它可以做单元格能做的任何事情!它包含工作表单元格的所有功能,而“该单元格”包含在VBA命令中。事实上,它甚至可以做单元格不能做的事:可以返回整个数组。

下面分别是Evaluate的简写和显式用法,展示了如何使用Evaluate返回和赋值数组:

代码语言:javascript复制
Sub test()
 Dim xArray() As Variant
 Dim y As String
 
 '一维数组字符串转换
 xArray = [{1,2,3}]
 Range("A1").Resize(1, UBound(xArray)).Value = xArray
 
 '二维数组字符串转换
 xArray = [{1,2;3,4;5,6}]
 Range("A5").Resize(UBound(xArray, 1), UBound(xArray, 2)).Value = xArray
 
 '使用字符串变量的二维数组转换
 y = "{1,2;3,4;5,6}"
 '必须显式,简写不起作用
 xArray = Evaluate(y)
 Range("A5").Resize(UBound(xArray, 1), UBound(xArray, 2)).Value = xArray
End Sub

在用户窗体中使用Evaluate允许处理公式:

代码语言:javascript复制
'行为类似单元格的用户窗体文本框
'允许一个文本框里包含另一个文本框要用的公式
Private Sub TextBox1_Change()
 On Error Resume Next
 TextBox2.Value = Evaluate(TextBox1.Text)
End Sub
'只需双击即可将公式转换为条目?
'这似乎是用户窗体输入的一个很有用的功能,而且很容易应用。
Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
 TextBox1.Value = Evaluate(TextBox1.Text)
End Sub

使用Evalute处理自定义函数:

代码语言:javascript复制
Sub EvalUDF()
 MsgBox Evaluate("MyUDF()")
End Sub
Function MyUDF() As String
 MyUDF = "Hi!完美Excel"
End Function

注:本文整理自ozgrid.com论坛,供有兴趣的朋友研究。

0 人点赞