VBA中的动态运算符.我怎么能够?

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)


Mat*_*don 3

您的想法是错误的: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]- 因此编译错误。

但你已经知道了。


swt = True
op = IIf(swt = True, "<", ">")
Run Code Online (Sandbox Code Playgroud)

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当然,也需要处理边缘情况。