Страницы: 1
RSS
отбор уникальных записей в ComboBox
 
Появилась необходимость создать функцию для отбора уникальных значений из списка и добавления в ComboBox. Функция нужна для того, чтобы не дублировать код в разных ComboBox на форме, а вызвать фукцию, параметрами которой будут: исходный диапазон, имя формы, имя списка.  
Есть пример с этого сайта, но не получается правильно объявить переменные в функции.  
Мой вариант объвления переменных, который не работат  
Function RemoveDuplicates(AllCells As Range, UserForm As Object, ListBox As ListBox)  
 
Прилагаю пример найденный для отбора уникальных значений
 
В Вашем примере процедура уважаемого Уокенбаха. Функцией значения массива Вы никак не передадите, так как значение возвращается только ячейке. в которой находится сама функция. Если я ошибаюсь пусть меня поправят. Формулами можно создать дополнительный столбец, который будет содерхать уникальные - этот вариань смотрите в Примерах.
 
См. NoDups() в приложении
 
Благодарю за ответы.  
Огромное спасибо ZVI! Ваш вариант полностью подходит, то что нужно!
 
{quote}{login=ZVI}{date=17.10.2009 05:49}{thema=Функция уникального сортированного массива из диапазона для ListBox и ComboBox}{post}См. NoDups() в приложении{/post}{/quote}  
 
Тоже хочу выразить благодарность, спасибо за интересное решение.
 
Спасибо добрым людям, дали сюда ссылку. Я вот долго вертел, но так и не смог к себе применить. Прошу помощи.  
Думаю на прикрепленном примере будет яснее. Вопрос тоже сюда перенесу:  
С помощью формы редактирую или добавляю таблицу. Для редактирования каждой колонки - свой комбобокс. В первом выбираю или пишу порядковый номер, если эта строка уже чем-то заполнена, остальные комбобоксы заполняются из этой строки автоматом, а дальше я редактирую - или вписывая в комбобоксы новое, или выбирая в выпадающих списках готовое. Так вот, у меня проблема - как сделать, чтобы во всех комбобоксах были уже профильтрованые списки - т.е. чтобы они заполнялись не содержимым всего столбца, а только уникальными значениями из него?  
Все попытки применить выложенную здесь функцию привели только к унынию.
 
drinck, скажите честно - Вам просто надо решение?  
В Вашей форме    
1 - нет функции от ZVI;  
2 - Вы просто прописали источники данных для комбобоксов  
Для Вашего решения необходимо программное заполнение комбо.  
возможный алгоритм - при инициализации формы Вы создаете массивы уникальных для каждого комбо с помощью функции от ZVI, при выборе значения в комбо1 - проверяем наличие данных в строке, крутим или через match(arr) - выбираем и присваиваем следующим комбо значения из массива.  
Как то так;) Хотя могу и сильно ошибаться....
 
Игорь, я вот самым бессовестным образом примитивно размножил функцию ZVI :-)  
drinck, в примере сделано для трёх ComboBox. Дальше делайте по аналогии.
 
Юрий М, не совсем;(  
Ведь, если правильно понял ТС, то надо поднимать значения по строке при условии что она не пустая. Т.е. надо ставить считывать строку с листа и искать значение в массиве данных:)
 
Игорь, а я отталкивался от этого:  
{quote}{login=drinck}{date=17.12.2010 04:56}{thema=}{post}как сделать, чтобы во всех комбобоксах были уже профильтрованые списки - т.е. чтобы они заполнялись не содержимым всего столбца, а только уникальными значениями из него?{/post}{/quote}
 
Есть еще  
-----------------  
В первом выбираю или пишу порядковый номер, если эта строка уже чем-то заполнена, остальные комбобоксы заполняются из этой строки автоматом, а дальше я редактирую - или вписывая в комбобоксы новое, или выбирая в выпадающих списках готовое.  
----------------
 
Игорь, я мысль уловил - выбор в одном комбо, а в других отобразить соответствующие значения. Но это уже второй этап. Я только про отбор уникальных для каждого Комбо сейчас говорю. :-)
 
Вот с "поиском" для трёх столбцов.
 
Скорее всего список в первом ComboBox нужно оставить, как он есть на листе.
 
Спасибо всем, кто ответил.  
{quote}{login=Igor67}{date=17.12.2010 09:44}{thema=}{post}drinck, скажите честно - Вам просто надо решение?  
В Вашей форме    
1 - нет функции от ZVI;  
2 - Вы просто прописали источники данных для комбобоксов  
{/post}{/quote}  
Отвечу честно - я не халявщик, хотя от халявы откажется только дурак. В данном конкретном случае я долго пытался найти решение, для меня ПОНЯТЬ важнее чем ПОЛУЧИТЬ, поскольку назидает, а функцию от ZVI я пытался вставить непосредственно в эту конструкцию:  
iIndex = ComboBox1.ListIndex  
For iCount = 2 To 7  
   Controls("ComboBox" & iCount).ListIndex = iIndex  
Next  
не меняя ее логики - все время вылазили какие-то ошибки. Прикреплять файл с нерабочими модулями - или народ смешить или сбивать с толку своей корявой логикой. Разумнее было приложить то, что у меня было в самом начале - как пример, как это работает.  
 
{quote}{login=Юрий М}{date=17.12.2010 09:53}{thema=}{post} я вот самым бессовестным образом примитивно размножил функцию ZVI :-){/post}{/quote}  
Подобная мысль тоже была, но поскольку у меня все мои рабочие макросы запихнуты в одну надстройку, которая и так уже разрослась, что черт ногу сломает - не хотел ее захламлять (а если ко-во комбобоксов нужно будет увеличить вдвое, втрое...?).  
 
{quote}{login=Юрий М}{date=17.12.2010 10:22}{thema=}{post}Игорь, я мысль уловил - выбор в одном комбо, а в других отобразить соответствующие значения. {/post}{/quote}  
Совершенно верно - при выборе в первом комбо - остальные заполняются из той же строки - это удобно, если редактировать нужно значение всего одного-двух комбо, но иногда редко попадающееся значение выбрать из выпавшего списка неудобно - для этого и возникло желание его фильтровать. А первый ComboBox я действительно не трогаю - там просто порядковые номера записей.
 
Чего-то такого "нацитировал", жаль не могу отредактировать :(  
 
Юрий М спасибо за предложеное решение  
правда при запуске выдает    
Run-time error '1004':    
Method 'Range' of object '_Global' failed  
надо разбираться, но попозже - пока сил нету - бегу к стоматологу...
 
Открыл свой файл прямо с сайта: ни при открытии, ни при загрузке формы никаких ошибок.
Страницы: 1
Наверх