Уменьшите нагрузку, если в vba выполнены условия

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

У меня есть следующий код, но вместо уменьшения нагрузки, например. от 11 до 10 или 9 или так далее, он просто удаляет нагрузку из таблицы. Прилагаются скриншоты стартового кейса и после запущенного кода.

Может кто поможет поправить код?

Sub loopwork()    
    Column = 215
    Row = 1097
    columnmove = 109

    For Column = 215 To 315
        columnmove = columnmove + 1

        For Row = 1097 To 1192
            columnload = Column - columnmove
            Cells(Row, Column).Select
            Cells(Row, Column - 211).Select
            Cells(Row, columnload).Select
            self = Cells(Row, Column)
            firstcheck = Cells(Row, Column - 211)
            loadvalue = Cells(Row, columnload)

            If ((firstcheck < -0.05 Or firstcheck > 0.05 Or loadvalue > 100) And (self > 0)) Then
                Cells(Row, Column).Select
                Cells(Row, Column) = Cells(Row, Column) - 1
                Cells(1, 1).Select
                Row = Row - 1
            End If
        Next
    Next
End Sub

Перед запуском кода before running code

После запуска кода after running code

Я думаю, проблема в том, что Row = Row - 1 заставляет ваш счетчик оставаться в этой строке, и таким образом он продолжает отсчет от 11 до 0, потому что он увеличивает эту ячейку не только один раз, но до тех пор, пока self > 0 больше не будет истинным. • Чтобы выяснить, в чем заключается ваша проблема, я рекомендую пройти код шаг за шагом (используя F8), проверить значения ваших переменных и посмотреть, что вообще происходит. Также я рекомендую прочитать Как избежать использования Select в Excel VBA, потому что вы использовали много ненужных операторов .Select.

Pᴇʜ 10.09.2018 10:29

Что со всеми операторами .Select, которые а) вообще ничего не делают, б) в первую очередь нежелательны?

user4039065 10.09.2018 10:41
2
2
49
1

Ответы 1

Взгляни на,

If ((firstcheck < -0.05 Or firstcheck > 0.05 Or loadvalue > 100) And (self > 0)) Then

Если self > 0 и одно из других условий истинно, вы уменьшаете self на 1 (например, Cells(Row, Column) = Cells(Row, Column) - 1) и корректируете итератор For ... Next на -1, чтобы повторить тот же цикл.

Однако вы ничего не делаете, чтобы изменить значения firstcheck или loadvalue, поэтому, если он прошел тест If один раз, он просто продолжит проходить тест If, пока self не станет больше 0.

Вот почему цикл завершается, когда self становится нулем или, как вы его выразили, 'он просто удаляет нагрузку из таблицы'.

Другие вопросы по теме