ElseIf触发时不应该

时间:2018-03-11 16:11:19

标签: excel-vba if-statement vba excel

我正在编写一个脚本,允许用户通过名称或编号输入月份。在下面的语句中,我可以在输入框和行中输入我想要的任何内容:

    ElseIf sMonthOfMaintenance = "1" Or "2" Or "3" Or "4" Or "5" Or "6" Or "7" Or "8" Or "9" Or "10" Or "11" Or "12" Then
        sMonthOfMaintenanceNumber = sMonthOfMaintenanceNumber

总会触发。我可以在输入框中键入“SREGBswerbwergv”,它仍然会触发该行而不会移动到“Else”语句。我重新启动excel以防万一,它仍然会这样做,但如果我发表评论,那就不行了。完整的代码:

'...and date of report.[BD]
sMonthOfMaintenance = InputBox("What month are you reveiwing?")

'Ending Wizard if Cancelled [BD]
If sMonthOfMaintenance = "" Then

    MsgBox "Operation cancelled"
    End

End If

'Converting Month to Number for Output File Name [BD]
If UCase(sMonthOfMaintenance) = "JANUARY" Or UCase(sMonthOfMaintenance) = "JAN" Or UCase(sMonthOfMaintenance) = "JAN" Then
        sMonthOfMaintenanceNumber = "01"
    ElseIf UCase(sMonthOfMaintenance) = "FEBRUARY" Or UCase(sMonthOfMaintenance) = "FEB" Or UCase(sMonthOfMaintenance) = "FEB." Then
        sMonthOfMaintenanceNumber = "02"
    ElseIf UCase(sMonthOfMaintenance) = "MARCH" Or UCase(sMonthOfMaintenance) = "MAR" Or UCase(sMonthOfMaintenance) = "MAR." Then
        sMonthOfMaintenanceNumber = "03"
    ElseIf UCase(sMonthOfMaintenance) = "APRIL" Or UCase(sMonthOfMaintenance) = "APR" Or UCase(sMonthOfMaintenance) = "APR." Then
        sMonthOfMaintenanceNumber = "04"
    ElseIf UCase(sMonthOfMaintenance) = UCase(sMonthOfMaintenance) = "MAY" Or UCase(sMonthOfMaintenance) = "MAY." Then
        sMonthOfMaintenanceNumber = "05"
    ElseIf sMonthOfMaintenance = "JUNE" Or UCase(sMonthOfMaintenance) = "JUN" Or UCase(sMonthOfMaintenance) = "JUN." Then
        sMonthOfMaintenanceNumber = "06"
    ElseIf sMonthOfMaintenance = "JULY" Or UCase(sMonthOfMaintenance) = "JUL" Or UCase(sMonthOfMaintenance) = "JUL." Then
        sMonthOfMaintenanceNumber = "07"
    ElseIf sMonthOfMaintenance = "AUGUST" Or UCase(sMonthOfMaintenance) = "AUG" Or UCase(sMonthOfMaintenance) = "AUG." Then
        sMonthOfMaintenanceNumber = "08"
    ElseIf sMonthOfMaintenance = "SEPTEMBER" Or UCase(sMonthOfMaintenance) = "SEP" Or UCase(sMonthOfMaintenance) = "SEP." Then
        sMonthOfMaintenanceNumber = "09"
    ElseIf sMonthOfMaintenance = "OCTOBER" Or UCase(sMonthOfMaintenance) = "OCT" Or UCase(sMonthOfMaintenance) = "OCT." Then
        sMonthOfMaintenanceNumber = "10"
    ElseIf sMonthOfMaintenance = "NOVEMBER" Or UCase(sMonthOfMaintenance) = "NOV" Or UCase(sMonthOfMaintenance) = "NOV." Then
        sMonthOfMaintenanceNumber = "11"
    ElseIf sMonthOfMaintenance = "DECEMBER" Or UCase(sMonthOfMaintenance) = "DEC" Or UCase(sMonthOfMaintenance) = "DEC." Then
        sMonthOfMaintenanceNumber = "12"
    ElseIf sMonthOfMaintenance = "01" Or "02" Or "03" Or "04" Or "05" Or "06" Or "07" Or "08" Or "09" Or "10" Or "11" Or "12" Then
        sMonthOfMaintenanceNumber = sMonthOfMaintenanceNumber
Else
    MsgBox "Please Enter a Valid Month"
    Call Main
End If

2 个答案:

答案 0 :(得分:3)

每次像上面的其他人一样,你需要重复整个条件,例如,sMonthOfMaintenance =" 01"或者sMonthOfMaintenance =" 02" ......就像现在一样," 02"评估为TRUE。尝试使用SELECT CASE来缩短语法。我也看到你尝试将数字分配到最后,我不认为你打算这样做。以下是所有这些的示例:

Sub test()
Dim sMonthOfMaintenance As String
Dim sMonthOfMaintenanceNumber As String

sMonthOfMaintenance = InputBox("What month are you reveiwing?")

'Ending Wizard if Cancelled [BD]
If sMonthOfMaintenance = "" Then
    MsgBox "Operation cancelled"
    GoTo exit_point
End If

'Converting Month to Number for Output File Name [BD]
Select Case UCase(sMonthOfMaintenance)
   Case "JANUARY", "JAN", "JAN."
        sMonthOfMaintenanceNumber = "01"
   Case "FEBRUARY", "FEB", "FEB."
        sMonthOfMaintenanceNumber = "02"
'...
   Case "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"
        sMonthOfMaintenanceNumber = sMonthOfMaintenance
   Case Else
    MsgBox "Please Enter a Valid Month"
    'Call Main
End Select
Debug.Print sMonthOfMaintenanceNumber
exit_point:
End Sub

答案 1 :(得分:1)

您不需要任何 If() 。只需将文本月份转换为日期并从中获取数字月份:

Sub qwerty()
    Dim sMonthOfMaintenance As String
    Dim sMonthOfMaintenanceNumber As String

    sMonthOfMaintenance = Application.InputBox(Prompt:="enter month name ", Type:=2)

    sMonthOfMaintenanceNumber = Format(Month(DateValue("1 " & Left(UCase(sMonthOfMaintenance), 3) & " 1992")), "00")

    MsgBox sMonthOfMaintenance & vbCrLf & sMonthOfMaintenanceNumber
End Sub

enter image description here

您可以输入以下任何内容:


JAN
一月
JAN点。
JANUARY
一月

如果您还想允许逐个数字的输入,则必须添加一个单独的分支来测试数字输入:

Sub qwerty()
    Dim sMonthOfMaintenance As String
    Dim sMonthOfMaintenanceNumber As String

    sMonthOfMaintenance = Application.InputBox(Prompt:="enter month name ", Type:=2)

    If IsNumeric(sMonthOfMaintenance) Then
        sMonthOfMaintenanceNumber = Format(CLng(sMonthOfMaintenance), "00")
    Else
        sMonthOfMaintenanceNumber = Format(Month(DateValue("1 " & Left(UCase(sMonthOfMaintenance), 3) & " 1992")), "00")
    End If

    MsgBox sMonthOfMaintenance & vbCrLf & sMonthOfMaintenanceNumber
End Sub