Страницы: 1
RSS
Координатное выделение. Макрос по событию листа
 
Друзья, привет.
В процессе изучения, наткнулся на статью - 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 написал:
Почему без условия не работает код
код не работает потому что криво написан (хоть с тем условием, хоть без него,)
т.е. наличие / отсутствие в коде выделенного вами условия совершенно не влияет на кривизну этого кода
 
Изменено: Ігор Гончаренко - 10.12.2019 23:52:56
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Как не влияет...с ней он работает, а без нет...проверял раз сто. Если условие есть, то все ок координаты строчки столбцы выделяются, если условия нет, то выделяется весь диапазон  
Изменено: OblivionR - 10.12.2019 23:57:36
 
1. оставьте условие в макросе
2. отметьте ячейку М11
3. сработало?
4. вывод о том, как наличие этого фрагмента кода влияет на работоспособность вашего кода можете сделать самостоятельно
Изменено: Ігор Гончаренко - 11.12.2019 00:30:07
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
какую цель преследует этот кусок кода?
Цитата
OblivionR написал:
Intersect(WorkRange, Union(Target.EntireColumn, Target.EntireRow)).Select
что он должен по Вашему делать при выделении ячеек внутри "A1:g10" и вне этого диапазона?

P.S. Даже удивительно, как тема с таким названием прожила так долго и даже удостоилась ответа от модератора без замечания... :D  
Изменено: Дмитрий(The_Prist) Щербаков - 11.12.2019 08:25:57
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал: как тема с таким названием прожила так долго
Решил подождать развития, т.к. сам не соображу, как можно такое озаглавить...
 
Цитата
vikttur: не соображу, как можно такое озаглавить
Координатное выделение. Макрос по событию листа (нюансы работы)
*можно без скобок и того, что в них
Изменено: Jack Famous - 11.12.2019 11:12:49
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
ну если нужно именно коорд.выделение, то вполне хватит такого кода:
Код
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 ячеек, то, разумно предположить, что без данной строчки, при выделении одной ячейки (не дать макросу "совершить" ошибку), результат должен быть аналогичный..
 
Цитата
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
Изменено: Дмитрий(The_Prist) Щербаков - 11.12.2019 19:52:43
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
Что в итоге опять же провоцирует вызов события Worksheet_SelectionChange, но теперь уже в качестве целевых
Аааааааааааа, точно. спасибо огромное за разъяснение!!!
 
OblivionR,
вы задаете вопрос: "почему с этим условием код работает, а без условия нет?"
получаете ответ:
код написан криво и его работоспособность не зависит от наличия,/отсутсвия в коде строки с названным условием

а нужно  просто описать задачу: мне нужно чтобы при выделении ячеек ...
и дальше пишите при выделении каких ячеек что должно происходить на листе.
в следующем сообщении получаете ГОТОВЫЙ ответ, не читаете тонны сообщений не пытаетесь понять непонятные вам предложения и фрагменты кода, а просто в следующем сообщении получаете готовое решение описанной в первом сообщении задачи
так все работает, точно и эффективно
1-е сообщение - описание задачи
2-е сообщение - способ ее решения
3-е сообщение - слова благодарности за сделанную работу и потраченное время
все
Изменено: Ігор Гончаренко - 11.12.2019 22:32:36
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, я читаю все сообщения, и благодарен всем за потраченное время.
Понимаете, фраза что "код написан криво" мне мало о чем говорила, где именно, в чем его кривизна, мне понятно не было.
Буду четче формулировать вопросы, спасибо!
Страницы: 1
Наверх