excel方括号在VBA中的妙处( 二 )


而如果使用Evaluate方法并忽略“=”号,在工作表中的公式可以直接复制到代码中:
Evaluate(“VLOOKUP(D1,A1:B4,2,FALSE)”)
或者:
[VLOOKUP(D1,A1:B4,2,FALSE)]
因此,对于很复杂的公式来说,使用Evaluate方法将其转换到VBA代码中将更方便,否则要修改为符合VBA语法的形式就需要大量的工作 。
4. 代码更有效率
下面的代码将101至200的数值输入到单元格区域A1:A100:
[A1:A100] = [ROW(101:200)]
下面的代码将101至200的数值赋给一个Variant数组:
varArray = [ROW(101:200)]
它们都比使用循环更有效率 。
5. 调用在运行时才创建的子过程
如果想要调用在运行时才创建子过程,由于这个子过程在编译时不存在,因此会导致编译时错误 。虽然Run(“子过程名”)不会导致编译时错误,但如果在运行时代码还不存在,就会产生运行时错误 。
而[子过程名]不会导致编译时或者运行时错误 。
因此,如果仅当满足某种条件时才创建某子过程的情形下,并且另一子过程使用的值要从调用该子过程中获取 。如果该子过程存在则调用它,如果不存在则继续运行,此时,Evaluate方法是调用该子过程的唯一选择 。
Evaluate方法的使用
正如已经述的内容,Evaluate方法主要用于两种情形 。
情形1:Evaluate( 公式 )
评估公式表达式或者值,并转换为值 。
实际上,Evaluate方法在用于计算时,允许创建“虚拟单元格”,作为VBA代码与工作表公式之间的接口 。这些虚拟单元格允许VBA访问和直接处理当前工作簿中每个工作表函数,因此提供了一种允许仅用一两行VBA代码就替换成千行公式的方法 。
情形2:Evaluate( 对象名 )
将代表对象的对象名转换为对象 。
下面是Evaluate方法的一些基本应用示例 。
示例1:从关闭的工作簿中取值
下面的代码从当前工作簿所在文件夹的工作簿test.xlsx中获取值 。
Sub GetValueFromClosedWB()
With [Sheet2!A1:A5]
.Value = https://www.i8ku.com/2021/“='” &ActiveWorkbook.Path & “\[test.xlsx]Sheet1′!A1:A5”
.Value = https://www.i8ku.com/2021/.Value ‘移除对原工作簿的链接
End With
End Sub
示例2:提取名称中的值
下面的代码首先创建一个名为“我的 ”的名称,其内容为“ Excel”,然后在当前工作表的单元格A1中输入值,最后使用Evaluate方法将A1中的值和名称的内容连接并显示 。
Sub GetNameValue()
ThisWorkbook.Names.Add “我的 “,” Excel”
Range(“A1”).Value = https://www.i8ku.com/2021/“我的是”
MsgBox Evaluate(“A1 & 我的 “)
End Sub
或者将最后一行代码替换为简写形式:
MsgBox [A1 & 我的 ]
运行后的结果如图2 。

excel方括号在VBA中的妙处

文章插图
图2
示例3:调用函数过程并从中获取值
下面的代码演示了调用子函数过程,并将返回的值加上100 。
Sub CallFunc()
MsgBoxEvaluate(“testFunc(100)+100”)
MsgBox [testFunc(100)+100]
End Sub
Function testFunc(i As Long)
testFunc = i + 10
End Function
运行后的效果如下图3 。
excel方括号在VBA中的妙处

文章插图
图3
示例4:使用变量
下面的简单示例演示了在Evaluate方法中使用变量的基本方法 。
下面的代码显示当前工作表单元格B1至B10中的值 。
Sub testGetVarValue()
Dim i As Long
For i = 1 To 10
MsgBox Evaluate(“B” & i)
Next i
End Sub

推荐阅读