Страницы: Пред. 1 2
RSS
Многоуровневые (зависимые, каскадные) выпадающие списки без дубликатов, В поисках универсального метода
 
Готово. Не определён столбец для выгрузки шестого КомбоБокса. Комментарии в коде.
 
Юрий М, превосходно, постараюсь разобраться - вы очень подробно всё объяснили))) Особенно порадовала фраза про выпадение списков  :D )))))) Ещё пару вопросов...
1. при выборе 6 уровня в списке значения как бы "срезаные" (видел такую же тему у Nerv в его drop-down search, там это было из-за очень длинных наименований) - лечится ли это?
2. Как изменится код в таком случае: я выделяю какую-то ячейку в таблице...запускаю макрос, делаю с ним свои дела, нажимаю ОК, тут он проверяет ВСЕ ли ячейки, которые должны им быть заполнены пусты. Если да, то вставляет значения в активную строку, если хоть одна заполнена, то предупреждает перед вставкой типа ТОЧНО? и варианты ОК и ПЕРЕДУМАЛ ))))
ОГРОМНОЕ вам спасибо, добрый человек!!!  :idea:  :idea: :idea: 8)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
1. Как понять "срезанные"? Не умещается целиком строка в поле КомбоБокса? В примере всё умещается. Если фактически строки длиннее, то никто не мешает увеличить его ширину.
 
Вариант с проверкой на заполнение контролируемых ячеек в активной строке.
 
Всё отлично работает! ))) Про подрезку: когда выбираю именно 6 уровень, варианты выглядят как бы" подрезанными" снизу процентов на 25% (см. скрин)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Варианты:
1. Немного удлинить форму. Но тут неизвестно, сколько будет строк в итоге.
2. Ограничить в свойствах контрола количество одновременно отображаемых строк - тогда появится полоса прокрутки.
 
Юрий М, Ещё раз спасибо огромное!!! Дальше постараюсь сам))) после выходных отпишусь сюда, так что загляните как-нибудь))
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Юрий М, и снова здравствуйте!  ;) С кодом я более-менее разобрался. Добавил в режим создания коллекции LastColomn вместе с вашей LastRow, чтобы не менять каждый раз размеры при добавлении столбцов. Привязал к другому названия листа "Cascades", т.к. оно более уникально. Имею задать 3 вопроса:
1. Не получилось убрать "обрезанные" строки при выборе условия 6 (главная бесячая проблема...увеличил форму, зафиксировал количество отображаемых элементов на 3 и ничего не изменилось...ещё всякие пункты потыкал и смотрел за изменениями - ничего путного)
2. Как сделать, чтобы после нажатия OK после внесения всех выборов в форме в активную строку, активная ячейка сдвигалась на следующую вниз (для непрерывного заполнения группы строк). Ещё такой момент в этой категории: во время активности формы нельзя взаимодействовать с листом (в частности, выделять ячейки) - можно ли это как-то исправить?
3. Как добавить проверку на наличие листа "Cascades" перед вызовом формы? Если такого нет, вывести сообщение о необходимости такового и завершить макрос (не создавать лист программно). Втыкал "On Error Resume Next" и ничего...если листа "Cascades" нет - выдаёт ошибку и уходит в дебаг
Изменено: Jack_Famous - 04.04.2016 20:41:45
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
1. Открыл Ваш файл - строки не подрезаются. Увеличил количество строк до восьми - тоже всё хорошо.
2. Перед выходом из процедуры добавьте строчку
Код
ActiveCell.Offset(1, 0).Select
Форму загружайте таким образом
Код
UserForm1.Show 0
3. Как проверить наличие листа - примеров на форуме достаточно )
===
Про LastColumn вообще не понял - зачем? Ведь независимо от количества столбцов, данные берём из фиксированных.
 
Юрий М, Может с VBA-модулем что-то не так?...
С остальным всё отлично)))) просто супер! В точности))))  :idea: Вы крутой 8)
Изменено: Jack_Famous - 04.04.2016 20:58:38
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Да модуль тут причём? )) Попробуйте удалить последний КомбоБокс и создать его заново. Хотя, у меня отображается всё корректно.
 
Копировал 5 Combobox на место 6 и даже добавил 7... Поиск по интернету пока не дал результатов...
Изменено: Jack_Famous - 04.04.2016 21:09:18
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Разве я предлагал скопировать? Попробуйте создать, как я предложил, а не копировать. Ещё можно попробовать в проблемном контроле поиграться со шрифтами: название и размер.
 
Получилось))) Зависело от размера (и, что странно, нужно было БОЛЬШЕ сделать))) Сам ComboBox и шрифт не влияли...
С остальным сам разберусь, а то что-то я охренел под вечер  :D  Ещё раз огромное спасибо!!! Как внесу все изменения - выложу сюда  (Юрий М, ответил)
Изменено: Jack_Famous - 04.04.2016 21:58:01
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack_Famous написал:
не знаю, куда его прописать. Записал сюда: не работает
Записал сюда же, переименовал лист - работает.
Код
Private Sub UserForm_Initialize() 'Процедура инициализации формы
    On Error GoTo L1
    If Not Intersect(Sheets("Cascades"), Worksheets) Is Nothing Then
    End If
L1: If Err = 9 Then
        MsgBox ("Отсутствует лист «Cascades»")
'        Resume Next
        End
    End If
 
