标签: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论坛,供有兴趣的朋友研究。