Друзья, привет. В процессе изучения, наткнулся на статью - https://www.planetaexcel.ru/techniques/9/58/ Так вот, объясните, пожалуйста, почему этот код без строки If Target.Cells.Count > 1 Then Exit Sub выделяет весь диапазон и как следствие не работает. Ведь это просто условие для выхода..
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim WorkRange As Range
If Target.Cells.Count > 1 Then Exit Sub
Set WorkRange = Range("A1:g10")
Intersect(WorkRange, Union(Target.EntireColumn, Target.EntireRow)).Select
End Sub
Макрос реагирует на событие листа - выделение ячейки/ячеек. Указанная строка следит за тем, чтобы выделена была только одна ячейка. Если одна, закрашиваются ячейки строки и столбца в диапазоне A1:Q10. Заливка пересекается в активной ячейке. Если эта ячейка находится вне диапазона, закрашивается или столбец, или строка.
Виктор, я понимаю, что она следит за тем, чтобы была выделена только одна ячейка, но проверял, без данной строчки, даже если выделять одну ячейку в диапазоне, выделяется весь рабочий диапазон...
OblivionR написал: Почему без условия не работает код
код не работает потому что криво написан (хоть с тем условием, хоть без него,) т.е. наличие / отсутствие в коде выделенного вами условия совершенно не влияет на кривизну этого кода
Как не влияет...с ней он работает, а без нет...проверял раз сто. Если условие есть, то все ок координаты строчки столбцы выделяются, если условия нет, то выделяется весь диапазон
1. оставьте условие в макросе 2. отметьте ячейку М11 3. сработало? 4. вывод о том, как наличие этого фрагмента кода влияет на работоспособность вашего кода можете сделать самостоятельно
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
ну если нужно именно коорд.выделение, то вполне хватит такого кода:
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim WorkRange As Range, rr As Range
Set WorkRange = Range("A1:g10")
Set rr = Intersect(WorkRange, Union(Target.Cells(1, 1).EntireColumn, Target.Cells(1, 1).EntireRow))
If Not rr Is Nothing Then rr.Select
End Sub
хотя все равно не очень понятно как быть, если выделена ячейка вне заданного диапазона.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Друзья, я понимаю, что уровень ваших навыков с моими не сравнится, поэтому и попросил разъяснить в чем дело. Но по существу никто не ответил..Мне так и не понятно, если данная строчка отвечает только за то, чтобы основной код не сработал, при выделении 2 ячеек, то, разумно предположить, что без данной строчки, при выделении одной ячейки (не дать макросу "совершить" ошибку), результат должен быть аналогичный..
Тогда проясним логику кода. Потому что убирая эту строку происходит следующее: 1. выделили любую ячейку, вызвав тем самым событие листа Worksheet_SelectionChange. Допустим, это будет ячейка А1. 2. после этого мы не определяем сколько выделено ячеек. Поэтому у нас формируется новый диапазон:
это пересечение строки и столбца выделенной ячейки и диапазона "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
OblivionR, вы задаете вопрос: "почему с этим условием код работает, а без условия нет?" получаете ответ: код написан криво и его работоспособность не зависит от наличия,/отсутсвия в коде строки с названным условием
а нужно просто описать задачу:мне нужно чтобы при выделении ячеек ... и дальше пишите при выделении каких ячеек что должно происходить на листе. в следующем сообщении получаете ГОТОВЫЙ ответ, не читаете тонны сообщений не пытаетесь понять непонятные вам предложения и фрагменты кода, а просто в следующем сообщении получаете готовое решение описанной в первом сообщении задачи так все работает, точно и эффективно 1-е сообщение - описание задачи 2-е сообщение - способ ее решения 3-е сообщение - слова благодарности за сделанную работу и потраченное время все
Ігор Гончаренко, я читаю все сообщения, и благодарен всем за потраченное время. Понимаете, фраза что "код написан криво" мне мало о чем говорила, где именно, в чем его кривизна, мне понятно не было. Буду четче формулировать вопросы, спасибо!