Проблема проста. Вы проверяете некоторый диапазон для изменения. Если это изменилось, вы выполняете какое-то действие, которое изменяет ячейки в проверяемом диапазоне. Это приводит к событию изменения этого диапазона и ... вызывает метод. И снова и снова ...
Чтобы избежать этой проблемы, вы должны создать глобальный или статический флаг и игнорировать все вторичные вызовы:
Dim IsWorking As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
If IsWorking Then Exit Sub ' Exit if it is a 'slave' call
IsWorking = True ' Set 'main call is processed' flag
' perform actions you need
IsWorking = False ' Drop the flag, main call is finished
Exit Sub
Дополнительно: Target
может быть многоклеточным диапазоном, а не одной ячейкой. Вы можете проверить пересечение для каждой строки в нем, по крайней мере - может быть, более чем одна ячейка должна быть изменена на значение "В процессе" ...
Дополнительно-2: Добавить Application.DoEvents
для кода - он позволяет прервать выполнение кода с помощью Ctrl-C, если макрос «замирает».