excel 嵌套的ElseIf语句不在For Each循环内部触发

3phpmpom  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(78)

我试图弄清楚为什么嵌套的ElseIf语句在循环通过列时不会触发。该循环过早退出而不计算嵌套的ElseIf语句,从而导致列不被更新。我知道如果我把嵌套的ElseIf改为普通的If,它就会工作。但我想知道为什么。
以下是我的数据:

下面是我的代码:

Sub test1()

Dim x As Range
For Each x In Range("B2:B11"):
    If x.Value = 0 Then
        If x.Offset(0, -1).Value = "Ford" Then x.Value = 1001
        If x.Offset(0, -1).Value = "Toyota" Then x.Value = 1002
        If x.Offset(0, -1).Value = "Honda" Then x.Value = 1003
    
    ElseIf x.Value = 1 Then
        If x.Offset(0, 1) = "California" Then x.Value = 2001

        ElseIf x.Offset(0, 1) = "New York" Then x.Value = 6001

    End If
Next x

End Sub

谢谢你

pgky5nke

pgky5nke1#

当你在同一行的Then后面写一个带有命令的If语句时,你有一个单行的If语句。这些If语句不需要End If,它们在行尾“完成”。
您可以在同一行上有一个Else-分支(这使得它在大多数情况下不可读),但不能在同一行上有一个ElseIf。
因此,最后一个ElseIf-语句不是加州If的else分支,它被视为第一个If-语句的另一个ElseIf。它仅在x.Value = 0为False且x.Value = 1为False时执行(您的数据永远不会出现这种情况)。正确缩进后,您的代码为

If x.Value = 0 Then
    If x.Offset(0, -1).Value = "Ford" Then x.Value = 1001
    If x.Offset(0, -1).Value = "Toyota" Then x.Value = 1002
    If x.Offset(0, -1).Value = "Honda" Then x.Value = 1003
ElseIf x.Value = 1 Then
    If x.Offset(0, 1) = "California" Then x.Value = 2001
ElseIf x.Offset(0, 1) = "New York" Then x.Value = 6001

End If

看到你的问题了吗New York-分支永远不会命中,因为x始终为0或1。你可以写(就像你为汽车品牌所做的那样)

ElseIf x.Value = 1 Then
    If x.Offset(0, 1) = "California" Then x.Value = 2001
    If x.Offset(0, 1) = "New York" Then x.Value = 6001
End If

或者(我猜你已经试过了)

ElseIf x.Value = 1 Then
    If x.Offset(0, 1) = "California" Then 
        x.Value = 2001
    Else If x.Offset(0, 1) = "New York" Then 
        x.Value = 6001
    End If
End If

或使用一个选择情况下的内部部分(这是我会这样做)

Dim x As Range
For Each x In Range("B2:B11")
    If x.Value = 0 Then
        Select Case x.Offset(0, -1).Value
            Case "Ford": x.Value = 1001
            Case "Toyota": x.Value = 1002
            Case "Honda": x.Value = 1003
        End Select
    ElseIf x.Value = 1 Then
        Select Case x.Offset(0, 1).Value
            Case "California": x.Value = 2001
            Case "New York": x.Value = 6001
        End Select
    End If
Next

注意:For-语句末尾的冒号是超流利的。冒号表示在同一行上有另一个语句。

6ojccjat

6ojccjat2#

另一种替代多个IfElseIf的方法是使用Select Case,请参阅下面的修改代码:

Sub test1()

Dim x As Range

For Each x In Range("B2:B11"):
    If x.Value = 0 Then

        Select Case x.Offset(0, -1).Value
            Case "Ford"
                x.Value = 1001                
            Case "Toyota"
                x.Value = 1002                
            Case "Honda"
                x.Value = 1003            
        End Select
                
    ElseIf x.Value = 1 Then

        Select Case x.Offset(0, 1).Value
            Case "California"
                x.Value = 2001                
            Case "New York"
                x.Value = 6001                
        End Select        
    End If
Next x

End Sub

相关问题