Excel VBA Worksheet_Change Не вычисляется проблема - PullRequest
1 голос
/ 23 апреля 2020

Я прошу прощения, если это простой вопрос, но я не могу решить его.

У меня есть электронная таблица, ячейки которой возвращают значения из внешних ссылок. Затем у меня есть ячейки / формулы, указывающие на эти данные, выполняющие вычисления. Мне нужно «войти» (записать значения ячеек) в другие ячейки при выполнении определенных критериев, поэтому я могу go вернуться и просмотреть необработанные данные, которые были там в то время. У меня есть ячейка (P3), использующая функцию IF для возврата «1», когда все критерии выполнены (т.е. когда 1 появляется в P3, мне нужно скопировать значения ячеек).

Насколько я понял:

Private Sub Worksheet_Calculate()
      If Range("P3").Value = 1 Then
      Range("AL9").Value = Range("AJ9").Value
      Range("AL11").Value = Range("AJ11").Value
      Range("AL13").Value = Range("AJ13").Value
      Range("AL15").Value = Range("AJ15").Value
      Range("AL17").Value = Range("AJ17").Value
      Range("AL19").Value = Range("AJ19").Value
      Range("AL21").Value = Range("AJ21").Value
      Range("AL23").Value = Range("AJ23").Value
      End If

End Sub

Я изначально пытался использовать Worksheet_Change, но он работает только при обновлении P3 вручную и не работает при использовании формулы.

При тестировании в листе с внешними данными, когда в P3 появляется 1, все ячейки формулы перестают вычисляться ... почти как лист наполовину заморожен. Внешние ячейки данных по-прежнему обновляются в обычном режиме.

Может кто-нибудь указать мне правильное направление.

Спасибо

1 Ответ

0 голосов
/ 26 апреля 2020

После просмотра вашего примера рабочей книги я установил разрыв кода в строке оператора If.

Я обновил указанную ячейку (L3) на «Да» в соответствии с инструкцией, которая заполнила ячейку формулы (P3) 1 и запустила событие Worksheet_Calculate.

И в этом ваша проблема: ваш код вызывал событие Worksheet_Calculate после выполнения первой строки в блоке If, в результате чего бесконечный l oop никогда не проходил мимо строки Range("AL10").Value = Range("AJ10").Value.

Решением этой проблемы является инкапсуляция операторов блока If в вызове для отключения / включения Application.EnableEvents, что позволяет или запрещает вызывать событие Worksheet_Calculate.

Это исправит вашу проблему:

Private Sub Worksheet_Calculate()

If Me.Range("P3").Value = 1 Then
    Application.EnableEvents = False    'Disallow calls to the Worksheet_Calculate event (among other things...)
    Range("AL10").Value = Range("AJ10").Value
    Range("AL12").Value = Range("AJ12").Value
    Range("AL14").Value = Range("AJ14").Value
    Range("AL16").Value = Range("AJ16").Value
    Range("AL18").Value = Range("AJ18").Value
    Range("AL20").Value = Range("AJ20").Value
    Range("AL22").Value = Range("AJ22").Value
    Range("AL24").Value = Range("AJ24").Value
    Application.EnableEvents = True    'Allow calls to the Worksheet_Calculate event (among other things...)
End If
End Sub

Важно понимать, на что влияет свойство Application.EnableEvents. Вы можете прочитать об этом здесь, в документации MS .

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