Данные-->Проверка

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

Список уникальных значений можно формировать с помощью формул, но при больших об'ёмах информации лучше пользоваться расширенным фильтром.
ZORRO2005
Сообщения: 25
Зарегистрирован: 11 июн 2006, 21:48

pashulka прав лучше пользоваться расширенным фильтром
Но вот здесь формула для уникальных значений:
http://www.dailydoseofexcel.com/archive ... ique-data/[
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

Список уникальных значений ... лучше пользоваться расширенным фильтром
- ну тогда его получение предлагаю также автоматизировать и положить в именованный диапазон "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
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

Учитывая, что данные обновляются редко и использование расширенного фильтра не представляется архисложным, я предлагаю не поганить рабочую книгу макросами, в которых нет необходимости, а для того, чтобы список в об'екте Validation отображал значения столбца "F" достаточно просто использовать формулы.
qwer66
Сообщения: 3
Зарегистрирован: 21 июл 2009, 17:00

pashulka писал(а):ZORRO2005, Вот пример решения поставленного вопроса без макросов. Единственным обязательным условием является наличие отсортированного списка с наименованиями.
Есть какой-нить способ извлечь все значения из G:G для "февраль" в случае неотсортированного списка по F:F, например, "февраль" находится в F16?

Проблема в том, что люди, которые должны вводить данные понятия не имеют, что такое сортировка, обучению не поддаются
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

Если использовать дополнительные ячейки, то можно (см. пример), правда, в случае увеличения списка, вспомогательные ячейки придётся "взять", что называется с запасом.

Если же наличие дополнительных ячеек недопустимо, то Вам, видимо, либо придётся всё-таки выдрессировать своих подопечных, дабы они сортировали сами, либо производить сортировку программно, например, после выбора нужного месяца или после изменения данных списка (здесь Вам могут пригодиться события, в частности, событие рабочего листа Worksheet_Change(ByVal Target As Excel.Range))
qwer66
Сообщения: 3
Зарегистрирован: 21 июл 2009, 17:00

Спасибо, pashulka, за пример, вполне устраивает наличие доп.ячеек, т.к. в VBA не силен, а "их" обучить сортировке - невозможно :)
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

Qwer66, Если в дальнейшем необходимость в программной сортировке, всё-таки возникнет, то здесь) Вы можете скачать новый пример.
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

pashulka, дайте пожалуйста ссылку на допустимость использованной Вами конструкции

Код: Выделить всё

if [ProtectContents] = True 
[/b]
Я понимаю, что это по смыслу

Код: Выделить всё

 [B]if ActiveSheet.ProtectContents = True[/B] 
Но не нашёл описания допустимости использования подобного синтаксиса для этого свойства нигде кроме Вашего примера.
Андрей Энтелис,
aentelis.livejournal.com
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

Aent, Такой ссылки у меня нет, но рождённая и использованная мною конструкция вполне допустима, более того, функция [] применима и к другим процедурам (sub, function, propertie, ...), к примеру :

Код: Выделить всё

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, ибо вызвать событие можно и программно, и нет гарантии, что в момент вызова события - активным листом окажется необходимый), но в таком случае никто бы не узнал о "новых" возможностях ()
Ответить