当条件在第一个 IF 满足时跳转到 IF 语句的末尾

Jumping to the end of IFs-statements when condition met at first IF

以下宏获取输入 (Ticker) 并将其转换为国家/地区名称。获得输入后,它会通过所有 If 条件。当条件最初 If 时,我如何阻止宏遍历所有 Ifs

例如: 宏在第一个 If 变量 UT 变成 "BULGARIA" 之后得到输入 "BU" 现在我需要停止在这里并跳转到最后 If 的末尾。它是如何完成的?有没有其他方法可以解决这种情况?

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

第一个If之后,其他的都应该是ElseIf。如果先前的 If 测试为真,则其中的“Else”部分会导致它被跳过。

使用Select大小写

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

您也可以考虑使用字典,其中缩写如BU是key,replacement是value。

字典示例:

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)

您可以使用 Case 语句:

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

你也可以使用 if else:

If ut = "BU" Then
    ut = "BULGARIA"
ElseIf ut = "AR" Then
    ut = "ARGENTINA"
ElseIf
    ...
End If

您可以使用:

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

但在这么多条件下,我会推荐 Select 声明。这样你只需要写一次变量,当没有满足条件时你有一个 Case Else:

Select Case ut
   Case "ZL"
       ut = "Zambia"
   Case "BU"
        ...
   ....
   Case Else
       Msgbox "Country not found"
End Select

这个问题让我考虑在 Select CaseElseIf (I previously did a comparison of Long vs Integer) 之间哪个解决方案执行得更快。我 运行 对一堆 Select Case 代码进行了一些测试,并与类似的 ElseIf 代码进行了比较。

可以预见,差别不大,但是 Select 语句总是 运行 ElseIf 稍慢 。我对大约 60 亿个案例检查进行了几次迭代,差异似乎是一致的。

我怀疑在如此巨大的体积上的这几秒钟的增量是否值得偏离您最熟悉的任何方法。但是,如果有人好奇的话,这是我的结果和我使用的代码:

'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....