Das folgende Makro erhält eine Eingabe (Ticker) und übersetzt sie in den Ländernamen. Nach der Eingabe werden alle If Bedingungen durchlaufen. Wie kann ich verhindern, dass das Makro alle Ifs durchläuft, wenn die Bedingung zuerst If erfüllt ist?

Zum Beispiel: Makro erhält Eingabe "BU", nachdem die erste If Variable UT JETZT zu "BULGARIEN" wird. Ich muss hier anhalten und am Ende der letzten {{X2} springen. }. wie wird es gemacht Gibt es eine andere Möglichkeit, diese Situation anzugehen?

ST:
T = InputBox("Country Ticker?", "Finding country name using a Ticker", "Write Country Name to Transfer Data")

ut = UCase(T)
'Dim C As Integer
C = Len(T)

If T = "Write Country Name to Transfer Data" Then
MsgBox "No Country Name Input"
GoTo ST

ElseIf ut = "" Then
Exit Sub

ElseIf C < 2 Then
MsgBox "Wrong Country Name :) Please Try Again!"
GoTo ST
End If

If ut = "BU" Then ut = "BULGARIA"
If ut = "AR" Then ut = "ARGENTINA"
If ut = "CI" Then ut = "CHILE"
If ut = "CB" Then ut = "COLOMBIA"
If ut = "CZ" Then ut = "CROATIA"
If ut = "CP" Then ut = "CZECH REPUBLIC"
If ut = "ET" Then ut = "ESTONIA"
If ut = "HB" Then ut = "HUNGARY"
If ut = "IQ" Then ut = "IRAQ"
If ut = "KN" Then ut = "KENYA"
If ut = "LR" Then ut = "LATVIA"
If ut = "LH" Then ut = "LITHUANIA"
If ut = "MM" Then ut = "MEXICO"
If ut = "NL" Then ut = "NIGERIA"
If ut = "PW" Then ut = "POLAND"
If ut = "RO" Then ut = "ROMANIA"
If ut = "RM" Then ut = "RUSSIA"
If ut = "RU" Then ut = "RUSSIA"
If ut = "RX" Then ut = "RUSSIA"
If ut = "SJ" Then ut = "SOUTH AFRICA"
If ut = "TI" Then ut = "TURKEY"
If ut = "UG" Then ut = "UGANDA"
If ut = "UZ" Then ut = "UKRAINE"
If ut = "ZH" Then ut = "ZIMBABWE"
If ut = "AB" Then ut = "SAUDI ARABIA"
If ut = "EY" Then ut = "EGYPT"
If ut = "OM" Then ut = "OMAN"
If ut = "QD" Then ut = "QATAR"
If ut = "UH" Then ut = "UNITED ARAB EMIRATES"
If ut = "DU" Then ut = "UNITED ARAB EMIRATES"
If ut = "KK" Then ut = "KUWAIT"
If ut = "BI" Then ut = "BAHRAIN"
If ut = "JR" Then ut = "JORDAN"
If ut = "MC" Then ut = "MOROCCO"
If ut = "TZ" Then ut = "TANZANIA"
If ut = "RW" Then ut = "RWANDA"
If ut = "CD" Then ut = "COTE D IVOIRE"
If ut = "ZL" Then ut = "Zambia"
If ut = "SG" Then ut = "Serbia"
If ut = "NW" Then ut = "NAMIBIA"
If ut = "GN" Then ut = "GHANA"
If ut = "TP" Then ut = "TRINIDAD & TOBAGO"
If ut = "GA" Then ut = "GREECE"
If ut = "PS" Then ut = "PALESTINE"
If ut = "NO" Then ut = "NOTABLE RESEARCH"
C = Len(ut)
If C < 3 Then Exit Sub
0
Ibn e Ashiq 19 Jän. 2019 im 09:25

5 Antworten

Beste Antwort

Use Select Case

Select Case ut
    Case "DU","UH"
        ut = "UNITED ARAB EMIRATES"
    Case "BU"
        ut = "BULGARIA"
    Case "AR"
        ut = "ARGENTINA"
        '...
End Select

Sie können auch ein Wörterbuch verwenden, in dem die Abkürzung, z. BU ist der Schlüssel und der Ersatz ist der Wert.

Beispiel mit Wörterbuch:

