Страницы: 1
RSS
Как подставить массив ключей Dictionary в RefersTo имени (Names)
 
Дообрый день, уважаемые форумчане
Ситуация следующая: пытаюсь извлечь список уникальних значений диапазона и присвоить его  Имени (Names).
Извлекаю уникальные с помощью словаря (см. код), но вот не получаеться корректно передать значения  с ".keys" в "Имя".
Код
Sub test1()
Dim i%, s$
With CreateObject("scripting.dictionary")
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
If Not .exists(CStr(Cells(i, 3))) Then .Add (CStr(Cells(i, 3))), 1
Next
's = Join(.keys, ";")
's = "{" & s & "}"
Names.Add Name:="test", RefersTo:=.keys
End With
's = ThisWorkbook.Names("test").RefersTo
'Debug.Print s
End Sub
Прошу помочь
 
А что вы хотите получить в имени?
keys - это массив...
 
У Вас i в цикле не меняется, нужно определять номер последней строки с данными не в ПЕРВОМ столбце а в ТРЕТЬЕМ, ну или данные записать в первый столбец
И как заметил Михаил keys-массив, что хотите в результате получить?
Изменено: Sanja - 27.03.2015 09:28:22
Согласие есть продукт при полном непротивлении сторон
 
Михаил С., хочу получить массив значений (в моем случае они будут уникальными) для дальнейшего использования в связке Имя + Выпадающий список  
 
Тогда, как сказал Sanja, исправьте в файле
Cells(Rows.Count, 1).End(xlUp).Row
на третий столбец.
Не уверен, что в выпадающем списке массив будет работать...
 
так попробуйте
Код
Sub test1()
Dim i%, s$
With CreateObject("scripting.dictionary")
For i = 1 To Cells(Rows.Count, 3).End(xlUp).Row
If Not .exists(CStr(Cells(i, 3))) Then .Add (CStr(Cells(i, 3))), 1
Next
s = Join(.keys, ",")
's = "{" & s & "}"
'Names.Add Name:="test", RefersTo:=s '.keys
With Selection.Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:=s
End With
End With
's = ThisWorkbook.Names("test").RefersTo
'Debug.Print s
End Sub
 
Sanja, Михаил С., извините неправильно сделал файл-пример в оригинале все согласно Вашим рекомендациям.
На выходе получаю такое имя но значения в нем не подходят для работы в выпадающем списке
 
Выпадающий список из виртуального массива не работает. А в имени - виртуальный массив.
Работает либо с листа (если имя - то ссылка на диапазон), либо непосредственным перечислением элементов списка.
 
Цитата
Михаил С. написал: так попробуйте
Без имени, но результат тот что нужен, большое спасибо
 
В варианте Михаила ограничение на 255 симвалов в строке - если будет длиннее, то будет ошибка при открытии файла. Так было в 2003 Экселе, думаю так и осталось.
А словарь можно заполнить чуть короче:
Код
For i = 1 To Cells(Rows.Count, 3).End(xlUp).Row
.Item(Cells(i, 3).Value) = Empty
Next

 
Hugo, большое спасибо - красиво, я так и знал что вы не пройдете мимо темы где есть словарь :)
А по поводу ограничения - вы имеете в виду что переменная s не может иметь более 255 символов?
У меня (в реальном примере) длинна s - 458 символов, выпадающий список работает без проблем
Office 2010 32bit  
 
Попробуйте сохранить и закрыть файл, затем его открыть. Если всё будет ОК - порадуйте нас :)
 
Упс, не прокатило :(
Есть варианты?  
 
Думаю оптимально - выгрузить массив на лист и дать ссылку на этот диапазон.
Или иначе - перед сохранением списки удалять, после открытия восстанавливать.
Изменено: Hugo - 27.03.2015 12:02:55
 
наверное остановлюсь на первом варианте, спасибо
 
Цитата
Vitallic написал: А по поводу ограничения - вы имеете в виду что переменная s не может иметь более 255 символов?
Тоже прокололся на этом: программно создавал выпадающие списки. Всё работает. Но после закрытия-открытия книги получал ошибку из-за этого самого ограничения длины списка в 255. Пришлось сначала на листе формировать именованный диапазон, а уже его использовать потом. 2007 у меня, у заказчика 2010.
 
Единственный вариант - хранить список на листе.
Страницы: 1
Наверх