Joh*_*son 5 variables vba dynamic operator-keyword
如何使用VBA创建动态运算符?
swt = True
op = IIf(swt = True, "<", ">")
a = 10
B = 20
IF a op B then
MsgBox ("a is greater than B")
End If
Run Code Online (Sandbox Code Playgroud)
显然这会失败,但任何人都可以使它工作吗?
小智 5
使用基本的字符串连接方法构建一个简单的数学公式,将运算符作为字符串字符引入。一旦从字符串部分构造公式,就可以使用Application Evaluate解决它。
Dim swt As Boolean, op As String
Dim a As Long, b As Long
swt = False
op = IIf(swt, "<", ">")
a = 10
b = 20
If Application.Evaluate(a & op & b) Then
MsgBox ("a is " & IIf(swt, "less", "greater") & " than b")
Else
MsgBox ("a is " & IIf(swt, "greater than or equal to", "less than or equal to") & " b")
End If
Run Code Online (Sandbox Code Playgroud)
您的想法是错误的:VBA 语言语法不是这样工作的,运算符定义良好,当这一行被标记化时:
If a op B Then
Run Code Online (Sandbox Code Playgroud)
看到If关键字它会期望这样:
If [BoolExp] Then
Run Code Online (Sandbox Code Playgroud)
...然后碰到a op B并抛出一个合适的问题,因为a是一个标识符,op是一个标识符,并且B是另一个标识符 - 那里没有逻辑运算符,并且不能被评估为[BoolExp]- 因此编译错误。
但你已经知道了。
Run Code Online (Sandbox Code Playgroud)swt = True op = IIf(swt = True, "<", ">")
IIf工作原理类似:IIf([BoolExp], [ValueStmt], [ValueStmt])- 这里swt被分配给布尔文字True,它本身就构成了一个布尔表达式。因此, 的分配op可以简化为:
op = IIf(swt, "<", ">")
Run Code Online (Sandbox Code Playgroud)
现在它更漂亮了,但op仍然是一个String变量,而且这是行不通的。
除了让 Excel 完成工作之外Application.Evaluate,唯一的方法是在适用于所有 Office 主机的 VBA 代码中进行分支,即分支:
If swt Then
If a < b Then msg = "a is smaller than b"
Else
if a > b then msg = "a is greater than b"
End If
MsgBox msg
Run Code Online (Sandbox Code Playgroud)
a = b当然,也需要处理边缘情况。