У меня есть рабочая тетрадь с очень сложным набором макросов (100 из них). Где-то один из макросов иногда меняет значение в определенной ячейке, но я не могу понять, какой именно. Если есть способ приостановить выполнение VBA, если конкретная ячейка была изменена, я могу увидеть, какой Sub изменил ее?
2 ответа
ответ Тейлина великолепен; Я использую аналогичную предпосылку, но без необходимости обновлять существующие макросы, в основном вызывая ошибку времени выполнения при обновлении отслеживаемой ячейки
Это настройка: модуль VBA для контролируемой ячейки (в моем случае ячейка C3)
Событие _Change запускает деление на 0, если целью является C3:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row = 3 And Target.Column = 3 Then Debug.Print 1 / 0
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
x1
End Sub
3 Функции тестирования в стандартном модуле, каждый из которых обновляет ячейки A3, B3 и C3:
Sub x1()
Cells(3, 1) = Cells(3, 1) + 1
x2
End Sub
Sub x2()
Cells(3, 3) = Cells(3, 2) + 1
x3
End Sub
Sub x3()
Cells(3, 2) = Cells(3, 3) + 1
End Sub
Когда я изменяю выделение на листе, начинается процесс, и он отображает окно ошибки, подобное этому:
Я нажимаю кнопку «Отладка», и она переходит к строке события _Change с ошибкой:
На этом этапе я поднимаю стек вызовов (Ctrl + L)
Это показывает все сделанные вызовы, последний из которых находится сверху, поэтому дважды щелкните предыдущий:
Макрос, который обновил ячейку, будет иметь зеленый треугольник, отображающий точную линию, которая обновила его