标签:VBA,Evaluate
可能很少有人注意到Evaluate命令,也很少被使用,然而,它非常强大且有用。
例如,直接在VBA中使用工作表公式,Evaluate就可以做到:
Sub Neato()
MsgBox Evaluate("SUM(A1:A6)")
End Sub
当然,你可以不使用Evaluate实现同样的结果:
Set Fn = Application.WorksheetFunction
x = Fn.Sum(Range("A1:A10"))
或者,简化为:
x = Application.Sum(Range("A1:A10"))
但,为什么要这么麻烦呢?
还有,就是引用单元格区域:
Range("A1:A6").Select
可以使用简写括号:
[A1:A6].Select
实际上,这个括号就是Evaluate的简写。也就是说:
[A1:A6].Select
等同于:
Evaluate("A1:A6").Select
这样,上文中的第一段代码可简化为:
MsgBox [SUM(A1:A6)]
这些括号,就像是VBA中的单元格,形不形象?
还有一个“秘密”就是,也可以在定义的单元格区域名称中使用EVALUATE,因此有一些方法可以在不使用VBA的情况下访问单元格公式中EVALUATE的功能。
Evaluate的基本功能如下:
1.将数学表达式字符串转换为值。
2.将一维和二维字符串数组转换为它们的等效数组。
3.能够处理工作表单元格可以处理的任何公式。
真的,它可以做单元格能做的任何事情!它包含工作表单元格的所有功能,而“该单元格”包含在VBA命令中。事实上,它甚至可以做单元格不能做的事:可以返回整个数组。
下面分别是Evaluate的简写和显式用法,展示了如何使用Evaluate返回和赋值数组:
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允许处理公式:
'行为类似单元格的用户窗体文本框
'允许一个文本框里包含另一个文本框要用的公式
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处理自定义函数:
Sub EvalUDF()
MsgBox Evaluate("MyUDF()")
End Sub
Function MyUDF() As String
MyUDF = "Hi!完美Excel"
End Function
注:本文整理自ozgrid.com论坛,供有兴趣的朋友研究。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有