2013-01-23 5 views
6

Kam über einige Szenarien, die man operators als parameter in einer Funktion oder einer Methode übergeben möchte. According to this post Java doesn't have that ability, hence need to create an Enum as the primary workaround.Gibt es eine Möglichkeit, arithmetische und logische Operatoren als Methodenparameter in VBA zu übergeben?

z.

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

Obwohl VBA hat viel geringeren Bibliotheken im Vergleich zu .Net, Java, die Erstellung Enum wird ebenfalls unterstützt. Vielleicht ist mir nicht bekannt, also, wenn es eine Möglichkeit gibt, dass VBA operator types oder andere Problemumgehungen hat, könnten wir an operator passieren, schieße das in. (Außer if else/case, um eine Zeichenfolge zu überprüfen, die den Operatorparameter enthält .. =)) Was Ich frage ist different from what's mentioned here.

  • Frage wird in Bezug auf die Reduzierung von Codes, Optimierung gefragt.

z. Wenn Sie CountIFS betrachten, hat es die Möglichkeit, operators aufzunehmen. Selbst wenn jemand die mögliche Back-End-Arbeit in dieser Funktion, erklären kann

  1. Wie funktioniert diese Strings in eine richtige operator konvertieren?
  2. Ist das eine Enum Struktur oder etwas effizienter als das oder weniger als das?

Eine Antwort auf diese Fragen ist noch akzeptabel.

+0

Dies hängt wirklich davon ab, was Sie mit dem Parameter innerhalb der Funktion tun. Die nützlichste Sache, die ich mir vorstellen kann, mit einem konzeptionellen Operator zu tun, der als Parameter übergeben wird, ist, ihn als Rückruf zu verwenden. Zum Beispiel habe ich vielleicht eine Funktion 'get3op2()', die einen binären Operator wie '+' oder '*' akzeptiert und das Ergebnis der Verwendung dieses Operators für vordefinierte Operanden wie '3' und' 2' zurückgibt . Dann würde hypothetisch "get3op2 (+)" 5 (d. H. 3 + 2) zurückgeben, während "get3op2 (*)" 6 zurückgeben würde (d. H. 3 · 2). Ist es das, was du versuchst? – psmay

+0

Hinweis: Eine enum typisierte Struktur enthält lediglich eine Liste von beschreibenden Konstantennamen als Wert für Konstanten mit langer Länge. Was Ihre Frage betrifft, sehe ich nicht wirklich den zusätzlichen Nutzen einer Enumeration. Wie für die Frage, ob es möglich ist, einen Operator direkt zu übergeben: es ist nicht in VBA. Was die Problemumgehung betrifft, ja, es gibt, wo eval wäre die beste Option wie erwähnt. Sonst verstehe ich vielleicht nicht die eigentliche Frage ... – Trace

+0

@Kim gibt es zwei Fragen: '1.' Die Operatoren als Parameter' 2.' Der Mechanismus hinter der Operator-Auswertung 'CountIFS'. – bonCodigo

Antwort

2

Ein Ansatz Klassen lösen würde:

Definieren Sie eine Interface-Klasse

Op

Public Function eval(operand1, operand2) 
End Function 

für jeden gewünschten Operator, eine Implementierung definieren.Zum Beispiel

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 

nun einige Testroutinen in einem Modul:

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 

Outpu t:

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

2    3    4    
3    4    5    
4    5    6    

Hinweis Sie möchten vielleicht z. Double anstelle von Variant in der Schnittstelle, wenn Sie wissen, auf welchem ​​Typ Sie arbeiten werden.

+0

+1 für den Klassenansatz, musste man die frühere Antwort allerdings nicht löschen. Für die Anfangsphase ist 'Double' ausreichend, aber danke für die' Variante'. Wenn man den Mechanismus erklären kann, der hinter einer Funktion wie "CountIfs" steht, ist das großartig, da ich auf den Leistungsaspekt scharf bin. Ich werde deine testen und einen weiteren Kommentar abgeben =) – bonCodigo

2

Es gibt keinen LogicalOperator-Typ, ArithmeticOperator-Typ oder etwas Ähnliches. Über die nächste, die Sie kommen können, ist die Verwendung der Eval Funktion in MS Access VBA oder der (ähnlich aber anders) Evaluate Funktion in Excel VBA.

Tatsächlich haben Sie wahrscheinlich die Evaluate Funktion in Excel verwendet, ohne es zu merken. Aus der Excel-Hilfedatei:

Hinweis Mit eckigen Klammern (zB "[A1: C5]") ist identisch, die Evaluate-Methode mit einem String-Argumente zu nennen. Zum Beispiel sind die folgenden Ausdruckspaare gleichwertig.

[a1].Value = 25 
Evaluate("A1").Value = 25 
+0

+1 für 'eval' und' evaluate' und Erklärung, obwohl es nicht ganz das ist, wonach ich bin. – bonCodigo

2

Wie ich die Sache

1) Verweisen Sie auf das Microsof Script Controler 1.0 Bibliothek

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 
+0

Dies ist eine andere Möglichkeit, dieselbe "Eval" -Funktion einzufügen, die von beiden anderen Antworten erwähnt wurde. Auch das Excel 'Evaluate'. Nichtsdestoweniger wäre es besser gewesen, wenn man auch die "logische" und "relationale" Operatorenauswertung gezeigt hätte .... – bonCodigo

Verwandte Themen