Найти в Дзене

📌 Создаем приложение VBA Excel. Часть 3: как разрешить выбор из ComboBox, но запретить ручной ввод. Обход стандартных свойств

Оглавление

Запрет на ручной ввод или его ограничение может быть установлен по разным причинам, но основной является - предотвращение ввода ошибочных данных и опечаток.

Но как быть, если нужно и ограничение, и возможность взаимодействия?

Сегодня поделимся определенной "фичей" позволяющей установить запрет на ручной ввод в ComboBox, но при этом оставить возможность вносить изменения и осуществлять выбор.

Создаем приложение VBA Excel. Часть 3: как разрешить выбор из ComboBox, но запретить ручной ввод. Обход стандартных свойств
Создаем приложение VBA Excel. Часть 3: как разрешить выбор из ComboBox, но запретить ручной ввод. Обход стандартных свойств

▶️ Пример исходных данных

В качестве примера рассмотрим форму предыдущего обзора

содержащую следующие ComboBox:

-3
  • ComboBox1 - список формируется из данных столбца В
  • ComboBox2 - зависимый ComboBox1 выпадающий список, формируется из данных столбца С
  • ComboBox3 - список из справочника (базы данных)

🎯 Требуется:

  • создать связи между двумя ComboBox2 и ComboBox3
  • запретить ручной ввод во всех ComboBox (разрешить выбор только из выпадающего списка);
  • настроить замену данных с использованием справочника.

▶️ Обзор свойств

Основными свойствами ComboBox которые позволяют установить определенные ограничения на взаимодействие с данным элементом являются:

  • TextLength (Длина текста): применяется к объектам, таким как текстовые поля, и определяет максимально допустимую длину текста, которую можно ввести в это поле. Если свойство TextLength установлено на определенное значение, то пользователь не сможет ввести в поле больше символов, чем задано этим свойством.
  • Enabled (Включено): применяется к элементам управления, таким как кнопки или текстовые поля, и определяет, активен ли данный элемент для взаимодействия с пользователем. Когда свойство Enabled установлено в True, элемент активен и пользователь может с ним взаимодействовать. Если Enabled равно False, элемент становится неактивным и недоступным для пользовательского ввода.
  • Locked (Заблокировано): свойство применяется к ячейкам и диапазонам и позволяет управлять доступом к их содержимому. Когда установлено в True, содержимое ячейки или диапазона становится заблокированным и нельзя его изменить без соответствующего снятия блокировки.
  • Style (Стиль): применяется к объектам, таким как ячейки или диапазоны, и определяет внешний вид объекта, включая формат шрифта, цвет заливки, границы и многое другое. С помощью Style можно быстро применить заранее заданный набор форматирования к объекту.
  • MatchRequired (Требуется совпадение): свойство связано с валидацией данных в Excel. Когда установлено в True для правила валидации данных, это означает, что введенное значение должно точно совпадать с одним из допустимых значений, заданных в правиле валидации. Если MatchRequired равно False, то значение будет считаться допустимым, если оно соответствует какому-либо из заданных условий, даже если не совпадает точно.

▶️ Ограничение взаимодействия. Подбор методов

Способ установки взаимной связи между элементами управления обычно выглядит так:

-4

Если никаких ограничений нет, то код срабатывает безупречно:

-5

А теперь, покажем на примере, что произойдет при установке ограничений.

Напомним, что ComboBoх3 уже имеет ограничение:

-6

А потому, используя описанные выше способы добавим ограничение для ComboBoх2.

🔘 Способ 1: Используем свойство Locked

Установите Locked в True - это предотвратит редактирование:

-7

А теперь, протестируем результат. Установленное ограничение не даст ошибку в коде, но и не даст возможность выбора из выпадающего списка ComboBoх2, а как следствие будет только дублировать запись из ComboBoх3 в ComboBoх2:

-8

🔘 Способ 2: Используем свойство Enabled.

Установите Enabled в False - это вовсе блокирует выбор (флажок элемента управления становиться не активным и пользователь не может сделать выбор:

-9

Аналогично предыдущему примеру будет доступно только дублирование записи:

-10

🔘 Способ 3: свойство Style в fmStyleDropDownList

-11

Это позволит делать выбор в ComboBoх2 и ограничит ручной ввод:

-12

Но макрос будет завершен ошибкой:

-13
На этом мы остановимся, но Вы можете поэкспериментировать, и поделиться результатом в комментариях.

😉

▶️ Решение: как установить взаимную связь ComboBox, если установлен запрет на ручной ввод

Итак, чтобы решить задачу выполним следующее:

1. Для ComboBox2 установим в коде ограничение на ввод с клавиатуры:

-14

2. Глобальные переменные: Объявим массив для хранения выбранных значений

-15

3. Для ComboBox3 определим действие на событие _Change определяющее связь с ComboBox2:

-16

4. Для события Initialize внесем изменения:

-17

4. Чтобы восстановить значение в ComboBox2 после замены добавим строку:

-18

Этот "обходной" метод запретит ручной ввод, но одновременно позволит:

  • хранить выбранные значения в массиве;
  • обновлять ComboBox2 с использованием этого массива;
  • пользователю выбирать значения из выпадающего списка ComboBox3 и добавлять их в ComboBox2 (в т.ч. одно и то же значение несколько раз)

▶️ Корректировка значений с использованием данных справочника

Теперь, когда связь между источником данных и формами установлена, добавлена возможность вносить изменения уже не в ручную, а используя актуальные данные справочника можно протестировать результат.

➡️ Для этого:

  • определим заказ и укажем Исполнителя:
-19
  • выберем нового исполнителя из справочника:
-20
  • выполним замену:
-21

Как видите все работает, но при этом ни в один ComboBox пользователь не может вносить данные с клавиатуры 😉.

А на этом сегодня все 👏

В следующих обзорах обсудим: как установить обратную связь между ComboBox и настроить вариативный поиск и изменение данных. Оставайтесь на связи 💖

-22
Наша команда очень заинтересована в создании качественного и полезного контента. Поэтому, если Вам понравился этот урок, не забудьте поблагодарить автора лайком 👍. Если у Вас есть вопросы или своё решение, не стесняйтесь оставить комментарий 💬. Нужно решение для другой проблемы? Пожалуйста, напишите свой вопрос в комментариях 💬, и мы обязательно рассмотрим его в ближайшей теме обзора. Мы ценим Вашу обратную связь 💝, так как это помогает нам оценить, насколько данный материал был полезен для Вас
Наша команда очень заинтересована в создании качественного и полезного контента. Поэтому, если Вам понравился этот урок, не забудьте поблагодарить автора лайком 👍. Если у Вас есть вопросы или своё решение, не стесняйтесь оставить комментарий 💬. Нужно решение для другой проблемы? Пожалуйста, напишите свой вопрос в комментариях 💬, и мы обязательно рассмотрим его в ближайшей теме обзора. Мы ценим Вашу обратную связь 💝, так как это помогает нам оценить, насколько данный материал был полезен для Вас

📍 Рекомендуемые статьи 🔽

СКАЧАТЬ ПРИМЕР