Мой код для автоматического умножения ячеек на значение продолжает падать - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь умножить значения в одной ячейке на число, если другая ячейка имеет определенное строковое значение. Тем не менее, код продолжает падать, и я не уверен, что не так. Раньше у меня была простая подпрограмма, и она работала нормально, но затем я обновил ее до подпрограммы события, чтобы ячейка автоматически обновлялась при изменении строкового значения.

Private Sub Worksheet_Change(ByVal Target As Range)
    For Each cell In Range("I3:I" & Range("I3").End(xlDown).Row)
        If cell.Value = "gallons" Then
            cell.Offset(0, 1).Value = val(cell.Offset(0, -1)) * 0.00378541
        ElseIf cell.Value = "m3" Then
            cell.Offset(0, 1).Value = val(cell.Offset(0, -1))
        End If
    Next
End Sub

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

Каждое изменение, которое вы вносите в свою подпрограмму, будет снова вызывать событие, если только вы не отключите событие перед запуском каких-либо обновлений.

Private Sub Worksheet_Change(ByVal Target As Range)

    On Error Goto haveError
    Application.EnableEvents = False
    For Each cell In Range("I3:I" & Range("I3").End(xlDown).Row)
        If cell.Value = "gallons" Then
            cell.Offset(0, 1).Value = val(cell.Offset(0, -1)) * 0.00378541
        ElseIf cell.Value = "m3" Then
            cell.Offset(0, 1).Value = val(cell.Offset(0, -1))
        End If
    Next

haveError:
    Application.EnableEvents = True

End Sub
0 голосов
/ 25 апреля 2019

Я предполагаю, что причина
Private Sub Worksheet_Change(ByVal Target As Range).

Этот код запускается при каждом изменении значения.
И сам код изменяет значения, что означает, что он вызывает функцию снова и снова и снова.

Обязательно выключите вычисления, прежде чем изменять значения в этой функции.
Либо вручную, либо с помощью Application.calculation = xlCalculationManual

Вы также можете установить целевой диапазон.
Если у вас есть конкретная ячейка, которую вы используете в качестве «триггера», вы можете использовать if like:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" Then
        For Each cell In Range("I3:I" & Range("I3").End(xlDown).Row)
            If cell.Value = "gallons" Then

cell.Offset(0, 1).Value = val(cell.Offset(0, -1)) * 0.00378541
            ElseIf cell.Value = "m3" Then

cell.Offset(0, 1).Value = val(cell.Offset(0, -1))
            End If
        Next
    End If
End Sub

Это означает, что код будет работать только в том случае, если вы измените значение в A1, это не приведет к уничтожению самого цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...