Юрий М, беда какая-то короче))) а это может быть связано с тем, что когда я копипастю код сюда или отсюда в Excel, у меня кракозябры вместо кириллицы?
Про проверку: работает при переименовании, но выдаёт ошибку при наличии...
Изменено: Jack_Famous - 04.04.2016 22:00:36
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack_Famous написал: у меня кракозябры вместо кириллицы
Код следует копировать про русской раскладке.
Проверку наличия листа можно посмотреть здесь
 
Не заметил сразу... Исправьте строку:
Код
On Error Resume Next
 
Спасибо за советы! Как уже писал, я охренел под вечер с такими пустяковыми вопросами и признаю)) уж такое решу сам, главное, что с "обрезками" разобрались))) Вы очень сильно помогли - спасибо вам огромное!  :idea: И - да, вы крутой 8) )))
P.S. Итоговый вариант здесь будет позже...
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Файл с описанием в коде. Все описанные проблемы решены благодаря Юрий М  8)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Прошу прощения, поторопился... После решения всех вопросов и внесения в файл выше, при выборе в первом ComboBox, выдаёт ошибку
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Выяснил, что ошибка происходит при переносе запуска формы на даблклик... Кто знает - как решить?
Код
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
         UserForm1.Show 0
End Sub
Изменено: Jack_Famous - 05.04.2016 20:59:54
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Убрал проверки и оставил запуск с кнопки на листе. Всё работает.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
BullDogik написал:
Неужели все так сложно?
ничего тут сложного нет. через 2-3 дня работы все начнет летать в удобном для Вас виде (и менеджеры вздохнут с облегчением)
а пока можна начинать сбор средств (среди менеджеров) на реализацию данного проекта
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Здравствуйте. Подскажите, а можно еще выбирать среди листов?
Код
With Sheets("Градиент")  'Применительно к указанному листу              LastRow = .Cells(Rows.Count, 1).End(xlUp).Row 'Нашли последнюю строку         LastColomn = .Cells(1, Columns.Count).End(xlToLeft).Column 'Нашли последний столбец 

Допустим, нам нужно в первом ComboBox1 - вывести список 3 листов книги, допустим листы 1,2,3, вот и выбираем 1 лист к примеру, ну а дальше как у Вас уже считываем диапазон таблицы из первого столбца данные подставляем в одну ячейку, из 2 в другую и т.д.?

Также подскажите еще у меня таблица  (смотри приложение) в номенклатуре указано 3 цены, разумеется ячейка с номенклатурой объединена в одну ячейку, а дальше идет разветвление на 3 цены. Так вот, у меня при таком раскладе в  первом ComboBox1 выпадает общий список всей номенклатуры, но между первой и второй пустая строка, если я выбираю первую номенклатуру, то отображается у меня в ComboBox2, только цена 1, а выбираю пустую строку выбирается только цена2 и цена 3! Как сделать. чтобы не было пустой строки и при выборе номенклатуры, у меня отображались и цена 1, и цена 2, и цена 3?

Изменено: vikttur - 10.06.2021 14:49:34
 
Дмитрий С, я давно ушёл от концепции каскадов и сейчас сцепляю все критерии в строку и ищу по строкам — это и есть универсальный метод, он гораздо проще в реализации и контроле, а также позволяет гораздо быстрее находить всё, что нужно  :idea:

Если раньше мне нужно было выбрать (на примере техники): Ноутбуки → Aser → XZ000", то сейчас я просто ищу строку "Ноутбуки|Aser|XZ000"
Могу ввести "aser", могу ввести "XZ" и, так как ищу по маске, всё быстро находится  ;)
Изменено: Jack Famous - 10.06.2021 13:23:45
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous,Мне бы больше подошел старый вариант, но нужны ответы на следующие вопросы: как осуществлять выбор сначала между листами, а затем уже в зависимости от выбранного листа, заполнять значения определенных ячеек, данными того листа который мы выбрали, если другой, то разумеется другим?
и второе, почему при объединении ячеек для общего названия товара для трех разных цен, у меня не выводятся данные трех цен? Выше более подробно я написал!
 
Цитата
Дмитрий С: старый вариант,
это не ко мне
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Юрий М,Здравствуйте. Подскажите, а можно еще выбирать среди листов?
Код
With Sheets("Градиент")  'Применительно к указанному листу              LastRow = .Cells(Rows.Count, 1).End(xlUp).Row 'Нашли последнюю строку         LastColomn = .Cells(1, Columns.Count).End(xlToLeft).Column 'Нашли последний столбец 

Допустим, нам нужно в первом ComboBox1 - вывести список 3 листов книги, допустим листы 1,2,3, вот и выбираем 1 лист к примеру, ну а дальше как у Вас уже считываем диапазон таблицы из первого столбца данные подставляем в одну ячейку, из 2 в другую и т.д.?

Также подскажите еще у меня таблица  (смотри приложение) в номенклатуре указано 3 цены, разумеется ячейка с номенклатурой объединена в одну ячейку, а дальше идет разветвление на 3 цены. Так вот, у меня при таком раскладе в  первом ComboBox1 выпадает общий список всей номенклатуры, но между первой и второй пустая строка, если я выбираю первую номенклатуру, то отображается у меня в ComboBox2, только цена 1, а выбираю пустую строку выбирается только цена2 и цена 3! Как сделать. чтобы не было пустой строки и при выборе номенклатуры, у меня отображались и цена 1, и цена 2, и цена 3?

 
Создайте отдельную тему с названием, отражающим суть задачи.
Страницы: Пред. 1 2
Наверх