6

遇到了几个想要operators作为parameter函数或方法传递的场景。根据这篇文章,Java 没有这种能力,因此需要创建一个Enum作为主要解决方法

例如

Function doCalcs(ByRef AND as LogicalOperator, ByRef greater ArithmeticOperator)

尽管与 .Net 相比,VBA 的库要少得多,但 JavaEnum还是很好地支持创建。也许我不知道,所以如果 VBA 有可能operator types或我们可以通过的任何其他解决方法an operator,请输入。(除了if else/case检查包含运算符参数的字符串.. =))我要问的是与这里提到的不同

  • 在减少代码,优化方面提出问题。

例如,如果你看CountIFS,它有能力接受operators即使有人可以解释此功能中可能的后端工作

  1. 它如何将这些字符串转换为正确的operator
  2. 那是一种Enum结构还是比它更有效或更有效的东西?

这些问题的答案仍然是可以接受的。

4

3 回答 3

3

使用类的方法:

定义接口类

Op

Public Function eval(operand1, operand2)
End Function

对于每个所需的运算符,定义一个实现。例如

OpMinus

Implements Op

Private Function Op_eval(operand1 As Variant, operand2 As Variant) As Variant
    Op_eval = operand1 - operand2
End Function

OpPlus

Implements Op

Private Function Op_eval(operand1 As Variant, operand2 As Variant) As Variant
    Op_eval = operand1 + operand2
End Function

现在模块中的一些测试例程:

Sub test()
    Dim Minus As New OpMinus
    Dim Plus As New OpPlus
    Dim o, v1, v2

    For Each o In Array(Minus, Plus)
        For Each v1 In Array(1, 2, 3)
            For Each v2 In Array(1, 2, 3)
                operate o, v1, v2
            Next
            Debug.Print ""
        Next
        Debug.Print ""
    Next
End Sub

Sub operate(ByVal operator As Op, operand1, operand2)
    Debug.Print operator.eval(operand1, operand2),
End Sub

输出:

 0            -1            -2            
 1             0            -1            
 2             1             0            

 2             3             4            
 3             4             5            
 4             5             6            

请注意,如果您知道您将在哪种类型上操作,您可能希望使用 egDouble而不是在界面中。Variant

于 2013-01-23T16:09:57.533 回答
2

没有 LogicalOperator 类型、ArithmeticOperator 类型或任何类似的类型。最接近的方法是使用EvalMS Access VBA 中的函数或 Excel VBA 中的(相似但不同的)Evaluate函数。

事实上,您可能已经Evaluate在 Excel 中使用过该功能,甚至没有意识到它。从 Excel 帮助文件:

注意 使用方括号(例如,“[A1:C5]”)与使用字符串参数调用 Evaluate 方法相同。例如,以下表达式对是等价的。

[a1].Value = 25
Evaluate("A1").Value = 25
于 2013-01-23T15:20:05.947 回答
2

我将如何解决问题

1) 参考 Microsof Script Controler 1.0 库

Option Explicit

Sub Base_Sub()

Dim iNumber1        As Integer
Dim iNumber2        As Integer
Dim iSum            As Integer
Dim iMultiply       As Integer
Dim dDivision       As Double
Dim iDifference     As Integer
Dim lPower          As Long

iNumber1 = 2
iNumber2 = 6

iSum = CalculateThis("+", iNumber1, iNumber2)
iMultiply = CalculateThis("*", iNumber1, iNumber2)
iDifference = CalculateThis("-", iNumber1, iNumber2)
dDivision = CalculateThis("/", iNumber1, iNumber2)
lPower = CalculateThis("^", iNumber1, iNumber2)

End Sub



Public Function CalculateThis(operator As String, iNumber1 As Integer, iNumber2 As Integer)

Dim script As ScriptControl

Set script = New ScriptControl
script.Language = "VBScript"

CalculateThis = script.Eval(iNumber1 & operator & iNumber2)

End Function
于 2013-01-23T15:31:54.003 回答