Vba excel textbox change

Содержание

  1. Событие изменения
  2. Синтаксис
  3. Settings
  4. Замечания
  5. См. также
  6. Поддержка и обратная связь
  7. TextBox.Change event (Access)
  8. Syntax
  9. Remarks
  10. Support and feedback
  11. Класс TextBox — создание текстового поля VBA
  12. События класса TextBox VBA языка
  13. VBA-Урок 12.2. Элементы управления (Controls)
  14. Checkboxes
  15. Кнопки опций (Option Buttons)

Событие изменения

Возникает при изменении свойства Value.

Синтаксис

Частный вложенныйобъект _Change( )

У события Change такой синтаксис:

Part Описание
object Обязательно. Допустимый объект.

Settings

Событие Change возникает при изменении свойства Value независимо от того, чем было вызвано изменение — выполнением кода или действиями пользователя.

Ниже приведены некоторые примеры действий, которые изменяют свойство Value .

Щелкните флажок CheckBox, OptionButton или ToggleButton.

Ввод или выбор нового текстового значения для comboBox, ListBox или TextBox.

Выбор другой вкладки в tabStrip.

Перемещение поля прокрутки в полосе прокрутки.

Щелчок стрелки вверх или стрелки вниз на spinButton.

Выбор другой страницы в MultiPage.

Замечания

Процедура обработки события Change может синхронизировать или координировать данные, отображенные в элементах управления. Например, с помощью процедуры обработки события Change для ScrollBar можно обновить содержимое текстового поля TextBox, отображающего значение ScrollBar. С помощью этой процедуры также можно отобразить данные и формулы в рабочей области, а результаты — в другом месте.

В некоторых случаях при изменении свойства Value также может возникать событие Click. Но применение события Change предпочтительнее для обнаружения нового значения свойства.

См. также

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

TextBox.Change event (Access)

The Change event occurs when the contents of the specified control change.

Syntax

expression.Change

expression A variable that represents a TextBox object.

Examples of this event include entering a character directly in the text box or combo box or changing the control’s Text property setting by using a macro or Visual Basic.

Setting the value of a control by using a macro or Visual Basic doesn’t trigger this event for the control. You must type the data directly into the control, or set the control’s Text property.

To run a macro or event procedure when this event occurs, set the OnChange property to the name of the macro or to [Event Procedure].

By running a macro or event procedure when a Change event occurs, you can coordinate data display among controls. You can also display data or a formula in one control and the results in another control.

The Change event doesn’t occur when a value changes in a calculated control.

A Change event can cause a cascading event. This occurs when a macro or event procedure that runs in response to the control’s Change event alters the control’s contents; for example, by changing a property setting that determines the control’s value, such as the Text property for a text box. To prevent a cascading event:

  • If possible, avoid attaching a Change macro or event procedure to a control that alters the control’s contents.
  • Avoid creating two or more controls having Change events that affect each other; for example, two text boxes that update each other.

Changing the data in a text box or combo box by using the keyboard causes keyboard events to occur in addition to control events like the Change event. For example, if you move to a new record and type an ANSI character in a text box in the record, the following events occur in this order:

KeyDown в†’ KeyPress в†’ BeforeInsert в†’ Change в†’ KeyUp

The BeforeUpdate and AfterUpdate events for the text box or combo box control occur after you have entered the new or changed data in the control and moved to another control (or clicked Save Record on the Records menu), and therefore after all of the Change events for the control.

In combo boxes for which the LimitToList property is set to Yes, the NotInList event occurs after you enter a value that isn’t in the list and attempt to move to another control or save the record. It occurs after all the Change events for the combo box. In this case, the BeforeUpdate and AfterUpdate events for the combo box don’t occur because Microsoft Access doesn’t accept a value that is not in the list.

Support and feedback

Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.

Источник

Класс TextBox — создание текстового поля 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 элемент управления Надпись (Label), добавьте ее на форму, пусть будет вверху, под ней поставьте текстовое поле (TextBox), а в самом низу – пусть будет кнопка (CommandButton с надписью “Проверить”). Хорошо, как и прежде, в редакторе кода для модуля прописываем процедуру:

Sub Module3() UserForm3.ShowEnd Sub

Учтите, что имя вашего модуля и формы могут отличаться.

Теперь нам нужно написать программный код на языке VBA, который будет делать следующее:

