如果总是,值将被最后一个值覆盖

时间:2020-05-29 10:08:19

标签: excel vba

我尝试使用多个if-then-else块,但出现了“ else without if”问题,然后我将其更改为以下代码,但它始终给出if值,它不会在第一个“ safe”值处退出

Range("AD" & i - 1).Select
Range("AD" & i - 1).Value = 0.3
If Range("AN" & i - 1) = "Safe" Then
Range("AD" & i - 1).Value = 0.3
ElseIf Range("AN" & i - 1) = "Not Safe" Then Range("AD" & i - 1).Value = 0.35
End If
If Range("AN" & i - 1) = "Safe" Then
Range("AD" & i - 1).Value = 0.35
ElseIf Range("AN" & i - 1) = "Not Safe" Then Range("AD" & i - 1).Value = 0.4
End If
If Range("AN" & i - 1) = "Safe" Then
Range("AD" & i - 1).Value = 0.4
ElseIf Range("AN" & i - 1) = "Not Safe" Then Range("AD" & i - 1).Value = 0.45
End If
If Range("AN" & i - 1) = "Safe" Then
Range("AD" & i - 1).Value = 0.45
ElseIf Range("AN" & i - 1) = "Not Safe" Then Range("AD" & i - 1).Value = 0.5
End If

Image

以下代码是最后一个的替代方法

Range("AD" & i - 1).Value = 0.3
If Range("AN" & i - 1) = "Safe" Then
Range("AD" & i - 1).Value = 0.3
ElseIf Range("AN" & i - 1) = "Not Safe" Then Range("AD" & i - 1).Value = 0.35
ElseIf Range("AN" & i - 1) = "Safe" Then Range("AD" & i - 1).Value = 0.35
ElseIf Range("AN" & i - 1) = "Not Safe" Then Range("AD" & i - 1).Value = 0.4
ElseIf Range("AN" & i - 1) = "Safe" Then Range("AD" & i - 1).Value = 0.4
ElseIf Range("AN" & i - 1) = "Not Safe" Then Range("AD" & i - 1).Value = 0.45
ElseIf Range("AN" & i - 1) = "Safe" Then Range("AD" & i - 1).Value = 0.45
End If   

但是在仅给出值0.35并且不寻找下一行之后退出

1 个答案:

答案 0 :(得分:3)

这是您的原始代码缩进:

Sub Test()

    Range("AD" & i - 1).Select
    Range("AD" & i - 1).Value = 0.3

    If Range("AN" & i - 1) = "Safe" Then
        Range("AD" & i - 1).Value = 0.3
    ElseIf Range("AN" & i - 1) = "Not Safe" Then
        Range("AD" & i - 1).Value = 0.35
    End If

    If Range("AN" & i - 1) = "Safe" Then
        Range("AD" & i - 1).Value = 0.35
    ElseIf Range("AN" & i - 1) = "Not Safe" Then
        Range("AD" & i - 1).Value = 0.4
    End If

    If Range("AN" & i - 1) = "Safe" Then
        Range("AD" & i - 1).Value = 0.4
    ElseIf Range("AN" & i - 1) = "Not Safe" Then
        Range("AD" & i - 1).Value = 0.45
    End If

    If Range("AN" & i - 1) = "Safe" Then
        Range("AD" & i - 1).Value = 0.45
    ElseIf Range("AN" & i - 1) = "Not Safe" Then
        Range("AD" & i - 1).Value = 0.5
    End If

End Sub

此代码可以转换为以下代码:

Sub Test2()

    Range("AD" & i - 1) = 0.3
    If Range("AN" & i - 1) = "Safe" Then
        Range("AD" & i - 1).Value = 0.3
        Range("AD" & i - 1).Value = 0.35
        Range("AD" & i - 1).Value = 0.4
        Range("AD" & i - 1).Value = 0.45
    ElseIf Range("AN" & i - 1) = "Not Safe" Then
        Range("AD" & i - 1).Value = 0.35
        Range("AD" & i - 1).Value = 0.4
        Range("AD" & i - 1).Value = 0.45
        Range("AD" & i - 1).Value = 0.5
    End If

End Sub

如您所见,您仅检查Range("AN" & i - 1)的值,并且仅检查其安全性。那么转换后的代码会做什么? 如果安全的话:

Range("AD" & i - 1).Value = 0.3
Range("AD" & i - 1).Value = 0.35
Range("AD" & i - 1).Value = 0.4
Range("AD" & i - 1).Value = 0.45

这意味着Range("AD" & i - 1)的值将是最后一个,因为VBA将逐行运行。

如果不安全,同样会发生。

因此,您需要检查不同的条件,或检查不同的单元格或为不同的单元格赋值。

编辑:至于OP的评论和目标,这应该可以解决问题:

Sub Test2()

    'Here we have the values that we will input to turn the cell AN Safe
    'If needed you can change (1 to 4) to (1 to x) yo increment or decrement the values
    Dim Values(1 To 4) As Single

    'here we populate the array with the values:
    Values(1) = 0.35
    Values(2) = 0.4
    Values(3) = 0.45
    Values(4) = 0.5

    'A Range variable to loop through the cells in column AD from row 13 to the last
    Dim C As Range
    Dim i As Long
    With ThisWorkbook.Sheets("Med Drain - 246 to 264 Km")
        For Each C In .Range("AD13", .Cells(.Rows.Count, "AD").End(xlUp))
            'Here we check if AN is safe or empty to ignore the row if true
            If .Cells(C.Row, "AN") = vbNullString Or .Cells(C.Row, "AN") = "Safe" Then GoTo SkipRow
            'Now we loop through the values inside the Values array and change the AD cell value
            For i = LBound(Values) To UBound(Values)
                'Change AD Value for the first in our array
                C = Values(i)
                'Recalculate the formulas
                .Calculate
                'If AN is now Safe then we exit this inner loop
                If .Cells(C.Row, "AN") = "Safe" Then Exit For
            Next i
SkipRow:
        Next C
    End With

End Sub