Как определить, какой код VBA меняет значение ячейки Excel - PullRequest
0 голосов
/ 29 февраля 2020

У меня есть книга, написанная кем-то другим, и определенная ячейка заменяется каким-то кодом. Я не могу понять код, который изменяет значение ячейки.

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

Я очень опытен с использованием VBA в Microsoft Access и немного опытен с использованием VBA в Excel.

РЕДАКТИРОВАТЬ Должен иметь дело. Я не могу даже F8 через код, начиная с самого начала. Я имею в виду, что рассматриваемая ячейка изменяется после того, как я изменяю значение (фактически год) на листе. Поэтому я настроил подпрограмму и точку останова, как показано ниже.

Private Sub Worksheet_Change(ByVal Target As Range)
End Sub   '<== set breakpoint here

Затем я нажимаю F8, и отладчик не вводит никакого другого кода, а ячейка меняется.

Проблема может быть в том, что в коде происходит множество формул динамической обработки c. Точно сказать не могу. Не знаю достаточно о причудах Excel.

РЕДАКТИРОВАТЬ 2 В рассматриваемой ячейке отсутствует формула. Извините, что потратил впустую время каждого.

Так как пропущенная формула может изменить значение ячейки. Это не может! Вопрос должен был быть «Как определить, почему клетка НЕ ​​меняется». Так почему я не спросил об этом?

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

1 Ответ

1 голос
/ 29 февраля 2020

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

В этом обработчике событий добавьте код для разрыва, когда происходит изменение в отслеживаемой ячейке

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Cells(1, 1)) Is Nothing Then
        Stop
    End If

End Sub

Chnage Me.Cells(1, 1) в ячейку по вашему выбору.

Когда код сломается, откройте стек вызовов, чтобы увидеть, откуда пришло изменение

Вот подтверждение концепции. Я побежал ZX. Стек вызовов показывает событие Change вверху. Следующая функция - это то, что изменилось на ячейку.

enter image description here

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