Класс TextBox - создание текстового поля VBA. Создание формы в Excel VBA

Жаропонижающие средства для детей назначаются педиатром. Но бывают ситуации неотложной помощи при лихорадке, когда ребенку нужно дать лекарство немедленно. Тогда родители берут на себя ответственность и применяют жаропонижающие препараты. Что разрешено давать детям грудного возраста? Чем можно сбить температуру у детей постарше? Какие лекарства самые безопасные?

Давайте рассмотрим класс TextBox языка VBA, который позволяет размещать на форме текстовое поле. Класс vba TextBox позволяет создавать как многострочные, так и однострочные области для ввода текста, хот в последнем случае удобней воспользоваться функцией MsgBox. Также можно добавлять полосы прокрутки и определять максимальную длину вводимых символом. TextBox может использоваться и как компонент для ввода пароля.

Давайте для начала рассмотрим основные свойства класса TextBox и его базовое событие, а потом напишем пример.

События класса TextBox VBA языка

Value или Text – текст, который введен в текстовое поле TextBox

Visible – позволяет спрятать (значение false) или снова отобразить (значение true) элемент.

MultiLine – данное свойство позволяет задать, будет ли текстовое поле однострочным (false), или многострочным (true).

WordWrap – свойство актуально использовать, если MultiLine содержит значение true, в таком случае, если WordWrap установлено в true, то произойдет автоматический перенос текста на новую строку, когда будет достигнута граница текстового поля TextBox.

ScrollBars – позволяет указать, будут или отображаться полосы прокрутки. Свойство может принимать следующие значения:

  • 0 – fmScrollBarsNone (полосы прокрутки отсутствуют)
  • 1– fmScrollBarsHorizontal (горизонтальная полоса прокрутки)
  • 2 – fmScrollBarsVertical (вертикальная полоса прокрутки)
  • 3 – fmScrollBarsBoth (горизонтальная и вертикальная прокрутки)

PasswordChar – позволяет задать символ, который будет отображаться вместо вводимых данных. Свойство актуально при вводе пароля.

MaxLength – позволяет указать максимальное количество символов, которое можно ввести в текстовое поле. По умолчанию – 0, то есть, ограничения нет.

Как и у других элементов управления, у класса TextBox есть события, основным событием для TextBox является Change – оно возникает каждый раз, когда в текстовое поле вводится символ. Возможно вам приходилось видеть такую картинку: при вводе проверочного кода, пока его длинна не достигнет заданной (например, 12 символов), кнопка “Проверить” не будет доступной. Тут тоже можно такое реализовать.


Хорошо, теперь настало время практики. Я не буду снова вникать во все мелочи, как в прошлых статьях, поэтому скажу прямо: добавьте в проект новый модуль и новую форму. Выберите из окна ToolBox элемент управления Надпись (), добавьте ее на форму, пусть будет вверху, под ней поставьте текстовое поле (TextBox), а в самом низу – пусть будет кнопка ( с надписью “Проверить”). Хорошо, как и прежде, в редакторе кода для модуля прописываем процедуру:

Тут идет обработка одиночного щелчка по кнопке, при нажатии на кнопку, свойству Caption объекта Label1 (Надпись) будет присвоено содержимое текстового поля TextBox1 (свойство Text).

Private Sub TextBox1_Change() Dim LenText As Byte LenText = Len(TextBox1.Text) If LenText = 12 Then bCheck.Enabled = True Else bCheck.Enabled = False End If End Sub

Тут происходит обработка события Change для текстового поля объекта TextBox1 класса vba TextBox. Переменная LenText будет хранить длину вводимого текста, при каждом вводе данных будет происходить проверка длины, если она ровна 12 – то произойдет активация кнопки, иначе 0 кнопка будет неактивна.

В этой процедуре происходит настройка начальных значений, некоторые из них можно задать и в окне Свойств, но я решил для наглядности прописать все в программном коде. Тут нет ничего страшно, как только форма загрузится в память, кнопка “Проверить” будет неактивной, размер шрифта для текстового поля и надписи установлен в 20, также мы установили максимальную длину текста для класса TextBox VBA языка и его однострочность.

Вариант 5
Создать пользовательскую форму вида:


