Не происходит обработка событий для TextBox (VBA)

Узнай цену своей работы

Формулировка задачи:

Excell 2003, форму не создавал, элементы управления непосредственно на листе WorkSheet (в том числе и TextBox).
Требуется ввести дату рождения человека и вычислить его полный возраст. Для исключения операторских ошибок оформил ввод даты в три приёма: день, месяц, год. (да, понятно что никто не запретит ввести 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>

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.333 из 5
Похожие ответы