Прошу не бить ногами если уже было. Честное пионерское юзал поиск. Собственно вопрос: Нужна проверка выделенных ячеек чтобы ругать пользователя если он выделил не то. Конкретней: Пользователь выделяет несколько ячеек (возможно не связанных). Выделенные ячейки должны находится только в столбце "A", строках, например, с 15 по 68. Единственное что придумал это проверку адреса как строки на присутствие знаков отличных от буквы "A", цифр, и специальных знаков типа "$", ":" и т.д. Но как-то это... неграмотно.
Заранее благодарен за помощь!
Доброго времени суток.
Прошу не бить ногами если уже было. Честное пионерское юзал поиск. Собственно вопрос: Нужна проверка выделенных ячеек чтобы ругать пользователя если он выделил не то. Конкретней: Пользователь выделяет несколько ячеек (возможно не связанных). Выделенные ячейки должны находится только в столбце "A", строках, например, с 15 по 68. Единственное что придумал это проверку адреса как строки на присутствие знаков отличных от буквы "A", цифр, и специальных знаков типа "$", ":" и т.д. Но как-то это... неграмотно.
Уважаемый, SLAVICK! На сколько я понимаю intersect возвращает область пересечения. Т.е. в моем случае если хотя бы одна ячейка пересекается с моим диапазоном, то intersect будет выдавать область пересечения. Что бы работало так, как мне нужно, то в проверяемую область нужно запихать весь лист, кроме той области где выделять можно, а объект Range не вмещает так много.
Уважаемый, SLAVICK! На сколько я понимаю intersect возвращает область пересечения. Т.е. в моем случае если хотя бы одна ячейка пересекается с моим диапазоном, то intersect будет выдавать область пересечения. Что бы работало так, как мне нужно, то в проверяемую область нужно запихать весь лист, кроме той области где выделять можно, а объект Range не вмещает так много.Darck
Вы задали общий вопрос - получили общий ответ. Если хотите решить Вашу задачу - вложите файл пример согласно правилам форума. Выделите в нем разрешенную область(и) - там видно будет.
Вы задали общий вопрос - получили общий ответ. Если хотите решить Вашу задачу - вложите файл пример согласно правилам форума. Выделите в нем разрешенную область(и) - там видно будет.SLAVICK
? И можно использовать intersect для определения пересечения только столбца А и выделенной ячейки.
Это не решает проблему. При выделении хотя бы одной ячейки в разрешенном диапазоне прописанном в intersect будет возвращаться именно она, а остальные выделенные ячейки могут лежать в НЕ разрешенной области. Нужно именно определить выходит ли выделенный диапазон за разрешенную область, а для этого нужно искать пересечение НЕ разрешенной области которая не помещается в один объект Range.
? И можно использовать intersect для определения пересечения только столбца А и выделенной ячейки.
Это не решает проблему. При выделении хотя бы одной ячейки в разрешенном диапазоне прописанном в intersect будет возвращаться именно она, а остальные выделенные ячейки могут лежать в НЕ разрешенной области. Нужно именно определить выходит ли выделенный диапазон за разрешенную область, а для этого нужно искать пересечение НЕ разрешенной области которая не помещается в один объект Range.Darck
Сообщение отредактировал Darck - Пятница, 04.12.2015, 17:22
Рискну предположить без долгожданного примера. Предлагаю просто сосчитать ячейки в выборе пользователя и в пересечении диапазонов. Равенство = полное вхождение. [vba]
Код
Sub test()
Dim rngColA As Range 'диапазон попадания (вхождения) - зеленый Dim rngUser As Range 'выбор пользователя - жёлтый Dim rngIntersect As Range 'диапазон пересечения - голубой
Set rngColA = Range("A1:A68")
Set rngUser = Range("A16:B17,A16:B17,A20:C21,D22:D26") Set rngUser = Union(rngUser, rngUser)
If rngIntersect Is Nothing Then MsgBox "Выбор пользователя не пересекается с Диапазоном попадания" Exit Sub End If
rngIntersect.Interior.ColorIndex = 37 'голубой
If rngUser.Cells.Count = rngIntersect.Cells.Count Then MsgBox "Выбор пользователя полностью входит в Диапазон попадания" Else MsgBox "Выбор пользователя частично входит в Диапазон попадания" End If
End Sub
[/vba] P.S. Предвосхищая возможный вопрос. Смысл трюка Union(rngUser, rngUser) в подавлении повторного выделения некоторых ячеек пользователем. Без Set rngUser = Union(rngUser, rngUser) результат rngUser.Cells.Count будет 19, а с ним - только 15. Имитация повторного выделения выполнена задвоением адреса A16:B17 в Range("A16:B17,A16:B17...").
Рискну предположить без долгожданного примера. Предлагаю просто сосчитать ячейки в выборе пользователя и в пересечении диапазонов. Равенство = полное вхождение. [vba]
Код
Sub test()
Dim rngColA As Range 'диапазон попадания (вхождения) - зеленый Dim rngUser As Range 'выбор пользователя - жёлтый Dim rngIntersect As Range 'диапазон пересечения - голубой
Set rngColA = Range("A1:A68")
Set rngUser = Range("A16:B17,A16:B17,A20:C21,D22:D26") Set rngUser = Union(rngUser, rngUser)
If rngIntersect Is Nothing Then MsgBox "Выбор пользователя не пересекается с Диапазоном попадания" Exit Sub End If
rngIntersect.Interior.ColorIndex = 37 'голубой
If rngUser.Cells.Count = rngIntersect.Cells.Count Then MsgBox "Выбор пользователя полностью входит в Диапазон попадания" Else MsgBox "Выбор пользователя частично входит в Диапазон попадания" End If
End Sub
[/vba] P.S. Предвосхищая возможный вопрос. Смысл трюка Union(rngUser, rngUser) в подавлении повторного выделения некоторых ячеек пользователем. Без Set rngUser = Union(rngUser, rngUser) результат rngUser.Cells.Count будет 19, а с ним - только 15. Имитация повторного выделения выполнена задвоением адреса A16:B17 в Range("A16:B17,A16:B17...").Gustav
SLAVICK, Gustav. В разговор о правилах: Вопрос вполне себе общий, потому и нет примера! Да, в моем общем вопросе присутствуют некоторые ограничения, тем не менее он все такой же общий (на мой взгляд). Ну если вам так уж приспичило, то приложу файлик. В VBA мой вариант с проверкой адреса как текстовой строки на вхождение ненужных знаков. НО входит весь столбец А, а не необходимый диапазон. Да и выглядит неграмотно как писал выше. Intersect я рассматривал долго и с разных сторон. Я мог что-то упустить, не так силен в программировании (вообще не силен). Но на мой взгляд не подходит. Ограничения на общий вопрос: Пользователь должен выбирать только номера, т.е. выделенные ячейки должны быть в диапазоне A2:A7 (выделено желтым). При выделении хотя бы одной ячейки вне диапазона пользователь должен получать соответствующее сообщение. Gustav, Вам отдельное спасибо за Union! И, насколько я понимаю глядя на Ваш листинг, MsgBox "Выбор пользователя частично входит в Диапазон попадания" - будет выводиться в случае если хоть одна из ячеек в диапазоне выделена, но при этом может быть выделена и ячейка вне диапазона (а может и не быть выделена). А нужно сообщение срабатывающее при выделении хотя бы одной ячейки вне диапазона (повторяюсь).
SLAVICK, Gustav. В разговор о правилах: Вопрос вполне себе общий, потому и нет примера! Да, в моем общем вопросе присутствуют некоторые ограничения, тем не менее он все такой же общий (на мой взгляд). Ну если вам так уж приспичило, то приложу файлик. В VBA мой вариант с проверкой адреса как текстовой строки на вхождение ненужных знаков. НО входит весь столбец А, а не необходимый диапазон. Да и выглядит неграмотно как писал выше. Intersect я рассматривал долго и с разных сторон. Я мог что-то упустить, не так силен в программировании (вообще не силен). Но на мой взгляд не подходит. Ограничения на общий вопрос: Пользователь должен выбирать только номера, т.е. выделенные ячейки должны быть в диапазоне A2:A7 (выделено желтым). При выделении хотя бы одной ячейки вне диапазона пользователь должен получать соответствующее сообщение. Gustav, Вам отдельное спасибо за Union! И, насколько я понимаю глядя на Ваш листинг, MsgBox "Выбор пользователя частично входит в Диапазон попадания" - будет выводиться в случае если хоть одна из ячеек в диапазоне выделена, но при этом может быть выделена и ячейка вне диапазона (а может и не быть выделена). А нужно сообщение срабатывающее при выделении хотя бы одной ячейки вне диапазона (повторяюсь).Darck
И, насколько я понимаю глядя на Ваш листинг, MsgBox "Выбор пользователя частично входит в Диапазон попадания" - будет выводиться в случае если хоть одна из ячеек в диапазоне выделена, но при этом может быть выделена и ячейка вне диапазона (а может и не быть выделена). А нужно сообщение срабатывающее при выделении хотя бы одной ячейки вне диапазона (повторяюсь).
Эммм... Еще раз, уже не кодом, а человечьими словами. По взаимодействию диапазонов ситуации могут быть следующими (и других не бывает): 1. Диапазоны не пересекаются, т.е. не имеют общих ячеек. 2. Один диапазон может быть полностью внутри другого. 3. Не все ячейки одного диапазона находятся внутри другого, т.е. частично. При этом остальные ячейки первого диапазона находятся, естественно, за пределами второго. В моем примере выше рассмотрены все три эти ситуации (см. соответствующие MsgBox).
Чтобы Вам было всё окончательно понятно, я добавил в Ваш файл свою кнопку и адаптировал свой вышеприведенный пример (см. в файле и под спойлером).
[vba]
Код
Sub gustavMessage() MsgBox "Выделите только номера банкоматов", vbExclamation, "Проверка Gustav'а" End Sub
Sub tst2()
Dim rngColA As Range 'диапазон попадания (вхождения) Dim rngUser As Range 'выбор пользователя Dim rngIntersect As Range 'диапазон пересечения
Set rngColA = Range("A2:A7")
Set rngUser = Selection Set rngUser = Union(rngUser, rngUser)
Set rngIntersect = Intersect(rngColA, rngUser)
If rngIntersect Is Nothing Then Call gustavMessage Exit Sub End If
If rngUser.Cells.Count <> rngIntersect.Cells.Count Then Call gustavMessage End If
И, насколько я понимаю глядя на Ваш листинг, MsgBox "Выбор пользователя частично входит в Диапазон попадания" - будет выводиться в случае если хоть одна из ячеек в диапазоне выделена, но при этом может быть выделена и ячейка вне диапазона (а может и не быть выделена). А нужно сообщение срабатывающее при выделении хотя бы одной ячейки вне диапазона (повторяюсь).
Эммм... Еще раз, уже не кодом, а человечьими словами. По взаимодействию диапазонов ситуации могут быть следующими (и других не бывает): 1. Диапазоны не пересекаются, т.е. не имеют общих ячеек. 2. Один диапазон может быть полностью внутри другого. 3. Не все ячейки одного диапазона находятся внутри другого, т.е. частично. При этом остальные ячейки первого диапазона находятся, естественно, за пределами второго. В моем примере выше рассмотрены все три эти ситуации (см. соответствующие MsgBox).
Чтобы Вам было всё окончательно понятно, я добавил в Ваш файл свою кнопку и адаптировал свой вышеприведенный пример (см. в файле и под спойлером).
[vba]
Код
Sub gustavMessage() MsgBox "Выделите только номера банкоматов", vbExclamation, "Проверка Gustav'а" End Sub
Sub tst2()
Dim rngColA As Range 'диапазон попадания (вхождения) Dim rngUser As Range 'выбор пользователя Dim rngIntersect As Range 'диапазон пересечения
Set rngColA = Range("A2:A7")
Set rngUser = Selection Set rngUser = Union(rngUser, rngUser)
Set rngIntersect = Intersect(rngColA, rngUser)
If rngIntersect Is Nothing Then Call gustavMessage Exit Sub End If
If rngUser.Cells.Count <> rngIntersect.Cells.Count Then Call gustavMessage End If
Gustav, ооо... тоже работает, очень рад! не додумался до такой проверки:
[vba]
Код
If rngUser.Cells.Count <> rngIntersect.Cells.Count Then Call gustavMessage End If
[/vba]
Она-то все и решила, конечно в купе с Union. Как собирался использовать макрос от RAN... все получилось, файл прикладываю. Но у Вас код по компактней и исполнение проще. В частности в макросе предложенном RAN при работе создается книга и она же удаляется что занимает время.
Gustav, ооо... тоже работает, очень рад! не додумался до такой проверки:
[vba]
Код
If rngUser.Cells.Count <> rngIntersect.Cells.Count Then Call gustavMessage End If
[/vba]
Она-то все и решила, конечно в купе с Union. Как собирался использовать макрос от RAN... все получилось, файл прикладываю. Но у Вас код по компактней и исполнение проще. В частности в макросе предложенном RAN при работе создается книга и она же удаляется что занимает время.Darck
Есть правила. Их нужно соблюдать. Спасибо за столь великое одолжение чти соизволили приложить пример. Это же наверное нам нужна была помощь. Как видите я был прав. Решение Gustav именно с intersect.
Есть правила. Их нужно соблюдать. Спасибо за столь великое одолжение чти соизволили приложить пример. Это же наверное нам нужна была помощь. Как видите я был прав. Решение Gustav именно с intersect. SLAVICK
До нее не надо было додумываться - всё было уже "украдено до нас" выложено в сообщении № 8. Надо было только повнимательнее его читать и заметить тождество между окончательным: [vba]
Код
If rngUser.Cells.Count <> rngIntersect.Cells.Count Then бла-бла-бла 'MsgBox "Выделите только номера банкоматов" End If
[/vba] и предварительным (заметьте, про банкоматы тогда еще ничего не было известно и была только голая абстрактная логика): [vba]
Код
If rngUser.Cells.Count = rngIntersect.Cells.Count Then .......... Else бла-бла-бла по сути того же смысла 'MsgBox "Выбор пользователя частично входит в Диапазон попадания" End If
Купа с юнионом, конечно, представляет тонкость, которую лучше знать, чем не знать, но ее роль не такая уж решающая и нужна она только тогда, когда найдётся изысканный негодяй-пользователь, который будет повторно "промазывать" мышью уже выделенные ячейки
До нее не надо было додумываться - всё было уже "украдено до нас" выложено в сообщении № 8. Надо было только повнимательнее его читать и заметить тождество между окончательным: [vba]
Код
If rngUser.Cells.Count <> rngIntersect.Cells.Count Then бла-бла-бла 'MsgBox "Выделите только номера банкоматов" End If
[/vba] и предварительным (заметьте, про банкоматы тогда еще ничего не было известно и была только голая абстрактная логика): [vba]
Код
If rngUser.Cells.Count = rngIntersect.Cells.Count Then .......... Else бла-бла-бла по сути того же смысла 'MsgBox "Выбор пользователя частично входит в Диапазон попадания" End If
Купа с юнионом, конечно, представляет тонкость, которую лучше знать, чем не знать, но ее роль не такая уж решающая и нужна она только тогда, когда найдётся изысканный негодяй-пользователь, который будет повторно "промазывать" мышью уже выделенные ячейкиGustav