Создать в модуле формы частную процедуру-подпрограмму, запускающуюся при щелчке по кнопке с надписью «Расчет». Процедура должна вычислять максимальную сумму, начисленную за дневную работу какому-либо из сотрудников должности, название которой вводится в текстовое поле Поле1, в день недели, номер которого вводится в Поле2. Начисленная сумма вычисляется как произведение отработки на расценку. Результат вычисления процедура должна поместить в Поле3.
Для создания пользовательской формы нужно перейти в редактор кода Visual Basic (Alt+F11) и в меню выбрать Insert->UserForm. Затем нужно добавить нужные компоненты и настроить все параметры формы и компонентов – размер, шрифт, названия.
В данном случае нужны три элемента TextBox (TextDolgn – должность, TextDen – день недели, TextMaks – максимальная начисленная сумма), две кнопки (Расчет и Выход) и 4 надписи. Все свойства можно установить на панели Properties.
Если нажать два раза на кнопку Расчет, то редактор создаст заготовку процедуры. Внесем в нее текст:

Private Sub btnCalc_Click()
Dim r As Integer "номер строки
Dim c As Integer "номер столбца
Dim maxSum As Integer "максимальная начисленная сумма
Dim rng As Range "пользовательский диапазон
textMaks.Text = "" "очистка поля от предыдущего поиска
"если не введено название должности, то сообщение и выход из процедуры
If textDolgn.Text = Empty Then
MsgBox "Введите название должности!"
textDolgn.SetFocus "фокус на поле ввода
Exit Sub
End If
"если не введен номер дня, то сообщение и выход из процедуры
If textDen.Text = Empty Then
MsgBox "Введите номер дня недели (от 1 до 7)!"
textDen.SetFocus
Exit Sub
End If
"введено нечисловое значение дня
If Not (IsNumeric(textDen.Text)) Then
MsgBox "Нечисловое значение дня недели (нужно от 1 до 7)!"
textDen.SetFocus
Exit Sub
"введен неправильный номер дня недели
ElseIf (CInt(textDen.Text) < 1) Or (CInt(textDen.Text) > 7) Then
MsgBox "Неверное значение дня недели (нужно от 1 до 7)!"
textDen.SetFocus
textDen.Text = "" "очистка поля
Exit Sub
End If
"начинаем цикл с 3 строки
r = 3
"номер дня из поля ввода
c = CInt(textDen.Text)
Set rng = Sheets(1).UsedRange
maxSum = -1
For r = 3 To rng.Rows.Count
"если в ячейке найдено указанное название должности
If InStr(1, Cells(r, 2), textDolgn.Text, vbTextCompare) > 0 Then
"если сумма больше чем максимум, то меняем значение максимума на новое
If CInt(Cells(r, 3)) * CInt(Cells(r, c + 3)) > maxSum Then maxSum = CInt(Cells(r, 3)) * CInt(Cells(r, c + 3))
End If
Next r
If maxSum = -1 Then
MsgBox "Указанная должность не найдена"
textMaks.Text = "-"
Else
textMaks.Text = CStr(maxSum)
End If
Set rng = Nothing "освобождение памяти
End Sub
Тут куча всяких проверок. Сначала проверим, все ли данные внесены. Если нет – сообщим пользователю об этом, установим фокус ввода на чистом поле (для удобства пользователя, чтобы ему лишний раз мышью не тыкать) и выйдем из процедуры.
Затем проверим, правильно ли введен номер дня. Во-первых, это должно быть число, а во-вторых – число от 1 до 7. Если что-то не так – очищаем поле ввода, устанавливаем фокус на него и выходим из процедуры, опять же сообщив пользователю о неудачной попытке.
Если все путем, начинаем поиск нужных значений. Определим пользовательский диапазон, чтобы не зависеть от числа строк. Затем нужно в цикле найти максимальную сумму. Значения ячеек нужно с чем-то сравнивать. Здесь мы не можем просто подставить первую ячейку в строке или столбце, потом что необходимо отобрать по параметру – должности. Но мы видим, что начисленная сумма не может быть меньше нуля – расценка не может быть отрицательной, и число часов отработки тоже. Ну, в данном случае мы не рассматриваем возможность «красного сторно» - то есть исправления за предыдущие периоды. Так что возьмем начальную максимальную сумму равной -1 (минус один).
Начинаем цикл перебора ячеек столбца с указанным номером дня (это значение поля ввода плюс 3).
Смотрим, содержится ли в ячейке указанное название должности. Можно просто сравнить две строки, но это неудобно, поскольку надо будет вводить должность целиком и правильно. Поэтому используем функцию InStr, которая возвращает значение больше 0, если указанная подстрока найдена в строке. Можно было использовать функцию Like, которая тоже сравнивает две строки. Это на выбор разработчика.
Если должность в ячейке найдена, перемножаем расценку на число часов отработки и сравниваем результат с максимальной суммой. Если результат больше, то меняем его на новое значение.
Не забываем конвертировать строковые значения в числовые и наоборот там, где это нужно. Даже если Excel и сам понимает, где что содержится, лучше это делать для надежности.
После прохождения цикла смотрим, если максимальная сумма равна -1 (начальное значение), значит, нет такой должности. Выводим сообщение, а в поле помещаем прочерк для наглядности.
Если сумма не равна -1, то помещаем найденное значение в поле textMaks.
Освобождаем память объекта в конце программы.
Для кнопки Выход тоже есть текст:
Private Sub btnExit_Click()
"выгрузка формы
Unload Me
End Sub
Для запуска формы помещаем на лист с данными кнопку (вкладка «Разработчик», раздел «Элементы управления», список «Вставить» - выбрать кнопку из элементов управления формы) и назначим ей макрос Кнопка1_Щелчок. Затем в редакторе напишем код для этой кнопки:
Sub Кнопка1_Щелчок()
UserForm1.Show
End Sub
Все, можно проверять работу формы.
Я привел здесь только 5 вариант. Если нужно другой, то можно спросить в группе ВК (см. страницу с контактами). Но вообще, все варианты похожие. Есть только небольшие отличия, особенно, если нужно вывести строку с несколькими текстовыми значениями. Тогда можно использовать свойство текстбокса – Multiline для вывода нескольких строк, а для разделения использовать символы переноса на новую строку.

