Цитата |
---|
OblivionR написал: при выделении одной ячейки |
Тогда проясним логику кода. Потому что убирая эту строку происходит следующее:
1. выделили любую ячейку, вызвав тем самым событие листа Worksheet_SelectionChange. Допустим, это будет ячейка А1.
2. после этого мы не определяем сколько выделено ячеек. Поэтому у нас формируется новый диапазон:
Код |
---|
Intersect(WorkRange, Union(Target.EntireColumn, Target.EntireRow)) |
это пересечение строки и столбца выделенной ячейки и диапазона "A1:g10", т.е. диапазон "$C$1:$C$10,$A$5:$G$5".
А теперь внимание - что мы делаем с этим диапазоном? Правильно, применяя метод Select
выделяем. Что в итоге опять же провоцирует вызов события Worksheet_SelectionChange, но теперь уже в качестве целевых ячеек(Target) будет весь диапазон "$C$1:$C$10,$A$5:$G$5". А уж при использовании Intersect он превращается в диапазон "A1:g10", т.к. с ним пересекаются все его ячейки. Вот и ошибка.
А запрет выполнения процедуры при выделении более одной ячейки второй вызов Worksheet_SelectionChange предотвращает.
И в свете озвученного выше правильнее было бы записать код таким образом:
Код |
---|
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim WorkRange As Range
'отключаем отслеживание событий
Application.EnableEvents = False
Set WorkRange = Range("A1:g10")
Intersect(WorkRange, Union(Target.EntireColumn, Target.EntireRow)).Select
'возвращаем отслеживание событий
'обязательно, иначе в следующий раз выделение не сработает
Application.EnableEvents = True
End Sub |