В текстовое поле будет вводиться текст, длина текста не больше 12 символов, пока длина будет меньше 12 символов, кнопка “Проверить” будет недоступна. Как только мы достигаем предела, кнопка становится активной, при нажатии на нее, содержимое текстового поля TextBox должно отобразиться в поле Label (Надпись).

И так, давайте посмотрим на процедуры, которые я прописал в редакторе кода для формы:

Private Sub bCheck_Click() Label1.Caption = TextBox1.TextEnd Sub

Тут идет обработка одиночного щелчка по кнопке, при нажатии на кнопку, свойству 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 IfEnd Sub

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

Private Sub UserForm_Activate() Label1.Caption = «Введите любой текст» Label1.FontSize = 15 Label1.ForeColor = &H0 Label1.TextAlign = fmTextAlignCenter Label1.WordWrap = True TextBox1.MultiLine = False TextBox1.MaxLength = 12 TextBox1.FontSize = 15 bCheck.Enabled = FalseEnd Sub

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

Источник

VBA-Урок 12.2. Элементы управления (Controls)

Элементы управления имеют все виды свойств и много событий связанных с ними, но сейчас мы лишь рассмотрим несколько из них, которые используются в VBA программировании:

Давайте начнем с добавления 3-х элементов управления — Label , TextBox и CommandButton :

Давайте сейчас отредактируем название и свойства этого элемента управления (используя свойство Caption , которое содержит текст). Мы хотим получить следующий результат:

Сейчас, когда мы введем номер и нажмем ОК — ничего не произойдет.

Чтобы создать какое-то событие, мы начнем добавлять событие, которое введет значение из текстового окна в ячейки А1 и закроет Форму.

Вы можете получить доступ к опциям, которые показаны ниже, дважды щелкнув по элементу управления:

Данный выпадающий список содержит различные элементы управления и эту Форму.

Выберите кнопку (Button) и событие Click:

Введенное значение сейчас уже будет сохранено в ячейке А1 перед закрытием этой Формы ( UserForm ).

Добавьте вторую подпись (Label) и измените следующие свойства: Caption , Forecolor (color: red) and Visible (False, чтобы скрыть элемент управления по умолчанию) :

Теперь давайте добавим событие, которое будет запускаться, когда значение в поле будет изменено. Событие отобразит сообщение об ошибке, если значение не является цифровым.

Введенное значение будет тестироваться каждый раз при вводе очередного символа.

Нам еще нужно предотвратить валидацию формы, если значение не является числом.

Для того, чтобы не оставлять правую сторону формы пустой, когда там нет сообщения об ошибке, мы можем уменьшить её размер, откорректировав свойство Width этой формы:

Вы можете скачать Excel файл с примером: userform1.xls

Checkboxes

Далее пример как использовать CheckBox :

Когда чекбокс отмеченный/неотмеченный, значение связанной ячейки может быть изменено из-за использования события Click :

В этом примере, чекбокс стартует неотмеченным, когда Форма открывается впервые.

Чтобы проверить бокс когда значения соответствующих ячеек является & quot; Отмечено & quot;, мы запустим проверку когда форму активировано, используя UserForm_Initialize:

Здесь вы можете посмотреть пример в готовом Excel файле: userform2.xls

Кнопки опций (Option Buttons)

Пользователь может выбрать только одну кнопку-опцию на «группу» в отличие от чекбоксов.

Чтобы создать «группу», сначала вставьте Frame, а затем OptionButton :

Здесь вы можете посмотреть пример в готовом Excel файле: userform3.xls

Как только форма была отправлена, мы введем данные в ячейку, которая связана с названием колонки и row_value chosen.

Для того, чтобы знать какие опции были выбраны, мы могли бы сделать то же самое что и в предыдущем примере (с чекбоксами), но мы используем цикл, чтобы уменьшить размер кода.

Мы собираемся использовать цикл For Each , тип цикла, который мы еще до этого не рассматривали. Этот цикл позволяет выполнять инструкции для каждого объекта в «группе объектов»:

Сейчас эта форма вводит значение «Ячейка выбрана!» в ячейку, которая была выбрана.

Чтобы избежать баги, нам необходимо проверить , что пользователь выбрал правильно с двух наборов опций.

В этом примере, когда форма еще не завершена, кнопка «Подтверждение» («Confirm») появится в сером (будет деактивирована). Это не самое простое решение, но это хороший пример того, почему функции/процедуры является Полезные внутри формы (UserForm).

Измените текст и свойство Enabled , чтобы деактивировать кнопку.

Результат будет следующий:

