Всем привет! 👋
Сегодня мы рассмотрим 2 (два) способа решения позволяющие вносить изменения в уже существующие записи выпадающих списков.
📢 Скачать исходник с примером кода вы можете в конце статьи 🔽
▶️ Постановка задачи
В целях данного примера будем использовать уже рассмотренную ранее форму:
Функционал данного примера позволяет взаимодействовать с выпадающими списками, удалять и добавлять новые значения.
А как насчет внесения изменений? 😉
Нет, этого пока данное решение это "не умеет". Но это легко поправимо!
Итак, задача:
🎯 предоставить пользователю возможность вносить изменения в уже имеющиеся данные (например, в результате опечатки или изменения стоимости товара)
▶️ Элементы управления
Чтобы справиться с поставленной задачей добавим элементы управления:
- TextBox (только для первого способа)
* В последующем, данные элементы можно скрыть (чтобы не загромождать форму) изменив размер формы или установить свойство
Visible=False:
Данное свойство позволит не отображать "служебные" элементы управления на форме:
- CommandButton (кнопка)
▶️ Способ 1. Используем дополнительный элемент управления
Смысл решения будет заключаться в связи данных TextBox и ComboBox.
Напомним, что механизм заполнения ComboBox1 и ComboBox2 уже определен. Остается внести лишь небольшую корректировку.
Чтобы выбранное значение из ComboBox1 было тут же записано TextBox добавив зададим событие ComboBox1_Click:
Аналогично поступим для ComboBox2:
Теперь при выборе значений они будут продублированы в соответствующие TextBox:
Это даст возможность внести изменения в нужный ComboBox, при этом данные в TextBox будут исходными:
🔘 Остается только назначить соответствующий макрос чтобы изменения вступили в силу:
Теперь данные в исходной таблице будут изменены:
Для того чтобы измененные значения сразу попадали в выпадающие списки ComboBox1 и ComboBox2, вам нужно будет обновить списки значений после внесения изменений в таблицу.
🔘 Вот как это можно сделать:
📝 Краткое описание:
🔹 Подготовка переменных:
- ws (рабочий лист),
- lastRow (последняя строка с данными),
- i (счетчик цикла),
- r (диапазон для проверки уникальных значений),
- tmp (вспомогательная переменная для проверки уникальности).
🔹 Сохранение текущих выбранных значений: Для того чтобы сохранить текущие выбранные значения в ComboBox1 и ComboBox2 используем переменные selectedValueComboBox1 и selectedValueComboBox2.
🔹 Обработка данных и обновление значений в таблице на основе выбранных параметров: Перебираем строки данных, начиная с 2-й строки (первая строка считается заголовком). Для каждой строки проверяется условие:
- Если ComboBox2 не имеет выбранного значения (пустой), выполняем следующие действия: ищем значение в столбце В равно значению из TextBox2 и если оно отличается от ранее установленного - заменяем.
- Если ComboBox2 имеет выбранное значение (не пустой), выполняем проверку по всем столбцам, и при наличии расхождений обновляем данные в столбцах.
🔹 Обновление ComboBox: выполняется на основе значений в столбцах B и С. Если значение уже есть в ComboBox, оно не добавляется повторно. Т.к. выпадающие списки зависимые ComboBox2 обновляется на основе выбранного значения в ComboBox1.
🔘 Восстановление значений в ComboBox и TextBox: значение TextBox восстанавливается с помощью переменной selectedValueComboBox, чтобы сохранить выбор пользователя, далее восстанавливаем ComboBox1 и ComboBox2
➡️ Теперь после внесения изменений в таблицу, макрос будет обновлять списки значений ComboBox1 и ComboBox2 и отображать внесенные изменения в выпадающих списках без закрытия/открытия формы:
📍 Примечание автора: Не забудьте скрыть "служебные" TextBox:
Функционал форма не потеряет, а напротив, не будет загромождена и приобретет привлекательный вид.
▶️ Способ 2. Используем глобальные переменные для хранения выбранного значения
Как вы могли заметить, в рассмотренном примере суть TextBox заключалась только в хранении значения для сравнения.
А если это так 🤔, то можно ли сохранить значение в памяти приложения не используя дополнительный элемент управления?
Да, можно! 😉
🔘 Достаточно объявить глобальные переменные для хранения значений и использовать событие Click:
Чтобы продемонстрировать как работает сохранение данных в памяти приложения воспользуемся оператором MsgBox:
Как видите данные сохраняются аналогично тому, как при использовании TextBox.
Причем, изменение значения в любом из ComboBox никак не повлияет на исходные данные, т.к. мы их уже запомнили:
Это позволит проводить сравнение, подобно тому, как рассматривалось ранее.
🔘 Так как основной код мы разобрали выше, то применим его, внеся лишь небольшие правки:
🔔 Основное отличие заключается в том, что проверка условия будет осуществляться ни по значению из TextBox, а по значению глобальной переменной.
➡️ В остальном, данный макрос, аналогично рассмотренному выше, позволит вносить изменения в в уже существующие записи выпадающих списков, в т.ч:
- менять категорию (категория сразу заносится в выпадающий список):
- менять наименование товара (как для измененной категории, так и вновь выбранной. Наименование товара также сразу вносится в выпадающий список)
- менять стоимость товара (как для отдельно взятого товара, так и для ранее измененного)
🔵 Мы привели рамочный пример решения, но полагаем, что данный алгоритм вы легко сможете адаптировать под свои нужны.
А какой из способов выбрать, решать вам.
Но на наш взгляд использование глобальных переменных является лучшим 😉, но не единственным решением.
О том, как еще можно установить связь, выполнить поиск значений и их замену расскажем в следующих обзорах. Оставайтесь на связи! 💖
🔎 Рекомендуемые статьи 🔽