Не происходит обработка событий для TextBox (VBA)
Формулировка задачи:
Excell 2003, форму не создавал, элементы управления непосредственно на листе WorkSheet (в том числе и TextBox).
Требуется ввести дату рождения человека и вычислить его полный возраст. Для исключения операторских ошибок оформил ввод даты в три приёма: день, месяц, год. (да, понятно что никто не запретит ввести 31 февраля, но пока закрыл на это глаза).
Объект TextBox_BDay прекрасно принимает день рождения.
С месяцем рождения та же петрушка, всё прекрасно. А вот с годом проблема. Длиннее 4-значной даты не введут, старше текущего года тоже не дам. А вот 1-, 2- и 3-значные значения года всё портят. Чтобы пофиксить нужна обработка пропадания курсора из поля ввода (TextBox6). Как только оператор сдвинул фокус в сторону, не закончив ввод года, TextBox примет нижнее пороговое значение. И все счастливы:
Гуглил - народ регулярно находит эти грабли, но решения нет. Кто-то вышел из ситуации, заменив TextBox ComboBox'ом, кто-то написал: "Это решается с помощью класса. (Public WithEvents TextBox As MSForms.TextBox)... Но я пока классов не знаю".
Может, кто-нибудь сталкивался? У меня вообще подозрение что без создания формы UserForm тут никак не обойтись. Или можно?
С полным возрастом тоже не всё гладко: (ТекущаяДата - ДатаРождения)/365 правильного возраста не дают. Что-то придётся придумывать.
Требуется ввести дату рождения человека и вычислить его полный возраст. Для исключения операторских ошибок оформил ввод даты в три приёма: день, месяц, год. (да, понятно что никто не запретит ввести 31 февраля, но пока закрыл на это глаза).
Объект TextBox_BDay прекрасно принимает день рождения.
не позволит врагу ввести букву либо отрицательное число.
С месяцем рождения та же петрушка, всё прекрасно. А вот с годом проблема. Длиннее 4-значной даты не введут, старше текущего года тоже не дам. А вот 1-, 2- и 3-значные значения года всё портят. Чтобы пофиксить нужна обработка пропадания курсора из поля ввода (TextBox6). Как только оператор сдвинул фокус в сторону, не закончив ввод года, TextBox примет нижнее пороговое значение. И все счастливы:
А не тут-то было... События Change и KeyPress обрабатываются прекрасно. Ни Click, ни DblClick, ни Enter не обрабатываются вообще: Cancel = True и всё.
Гуглил - народ регулярно находит эти грабли, но решения нет. Кто-то вышел из ситуации, заменив TextBox ComboBox'ом, кто-то написал: "Это решается с помощью класса. (Public WithEvents TextBox As MSForms.TextBox)... Но я пока классов не знаю".
Может, кто-нибудь сталкивался? У меня вообще подозрение что без создания формы UserForm тут никак не обойтись. Или можно?
С полным возрастом тоже не всё гладко: (ТекущаяДата - ДатаРождения)/365 правильного возраста не дают. Что-то придётся придумывать.
Решение задачи: «Не происходит обработка событий для TextBox (VBA)»
textual
Листинг программы
<font color="blue">Private</font> <font color="blue">Sub</font> TextBox6_Change() <font color="#00AA00">' Год рождения</font> <font color="blue">If</font> TextBox6.Value > <font color="darkblue"><b>2011</b></font> <font color="blue">Then</font> TextBox6.Value = <font color="teal">"1900"</font> <font color="blue">End</font> <font color="blue">End</font> <font color="blue">If</font> <font color="blue">End</font> <font color="blue">Sub</font> <font color="blue">Private</font> <font color="blue">Sub</font> TextBox6_lostfocus() <font color="blue">If</font> TextBox6.Value < <font color="darkblue"><b>1899</b></font> <font color="blue">Then</font> TextBox6.Value = <font color="darkblue"><b>1900</b></font> <font color="blue">End</font> <font color="blue">If</font> <font color="blue">Call</font> DateBirth <font color="blue">End</font> <font color="blue">Sub</font> <font color="blue">Private</font> <font color="blue">Sub</font> TextBox6_KeyPress(<font color="blue">ByVal</font> KeyASCII <font color="blue">As</font> MSForms.ReturnInteger) <font color="blue">If</font> KeyASCII < <font color="darkblue"><b>48</b></font> <font color="blue">Or</font> KeyASCII > <font color="darkblue"><b>57</b></font> <font color="blue">Then</font> KeyASCII = <font color="darkblue"><b>0</b></font> <font color="blue">End</font> <font color="blue">If</font> <font color="blue">End</font> <font color="blue">Sub</font> <font color="blue">Private</font> <font color="blue">Sub</font> DateBirth() <font color="#00AA00">'Формируем дату из 3 полей ввода</font> <font color="blue">Dim</font> BirthT <font color="blue">As</font> Variant <font color="blue">Dim</font> Birth <font color="blue">As</font> <font color="blue">Date</font> BirthT = TextBox4.Value & <font color="teal">"-"</font> & TextBox5.Value & <font color="teal">"-"</font> & TextBox6.Value Birth = CVDate(BirthT) Range(<font color="teal">"h7"</font>).Value = Birth <font color="blue">End</font> <font color="blue">Sub</font>
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д