В предыдущем коде мы использовали два For Each цикла, чтобы получить значение опционных кнопок (option buttons). Сейчас нам нужно использовать те же значения для кнопки «Подтверждение» («Confirm») и событие Click для десяти опций.

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

Начнем с предыдущего кода и модифицируя его, мы достигнем этого результата:

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

Опять же, проверка выполняется в отдельной процедуре, чтобы избежать копирования кода 10 раз для каждого события каждого опционной кнопки:

Источник

 

Tyhoon

Пользователь

Сообщений: 8
Регистрация: 25.08.2016

#1

25.08.2016 19:06:10

Доброго всем времени суток!
Возникла следующая проблема.
В одной из форм написал функционал события (Change) для объекта TextBox , которое обеспечивает в зависимости от заполненности поля TextBox (заполнено/не заполнено) изменение надписи на кнопке (ОК/ВЫХОД соответственно):

Код
Private Sub Ins_Info_Change() 
If Len(Ins_Info.Value) = 0 Then 
But_OK.Caption = "ВЫХОД" 
Else 
But_OK.Caption = "OK" 
End If 
End Sub 

Проблема следующая: если запускаю эту форму непосредственно изнутри (F5) — всё работает: меняется так, как требуется, но при активации данной формы из другой формы событие почему-то не выполняется. Если кто-нибудь сможет пояснить, почему — буду крайне признателен. Заранее спасибо

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

У TextBox нет .Value
Ins_Info.Text

 

И с валюей и без неё все работает. Может покажете файл?

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#4

25.08.2016 20:27:10

Цитата
vikttur написал: У TextBox нет .Value

Витя…всегда было. Не путай с чистым VB…Tyhoon, у TextBox-а вообще-то есть специальное свойство: .TextLength:

Код
Private Sub Ins_Info_Change()
If Ins_Info.TextLength = 0 Then
But_OK.Caption = "ВЫХОД"
Else
But_OK.Caption = "OK"
End If
End Sub

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

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Tyhoon

Пользователь

Сообщений: 8
Регистрация: 25.08.2016

Вот тут-то и кроется основная непонятка: программа просто не видит код: ставлю остановку при изменении содержимого поля — реакции ноль. А за TextLength большое спасибо — не сообразил

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

Значит событие изменения не инициируется. И это не загадка — это проблема кода. Либо файл выкладывайте, либо на картах гадайте. Нам отсюда не видать, что Вы там как делаете, что ничего не работает :)

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Tyhoon

Пользователь

Сообщений: 8
Регистрация: 25.08.2016

Прилагаю файл…

Заранее благодарю потенциальных проблеморазрешителей! Ибо мои тупые мозги постичь всю глубину мысли Великого Микрософта не в состоянии…

Изменено: Tyhoon26.08.2016 11:28:03

 

U_M0KRH

Пользователь

Сообщений: 158
Регистрация: 20.10.2014

#8

26.08.2016 13:45:28

Код
Private Sub List_Part_KeyPress(ByVal k As MSForms.ReturnInteger)
If List_Part.ListIndex = -1 And List_Part.Text & Chr(k) <> "" Then
Dim card As New LIST_Element
Fr_Main.Visible = False
card.Show
Fr_Main.Visible = True
End If
End Sub
 

Tyhoon

Пользователь

Сообщений: 8
Регистрация: 25.08.2016

#9

26.08.2016 14:38:28

Большое спасибо, U_M0KRN, всё заработало. Только без Chr(k) — с ней выдаёт ошибку. Единственное, так и не понял, почему не работал мой вариант?..

Давайте рассмотрим класс 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 символов), кнопка “Проверить” не будет доступной. Тут тоже можно такое реализовать.

Форма vba с элементами TextBox и Label

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

Sub Module3()
    UserForm3.Show
End Sub

Учтите, что имя вашего модуля и формы могут отличаться.

Теперь нам нужно написать программный код на языке VBA, который будет делать следующее:

В текстовое поле будет вводиться текст, длина текста не больше 12 символов, пока длина будет меньше 12 символов, кнопка “Проверить” будет недоступна. Как только мы достигаем предела, кнопка становится активной, при нажатии на нее, содержимое текстового поля TextBox должно отобразиться в поле Label (Надпись).

И так, давайте посмотрим на процедуры, которые я прописал в редакторе кода для формы:

Private Sub bCheck_Click()
    Label1.Caption = TextBox1.Text
End Sub

Тут идет обработка одиночного щелчка по кнопке, при нажатии на кнопку, свойству 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 кнопка будет неактивна.

