Значение имеет приоритет над последним, если всегда - PullRequest
0 голосов
/ 29 мая 2020

Я пытался использовать несколько блоков if-then-else, но это дало проблему «else без if», тогда я изменил его на следующий код, но он всегда дает последнее значение if, он не выходит при первом «безопасном» значении .

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 Ответ

3 голосов
/ 29 мая 2020

Это ваш исходный код с отступом:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...