正如我在 cmets 中所说的,其他人也提到过,VBA 语法不允许您定义新的中缀运算符。
你从来没有说过你想这样做是为了什么,但我不禁认为你有一个自定义排序,其中比较运算符被传递给排序子。想想在 C 中是如何处理这些事情的(这也不允许您定义新的中缀运算符)。标准库有一个qsort 的实现,它需要传递一个指向比较函数的指针。您可以在 VBA 中做类似的事情。
VBA 缺少函数指针——但是Application.Run(在某些方面比Application.Evaluate 更灵活)允许您使用函数的名称,就像它是一个指针一样。例如,假设您编写了一个比较函数,该函数接受双精度,并根据全局参数的状态返回其中较大的或较小的,如下所示:
Public AZ As Boolean 'a global sort-order flag
Function compare(x As Double, y As Double) As Boolean
compare = IIf(AZ, (x < y), (y < x))
End Function
为了说明Application.Run 是如何让您传递自定义比较函数的,我编写了一个函数,该函数接受比较函数的名称以及数组,并根据排序返回数组中最大的元素由比较函数确定的顺序。比较函数可以是相当任意的,例如它可以返回树数组中高度最大的树:
Function Most(comp As String, items As Variant) As Variant
Dim i As Long, candidate As Variant, item As Variant
Dim lb As Long, ub As Long
lb = LBound(items)
ub = UBound(items)
candidate = items(lb)
For i = lb + 1 To ub
item = items(i)
If Application.Run(comp, candidate, item) Then
candidate = item
End If
Next i
Most = candidate
End Function
下面的 sub 说明了它是如何被调用的:
Sub test()
Dim A As Variant
A = Array(3, 6, 2, 8, 11, 15, 1, 10)
AZ = True
Debug.Print Most("compare", A) 'prints 15
AZ = False
Debug.Print Most("compare", A) 'prints 1
End Sub