Private Sub UserForm_Activate()
    Label1.Caption = "Введите любой текст"
    Label1.FontSize = 15
    Label1.ForeColor = &H0
    Label1.TextAlign = fmTextAlignCenter
    Label1.WordWrap = True
    TextBox1.MultiLine = False
    TextBox1.MaxLength = 12
    TextBox1.FontSize = 15
    bCheck.Enabled = False
End Sub

TextBox языка VBA - процедуры формы

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

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

Если Вы чувствуете, что Вам не хватает знаний по VBA, тогда пройдите мой другой курс для начинающих на VBA — объясняю просто и доступно «до тошноты» 🙂

Вам также может понравиться

Это завершающий урок из курса «Погружение в язык VBA»

0546

В этом видеоуроке мы научимся автоматически импортировать

0590

В этом видеоуроке мы научимся автоматически выгружать

0478

В этом видеоуроке мы будем исправлять некоторые ошибки в коде.

0448

В этом видеоуроке мы доделаем функционал по получению

0465

В этом видеоуроке мы научимся получать курс валюты

0509

В этом видеоуроке мы научимся обрабатывать Ошибки Error

0415

В этом видеоуроке мы будем учиться работать с таким

0426

  • Remove From My Forums
  • Question

  • I have a userform in excel and it contains limits to test spreadsheet values by. I let the users tailor a set of ranges then they can press a next button
    and I explore the next set of columns looking to see if it fits the ranges on the userform . If it doesn’t, I redisplay the userform and allow a correction of the spreadsheet data that is displayed on the form in addition to the range limits. My problem is
    when the user changes the limits, they do not appear to be updated. I can change the low limit say, and when the code checks the data on the spreadsheet, the userform field changes back to its old value. What is going on here and how do I fix it?  Here
    are some snippets of code that almost work:

                        

    I watch Testparam.txtDomLo.Value being changed from a 1 to a zero and the enter key pressed. Then Next is pressed and the test below for txtDomLo.Value fails. It still contains a 1 rather than the entered zero. I know I am doing something fundamentally wrong
    with the change events but I don’t know how to solve it. Thanks for any help

    If Val(ws.Cells(r, c + 4)) < Val(TestParam.txtDomLo.Value) Or Val(ws.Cells(r, c + 4)) > Val(TestParam.txtDomHi.Value) Then
            FixErrors ws, r, c, «Days on Market Out of Range»
    End If

    Sub FixErrors(ws As Worksheet, r As Long, c As Long, errmsg)

     
        TestParam.lblCol1 = Col_Letter(c)
        TestParam.lblCol2 = Col_Letter(c + 1)
        TestParam.lblCol3 = Col_Letter(c + 2)
        TestParam.lblCol4 = Col_Letter(c + 3)
        TestParam.lblCol5 = Col_Letter(c + 4)
        TestParam.lblRow = Str(r)

        TestParam.txtSalesPrice.Value = ws.Cells(r, c)
        TestParam.txtSqFt.Value = ws.Cells(r, c + 1)
        TestParam.txtPricePerSqFt.Value = ws.Cells(r, c + 2)
        TestParam.txtListPrice.Value = ws.Cells(r, c + 3)
        TestParam.txtDOM.Value = ws.Cells(r, c + 4)
        TestParam.lblStatus.Caption = errmsg

        TestParam.Show vbModal

    End Sub

    • Moved by

      Wednesday, May 10, 2017 1:50 PM

The class use, as the answer above suggests, it is a good strategy to deal with many controls in a concise and elegant way, however:

1) I see no problems in creating 25 events with 1 line, calling a common userform private routine, unless the number of controls is dynamic. It’s a KISS philosophy.

2) Generally, I consider the Change event very disturbing because he does all the recalculation each digit entered. It is more sensible and moderate do this using the Exit event or Before Update event, because it makes the recalculation only when deciding on a value. For instance, The Google Instant annoy me trying to return responses, consuming resources, without the user having defined the question.

3) There was a validation problem. I agree that you can avoid wrong keys with Change event, however if you need to validate the data, you can not know if the user will continue typing or if the data is ready to be validated.

4) You should remember that Change or Exit events does not force the user to pass in text fields, so the system needs to be revalidated and recalculated when trying to exit the form without canceling.

The following code is simple but effective for static forms.

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call  AutoCalc(Cancel)
End Sub

Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call  AutoCalc(Cancel)
End Sub
.....
Private Sub TextBox25_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call  AutoCalc(Cancel)
End Sub