Dim dict As Object, ut As String
Set dict = CreateObject("Scripting.Dictionary")
dict.Add "BU", "Bulagaria"
dict.Add "AR", "Argentina"
'etc

'Example
ut = "AR"
If dict.Exists(ut) Then ut = dict(ut)
3
QHarr 19 Jän. 2019 im 07:29

Nach dem ersten If sollten alle anderen ElseIf sein. Der "Else" -Teil davon führt dazu, dass es übersprungen wird, wenn ein vorheriger If-Test wahr war.

1
Bob Jacobsen 19 Jän. 2019 im 06:28

Diese Frage ließ mich überlegen, welche Lösung zwischen Select Case und ElseIf schneller funktionieren würde (Ich habe zuvor einen Vergleich zwischen Long und Integer durchgeführt). Ich habe einige Tests mit einer Reihe von Select Case Code durchgeführt und mit ähnlichem ElseIf Code verglichen.

Vorhersehbar gab es keinen großen Unterschied, aber Select Anweisungen liefen immer etwas langsamer als ElseIf. Ich habe ein paar Iterationen von ungefähr 6 Milliarden Fallprüfungen durchgeführt, und der Unterschied schien konsistent zu sein.

Ich bezweifle, dass dieses Delta von ein paar Sekunden bei solch einem massiven Volumen es jemals wert ist, von dem Ansatz abzuweichen, mit dem Sie sich am wohlsten fühlen. Hier sind jedoch meine Ergebnisse und der Code, den ich verwendet habe, wenn jemand neugierig ist:

enter image description here

'Module variables
Dim beginTIme As Double, i As Long, r As Long
Const MaxValue As Long = 999999999

Sub goSelect()
    beginTIme = Now

    For i = 0 To MaxValue
        r = r Mod 12

        Select Case r
            Case 0
            Case 1
            Case 2
            Case 3
            Case 4
            Case 5
            Case 6
            Case 7
            Case 8
            Case 9
            Case 0
            Case 11
        End Select

    Next i

    With Cells(Rows.Count, 1).End(xlUp)
        .Offset(1, 0).Value = Round((Now - beginTIme) * 3600 * 24, 0) & " seconds using select."
        .Offset(1, 1).Value = MaxValue
    End With

End Sub


Sub go4If()
    beginTIme = Now

    For i = 0 To MaxValue
        r = r Mod 12

        If r = 0 Then
            ElseIf r = 1 Then
            ElseIf r = 2 Then
            ElseIf r = 3 Then
            ElseIf r = 4 Then
            ElseIf r = 5 Then
            ElseIf r = 6 Then
            ElseIf r = 7 Then
            ElseIf r = 8 Then
            ElseIf r = 9 Then
            ElseIf r = 10 Then
            ElseIf r = 11 Then
        End If

    Next i

    With Cells(Rows.Count, 3).End(xlUp)
        .Offset(1, 0).Value = Round((Now - beginTIme) * 3600 * 24, 0) & " seconds using elseif."
        .Offset(1, 1).Value = MaxValue
    End With

End Sub
'Yeah this is what I'm doing on Saturday night....🎉
1
PGSystemTester 20 Jän. 2019 im 01:40

Sie könnten eine Case Anweisung verwenden:

Select Case ut
Case "BU"
    ut = "BULGARIA"
Case "AR"
    ut = "ARGENTINA"
...
End Select

Sie könnten auch verwenden, wenn sonst:

If ut = "BU" Then
    ut = "BULGARIA"
ElseIf ut = "AR" Then
    ut = "ARGENTINA"
ElseIf
    ...
End If
0
Tim Biegeleisen 19 Jän. 2019 im 06:30

Sie können entweder Folgendes verwenden:

If ut = "BU" Then
   ut = "Bulgaria"
Elseif ut ="ZL" Then
   ut = "Zambia"
...
End If

Aber bei so vielen Bedingungen würde ich die Anweisung Select empfehlen. Auf diese Weise müssen Sie die Variable nur einmal schreiben und haben ein Case Else, wenn keine Bedingung erfüllt ist:

Select Case ut
   Case "ZL"
       ut = "Zambia"
   Case "BU"
        ...
   ....
   Case Else
       Msgbox "Country not found"
End Select
0
Strawberryshrub 19 Jän. 2019 im 06:41