Для ввода и редактирования текста предназначены текстовые поля - элемент TextBox. Так же как и у элемента Label текст элемента TextBox можно установить или получить с помощью свойства Text.

По умолчанию при переносе элемента с панели инструментов создается однострочное текстовое поле. Для отображения больших объемов информации в текстовом поле нужно использовать его свойства Multiline и ScrollBars . При установке для свойства Multiline значения true, все избыточные символы, которые выходят за границы поля, будут переноситься на новую строку.

Кроме того, можно сделать прокрутку текстового поля, установив для его свойства ScrollBars одно из значений:

    None : без прокруток (по умолчанию)

    Horizontal : создает горизонтальную прокрутку при длине строки, превышающей ширину текстового поля

    Vertical : создает вертикальную прокрутку, если строки не помещаются в текстовом поле

    Both : создает вертикальную и горизонтальную прокрутку

Элемент TextBox обладает достаточными возможностями для создания автозаполняемого поля. Для этого нам надо привязать свойство AutoCompleteCustomSource элемента TextBox к некоторой коллекции, из которой берутся данные для заполнения поля.

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

Public partial class Form1: Form { public Form1() { InitializeComponent(); AutoCompleteStringCollection source = new AutoCompleteStringCollection() { "Кузнецов", "Иванов", "Петров", "Кустов" }; textBox1.AutoCompleteCustomSource = source; textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend; textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource; } }

Режим автодополнения, представленный свойством AutoCompleteMode , имеет несколько возможных значений:

    None : отсутствие автодополнения

    Suggest : предлагает варианты для ввода, но не дополняет

    Append : дополняет введенное значение до строки из списка, но не предлагает варианты для выбора

    SuggestAppend : одновременно и предлагает варианты для автодополнения, и дополняет введенное пользователем значение

Перенос по словам

Чтобы текст в элементе TextBox переносился по словам, надо установить свойство WordWrap равным true . То есть если одно слово не умещается на строке, то но переносится на следующую. Данное свойство будет работать только для многострочных текстовых полей.

Ввод пароля

Также данный элемент имеет свойства, которые позволяют сделать из него поле для ввода пароля. Так, для этого надо использовать PasswordChar и UseSystemPasswordChar .

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

Свойство UseSystemPasswordChar имеет похожее действие. Если мы установим его значение в true , то вместо введенных символов в текстовом поле будет отображаться знак пароля, принятый в системе, например, точка.

