6

関数またはメソッドでoperatorsとして渡したいいくつかのシナリオに出くわしました。この投稿によると、Java にはその機能がないため、主要な回避策としてを作成する必要があります。parameterEnum

例えば

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

VBA のライブラリは .Net や Java に比べてはるかに少ないですが、作成Enumは十分にサポートされています。おそらく私は気づいていないので、そのVBAにある可能性やoperator types他の回避策がある場合は、それan operatorを撃ってください.ここに記載されているものとは異なりますif elsecase

  • コードの削減、最適化に関して質問があります。

例えば ​​を見れば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            

操作するタイプがわかっている場合は、インターフェイスDoubleの代わりに使用したい場合があることに注意してください。Variant

于 2013-01-23T16:09:57.533 に答える
2

LogicalOperator 型、ArithmeticOperator 型などはありません。最も近いのは、MS Access VBA の関数またはExcel VBAEvalの (似ているが異なる)関数を使用することです。Evaluate

Evaluate実際、 Excel でこの関数を知らずに使用したことがあるかもしれません。Excel ヘルプ ファイルから:

角かっこ ("[A1:C5]" など) を使用することは、文字列引数を指定して Evaluate メソッドを呼び出すことと同じです。たとえば、次の式のペアは同等です。

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

どうすれば問題を解決できますか

1) Microsof Script Controller 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 に答える