当条件在第一个 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 Case
和 ElseIf
(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....
以下宏获取输入 (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 Case
和 ElseIf
(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....