Данные-->Проверка
Модератор: Naeel Maqsudov
Список уникальных значений можно формировать с помощью формул, но при больших об'ёмах информации лучше пользоваться расширенным фильтром.
pashulka прав лучше пользоваться расширенным фильтром
Но вот здесь формула для уникальных значений:
http://www.dailydoseofexcel.com/archive ... ique-data/[
Но вот здесь формула для уникальных значений:
http://www.dailydoseofexcel.com/archive ... ique-data/[
- ну тогда его получение предлагаю также автоматизировать и положить в именованный диапазон "Name_r1",Список уникальных значений ... лучше пользоваться расширенным фильтром
- а проверка-данные столбца A настроить уже на "Name_r1"
Код: Выделить всё
Sub Макрос_Уникальные_записи()
Dim r1 As Range
Set r1 = Range("D1")
'Применяем расширенный фильтр
Range("F:F").AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=r1, _
Unique:=True
'Даем имя производному диапазону "Name_r1" для дальнейших операций
Set r1 = Range(r1, r1.End(xlDown))
ActiveWorkbook.Names.Add Name:="Name_r1", RefersToR1C1:=r1
Range("Name_r1").Select
End Sub
Учитывая, что данные обновляются редко и использование расширенного фильтра не представляется архисложным, я предлагаю не поганить рабочую книгу макросами, в которых нет необходимости, а для того, чтобы список в об'екте Validation отображал значения столбца "F" достаточно просто использовать формулы.
Есть какой-нить способ извлечь все значения из G:G для "февраль" в случае неотсортированного списка по F:F, например, "февраль" находится в F16?pashulka писал(а):ZORRO2005, Вот пример решения поставленного вопроса без макросов. Единственным обязательным условием является наличие отсортированного списка с наименованиями.
Проблема в том, что люди, которые должны вводить данные понятия не имеют, что такое сортировка, обучению не поддаются
Если использовать дополнительные ячейки, то можно (см. пример), правда, в случае увеличения списка, вспомогательные ячейки придётся "взять", что называется с запасом.
Если же наличие дополнительных ячеек недопустимо, то Вам, видимо, либо придётся всё-таки выдрессировать своих подопечных, дабы они сортировали сами, либо производить сортировку программно, например, после выбора нужного месяца или после изменения данных списка (здесь Вам могут пригодиться события, в частности, событие рабочего листа Worksheet_Change(ByVal Target As Excel.Range))
Если же наличие дополнительных ячеек недопустимо, то Вам, видимо, либо придётся всё-таки выдрессировать своих подопечных, дабы они сортировали сами, либо производить сортировку программно, например, после выбора нужного месяца или после изменения данных списка (здесь Вам могут пригодиться события, в частности, событие рабочего листа Worksheet_Change(ByVal Target As Excel.Range))
Спасибо, pashulka, за пример, вполне устраивает наличие доп.ячеек, т.к. в VBA не силен, а "их" обучить сортировке - невозможно 

Qwer66, Если в дальнейшем необходимость в программной сортировке, всё-таки возникнет, то здесь) Вы можете скачать новый пример.
- Aent
- Сообщения: 1129
- Зарегистрирован: 01 окт 2006, 14:52
- Откуда: Saratov,Russia
- Контактная информация:
pashulka, дайте пожалуйста ссылку на допустимость использованной Вами конструкции
[/b]
Я понимаю, что это по смыслу Но не нашёл описания допустимости использования подобного синтаксиса для этого свойства нигде кроме Вашего примера.
Код: Выделить всё
if [ProtectContents] = True
Я понимаю, что это по смыслу
Код: Выделить всё
[B]if ActiveSheet.ProtectContents = True[/B]
Андрей Энтелис,
aentelis.livejournal.com
aentelis.livejournal.com
Aent, Такой ссылки у меня нет, но рождённая и использованная мною конструкция вполне допустима, более того, функция [] применима и к другим процедурам (sub, function, propertie, ...), к примеру :
,
,
Другое дело, что можно было обойтись и более привычным синтаксисом, а именно If Me.ProtectContents ... или даже If ProtectContents ... (кстати, именно Me, а не ActiveSheet, ибо вызвать событие можно и программно, и нет гарантии, что в момент вызова события - активным листом окажется необходимый), но в таком случае никто бы не узнал о "новых" возможностях ()
Код: Выделить всё
Private Sub Worksheet_Activate()
[Worksheet_Change] [A1:C3]
End Sub
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
MsgBox Target.Address, , "Тест"
End Sub
Код: Выделить всё
Private Sub Worksheet_Activate()
[PrintPreview]
End Sub
Код: Выделить всё
Private Sub Worksheet_Activate()
'Hyperlinks.[Add] ...
[Hyperlinks].[Add] [A1], ["http://forum.developing.ru/forumdisplay.php?f=" & 1+Int(Rand()*20)]
End Sub
Другое дело, что можно было обойтись и более привычным синтаксисом, а именно If Me.ProtectContents ... или даже If ProtectContents ... (кстати, именно Me, а не ActiveSheet, ибо вызвать событие можно и программно, и нет гарантии, что в момент вызова события - активным листом окажется необходимый), но в таком случае никто бы не узнал о "новых" возможностях ()