Из всех событий элемента TextBox следует отметить событие TextChanged , которое срабатывает при изменении текста в элементе. Например, поместим на форму кроме текстового поля метку и сделаем так, чтобы при изменении текста в текстовом поле также менялся текст на метке:

Public partial class Form1: Form { public Form1() { InitializeComponent(); textBox1.TextChanged += textBox1_TextChanged; } private void textBox1_TextChanged(object sender, EventArgs e) { label1.Text = textBox1.Text; } }

В этом примере используется Диалоговое окно - UserForm1, а также элементы управления Текстовое поле - TextBox1, TextBox2, TextBox3 для которых и создаётся контекстное меню. Обратите внимание на то, что имя контекстного меню, которое совпадает с именем формы (необязательное условие) должно быть уникальным, т.к. если панель инструментов с аналогичным именем уже существует, то при попытке создания новой панели, Вы получите ошибку. Этой ошибки можно избежать, если перед созданием панели проверить, нет ли панели с этим именем или же отказаться от использования необязательного аргумента Name метода.Add (см. аналогичный пример2)

Вариант II. Если предварительно скачать контрол iemenu.ocx (IE Popup Menu) и добавить его в список доступных ссылок, то создать контекстное меню можно с помощью этого элемента управления (см. пример3)

  • Ответ:

    Вариант I.

    Внимание:
  • Значения свойств MultiLine и ScrollBars можно установить вручную
  • Ответ:
    Для того, чтобы заполнить ячейки данными текстового поля, у которого значение свойства MultiLine установлено как True , можно использовать построчное чтение. Если ячейки уже заполнены, то удалите содержимое и форматы этих ячеек(столбца), предварительно проверив не защищены ли они

    Вариант I. (построчное чтение)

    Примечание:
  • Для ввода чисел с лидирующим нулём необходимо добавить соответствующую проверку.
  • При большом количестве строк в текстовом поле, имеет смысл отключить обновление экрана [FAQ43 ]

    Вариант II. (без построчного чтения)

  • Ответ:

    Если существует необходимость ввода в текстовое поле только уникальных(неповторяющихся ранее) символов. Иначе говоря, Вам нужно запретить ввод символов, которые уже наличествуют в тексте, то используйте нижеопубликованный вариант, где событие TextBox1_KeyPress применяется для запрета ввода дублей(повторов), а событие TextBox1_KeyDown для запрета вставки скопированных данных, которые могут содержать дубли(повторы)

    Вариант I.

  • Ответ:

    Для того, чтобы запретить ввод ненужных символов, например, символов, которые не могут использоваться в имени файла, можно использовать следующий вариант. Где событие TextBox1_KeyPress применяется для запрета ввода ненужных символов, а событие TextBox1_KeyDown для запрета вставки скопированных данных, которые, могут содержать запрещённые символы.

  • Ответ:

    Для того, чтобы определить какие из клавиш SHIFT, CTRL, ALT были нажаты при работе с текстовым именем с именем TextBox1, можно использовать следующий вариант. Вывод информации в заголовке пользовательской формы, на которой размещается текстовое поле, используется только для наглядности и, разумеется, не носит обязательного характера.

    Примечание: Подобным способом изменить шрифт можно и у других элементов управления, в т.ч. RefEdit, Label, ComboBox, ListBox ...
  • Ответ:

    Если Вам, в процессе работы, необходимо иметь возможность выбора нужных рабочих книг, например, с помощью стандартного диалогового окна, а также получить путь (или просто имя файла) выбранной книги, причём, без её открытия, то просто создайте текстовое поле с именем TextBox1, и по мере необходимости используйте кнопку, расположенную справа (кнопка появится без Вашего участия)



  • Поддержите проект — поделитесь ссылкой, спасибо!
    Читайте также
    Игра петушиные бои правила Игра петушиные бои правила Мод для майнкрафт 1.7 10 смотреть рецепты. Рецепты крафтинга предметов в Minecraft. Оружие в Minecraft Мод для майнкрафт 1.7 10 смотреть рецепты. Рецепты крафтинга предметов в Minecraft. Оружие в Minecraft Шиллинг и стерлинг - происхождение слов Шиллинг и стерлинг - происхождение слов