Private Function Valid
.....
End Function 

Private Sub AutoCalc(Canc As Variant)
If Not Valid() Then Canc=True
'  Calculation
End Sub

It you are addicted to save time, you can create a generic VBA routine in order to generate code for events related to controls in a form that fit a mask. This code can be in a draft sheet (it’s safer that generate directly code, that is buggy in some Excel versions) and than copy and paste to a form module.

 Sub GenerateEvent(Form As String, Mask As String, _
   Evento As String, Code As String)
 '  Form - Form name in active workbook
 '  Mark - String piece inside control name
 '  Evento - Event name to form procedure name
 '  Code   - Code line inside event
 Dim F As Object
 Dim I As Integer
 Dim L As Long
 Dim R As Range
 Dim Off As Long
 Set F = ThisWorkbook.VBProject.VBComponents(Form)
 Set R = ActiveCell   ' Destination code
 Off = 0
 For I = 0 To F.Designer.Controls.Count - 1
    If F.Designer.Controls(I).Name Like "*" & Mask & "*" Then
        R.Offset(Off, 0) = "Private Sub " & _
          F.Designer.Controls(I).Name & "_" & Evento & "()"
        R.Offset(Off + 1, 0) = "     " & Code
        R.Offset(Off + 2, 0) = "End Sub"
        Off = Off + 4
    End If
 Next I
 End Sub

 Sub Test()
 Call GenerateEvent("FServCons", "tDt", "Exit", _
    "Call AtuaCalc(Cancel)")
 End Sub

  1. 02-06-2013, 02:41 PM


    #1

    TextBox Change Event HELP

    Hello Excel VBA experts,

    I have created a textbox (activex control) that I would like to work with my calculation. Notice that, the code below, I want users to enter only numerical numbers (including decimals…e.g. 25.50) and if it’s really numerical, the textbox will show it in percentage format with 2 decimal places (e.g. 25.50%). However, whenever I try to type it more than 2 digits, it always goes to the 2nd IF statement where the msgbox is. The reason too why I want it to be a ‘change’ event so that I could see instantly of the calculation when the user input whatever numbers.

    Your help is greatly appreciated!

    Last edited by dluhut; 02-06-2013 at 03:10 PM.

    Reason: Attached file


  2. 02-06-2013, 02:46 PM


    #2

    Re: TextBox Change Event HELP

    you type procedure in «change» event so when You type something procedure starting because its value is change.
    Then in procedure in IF’s you change value of TextBox so it is change again and again

    try to use other event (maybe «AfterUpdate») or change your idea for prevent starting change sub all the time when any value will be typed

    Best Regards
    MaczaQ
    —————————————————————————————————————————
    If you are satisfied with the solution(s) provided, please mark your thread as Solved
    If you are pleased with my answer consider to rate it. To thank someone who has helped you, click on the star icon below their name.
    — This way you will add him some reputation points … thanks in advance.


  3. 02-06-2013, 02:46 PM


    #3

    Re: TextBox Change Event HELP

    Can you attach the workbook that you currently work on?


  4. 02-06-2013, 03:08 PM


    #4

    Re: TextBox Change Event HELP

    @ JieJenn, I have attached the file that I’m working (in the first post after I’ve edit). Forgive me if you see the code in mess, since I’m not a programmer.

    @ MaczaQ, How would you do this then, if you were me. Basically, trying to accomplish these few things.
    1. Instantaneously change the amount when user input.
    2. User able to input with decimals (i.e. 25.2)
    3. Show ‘%’ sign after user have finish input the data in the textbox.


  5. 02-06-2013, 04:14 PM


    #5

    Re: TextBox Change Event HELP

    If the above 3 requirements are not able to met, then I’m willing to take out the ‘%’ sign. Which means point 1 and 2 has to be met


  6. 02-06-2013, 05:06 PM


    #6

    Re: TextBox Change Event HELP

    Public oldvalue As Double

    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)

    temp = TextBox1.Value
    If Not IsNumeric(temp) Then temp = oldvalue
    oldvalue = temp

    TextBox1.Value = Format(oldvalue / 100, «0.00%»)

    End Sub

    Private Sub UserForm_Activate()
    If IsNumeric(TextBox1.Value) Then
    oldvalue = TextBox1.Value
    Else
    oldvalue = 0: TextBox1.Value = Format(0, «0.00%»)
    End If
    End Sub


  7. 02-06-2013, 05:23 PM


    #7

    Re: TextBox Change Event HELP

    @Mehmetcik. Thank for the help. Although I’m not an expert with VBA, however, from the 2nd code, it seems like you assume I’m using a form. But I don’t. I’m using the ActiveX control TextBox. I have attached the spreadsheet for reference


  8. 02-07-2013, 07:40 PM


    #8

    Re: TextBox Change Event HELP


  9. 02-07-2013, 07:54 PM


    #9

    Re: TextBox Change Event HELP

    The following seems to work.

    I created the textbox using «Developer — Insert — Textbox»

    I opened the revelent macro module by clicking on Design Mode then right clicking on the text box and selecting view code.
    Paste the text below into that window.

    Deselect Design mode.

    ENJOY.

    Public oldvalue As Double
    Private Sub TextBox1_Change()
    temp = TextBox1.Value
    If Right(temp, 1) = «%» Then temp = Left(temp, Len(temp) — 1)
    If Not IsNumeric(temp) Then temp = oldvalue
    oldvalue = temp

    TextBox1.Value = Format(oldvalue / 100, «0.00%»)
    End Sub


  10. 02-08-2013, 10:31 AM


    #10

    Re: TextBox Change Event HELP

    Hi Mehmetcik,

    Have tried copying the latest code and still doesn’t work.

    Did you really not see the attached file? It was on the very first post of this thread.


  11. 02-08-2013, 03:29 PM


    #11

    Re: TextBox Change Event HELP

    Ok I’ve modified your code for textbox1.

    As follows:-

    Private Sub TextBox1_Change()

    If flag = True Then GoTo 200

    temp = TextBox1.Value
    If Right(temp, 1) = «%» Then temp = Left(temp, Len(temp) — 1)

    If Len(Me.TextBox1) >= 1 And Not IsNumeric(temp) Then

    MsgBox «Sorry, only numbers allowed»

    TextBox1.Value = vbNullString
    ActiveSheet.Label1.Caption = «»
    ActiveSheet.Label12.Caption = «»
    temp = 36

    Else: flag = Not flag
    If flag = True Then TextBox1.Value = Format(temp / 100, «0.00%»)

    20 End If

    If Range(«C16»).Value = 0 Then
    ActiveSheet.Label49.Caption = «»
    ElseIf Range(«C16»).Value >= 50 Then
    With ActiveSheet.Label49
    .Caption = Format(Range(«E16»).Value, «$#,#.00»)
    .Font.Size = 48
    End With
    Else
    With ActiveSheet.Label49
    .Caption = «Min 50 Phones.»
    .Font.Size = 35
    End With
    End If

    GoTo 300

    200 flag = False

    ActiveSheet.Label1.Caption = Range(«D3»)
    ActiveSheet.Label12.Caption = Format(Range(«E3»).Value, «$#,#.00»)
    300 ‘ exit

    End Sub


  12. 02-08-2013, 04:24 PM


    #12

    Re: TextBox Change Event HELP

    Hi Mehmetcik,

    Sorry for not being clear…instead of TextBox1, is it possible to look at «TextBox_MCDDisc»? It is on that box, where users will be inputting the numerical (with decimals included) and then transform it to «%»…I’ve tried to change your code from TextBox1 to TextBox_MCDDisc and it doesn’t work.


  13. 02-08-2013, 07:20 PM


    #13

    Re: TextBox Change Event HELP


  14. 02-12-2013, 10:22 AM


    #14

    Re: TextBox Change Event HELP

    Hi mehmetcik,

    Really appreciate your help.

    Tried it, but give me the following errors.
    1. Tried to type 2 digits (i.e. 30), result error.
    2. Tried to type 4 digits with decimal (i.e. 25.25), result error.


  15. 02-12-2013, 05:17 PM


    #15

    Re: TextBox Change Event HELP

    Sorry About That.

    I have modified the macro,so it only runs when you exit the text box. This simplifies the code and it seems to work.
    The code is now in the Lostfocus event


  16. 02-13-2013, 10:16 AM


    #16

    Re: TextBox Change Event HELP

    Hi Mehmetcik,

    Although I would like to have it in ‘Change’ instead of LostFocus, but I would consider this thread to be solved. Thanks for all your help. Please check your reputation as I’ve increased it.


Понравилась статья? Поделить с друзьями:
  • Vba excel text in cell no
  • Vba excel shapes group
  • Vba excel shape свойства
  • Vba excel shape no fill
  • Vba excel set sheet