powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA Enter для textbox срабатывает только один раз
97 сообщений из 97, показаны все 4 страниц
VBA Enter для textbox срабатывает только один раз
    #39237931
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть форма с несколькими textbox. Перемешаюсь по ним клавишей Tab. Нужно, чтобы при появлении фокуса на TextBox3 открывался календарь. Для этого использую событие Enter:
Код: vbnet
1.
2.
3.
Private Sub DatePer1_Enter()
Me.TextBox3 = Format(Get_Date(Me.DatePer1, Now), "MMMM yyyy")    ' выбор даты из календаря
End Sub



Запускаю форму, перемещаюсь по Tab TextBox1, TextBox2, TextBox3. На TextBox3 выскакивает календарь. Всё нормально.
Ставлю курсор на TextBox2, нажимаю снова Tab, курсор переходит на TextBox3, но календарь уже не появляется. Почему Enter срабатывает только 1 раз? Как сделать, чтобы при каждом переходе к TextBox3 появлялся календарь?
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39237932
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DatePer это TextBox3, не поправил в коде
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39237953
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailНужно, чтобы при появлении фокуса на TextBox3 открывался календарь. Для этого использую событие Enter:
А тебе не кажется, что если "при появлении фокуса", то надо использовать TextBox_GotFocus?
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39237981
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaА тебе не кажется, что если "при появлении фокуса", то надо использовать TextBox_GotFocus?

Из справки:
События Enter, Exit
Office 2013 and later

....

Замечания

События Enter и Exit подобны событиям GotFocus (получение фокуса) и LostFocus (потеря фокуса) в Visual Basic. В отличии от событий GotFocus и LostFocus, события Enter и Exit не происходят тогда, когда форма получает или теряет фокус.

+ в VBA у меня нет таких событий в списке выбора события.
+ пробовал в самом коде писать GotFocus в виде TextBox_GotFocus() - не работает
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39237982
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
См. название темы. VBA
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39238070
hclubmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailИз справки:
События Enter, Exit
Office 2013 and later Что за приложение? Какая версия? (в 2003 Word, Excel) эти события присутствуют
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39238078
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailСм. название темы. VBA
Лучше см. название раздела: Visual Basic .
А с VBA надо было идти в раздел Microsoft Office.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39238086
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmail,

выложи тестовый пример - ответ будет гораздо быстрее
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39238242
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
пример
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39238245
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmail,
файл rar не прикрепляется
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39238257
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде файл с примером прикрепился со второй попытки. Извинтиляюсь, что не в ту тему написал, просто увидел, что есть уже такие темы VBA и бла-бла-бла, вот и тоже создал свою в этой ветке.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39238268
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О боже, дикий треш и ужас!
Вы что-нибудь слышали про циклы, про подпрограммы, функции?
Если потребуется обработать сто значений, вы сто раз напишете один и тот же код?

Я не нашел там никакой обработки события Enter.

Уберите все лишнее, сделайте файл, из которого понятно, что именно не получается
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39238287
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Переделал. Прямо вначале кода вариант с Enter, который срабатывает только один раз.
В конце кода вариант с MousUp, который срабатывает каждый раз.

По Вашему замечанию: я бы с удовольствием упростил код, если бы знал как это делать. Спросить не у кого, а сам я только учусь. Этот-то код собирал не одну неделю, чтобы хоть как-то работало.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39238315
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Занимательный прикол.
Если тектбокс не располагать в фрейме, то все нормально.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39238364
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЗанимательный прикол.
Если тектбокс не располагать в фрейме, то все нормально.

Без фрейма работает. Я могу убрать фреймы, но как тогда нарисовать таблицу стандартными средствами, не подключая никаких дополнительных контролов?
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39238367
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал событие повесить на фрейм - работает как надо! Можно ничего не переделывать, просто вешать Enter на фрейм, а не на текстбокс.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39238371
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!!!

Кстати, может подскажете как код упростить? Как он правильно пишется?
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39238389
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailБез фрейма работает. Я могу убрать фреймы, но как тогда нарисовать таблицу стандартными средствами, не подключая никаких дополнительных контролов?Я не понимаю, в чем проблема. Для чего там вообще используются фреймы?ypmailКстати, может подскажете как код упростить? Как он правильно пишется?Первое правило в похожем случае - забыть про копипасту. Любой повторяющийся алгоритм должен быть написан один раз и оформлен в виде процедуры, класса и т.п.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39238595
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЯ не понимаю, в чем проблема. Для чего там вообще используются фреймы?
Чтобы получилась таблица :-)
Shocker.ProПервое правило в похожем случае - забыть про копипасту. Любой повторяющийся алгоритм должен быть написан один раз и оформлен в виде процедуры, класса и т.п.
Я пытался, но ничего не получилось, мне бы примерчик какой-нибудь посмотреть. На примере какого-нибуд куска моего кода, чтобы понять как это делается.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39238604
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailShocker.ProЯ не понимаю, в чем проблема. Для чего там вообще используются фреймы?
Чтобы получилась таблица :-)Ответ непонятен. Что мешает составить ее просто из текстбоксов?
ypmailShocker.ProПервое правило в похожем случае - забыть про копипасту. Любой повторяющийся алгоритм должен быть написан один раз и оформлен в виде процедуры, класса и т.п.
Я пытался, но ничего не получилось, мне бы примерчик какой-нибудь посмотреть. На примере какого-нибуд куска моего кода, чтобы понять как это делается.Учиться нужно по учебникам, а не по примерам. Пример не даст системных знаний.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39238606
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailЯ пытался, но ничего не получилосьНе получилось напечатать не одной буквы? Не получилось включить компьютер? Это не подход. Не получилось что-то конкретное - это и можно спросить. На конкретный вопрос будет конкретный ответ. А на беспредметные вопросы будет ответ - читай учебник. )
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39238785
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proypmailпропущено...

Чтобы получилась таблица :-)Ответ непонятен. Что мешает составить ее просто из текстбоксов?
Точно такую же таблицу из текстбоксов не сделаешь в плане оформления.
Shocker.Proypmailпропущено...
Я пытался, но ничего не получилось, мне бы примерчик какой-нибудь посмотреть. На примере какого-нибуд куска моего кода, чтобы понять как это делается.Учиться нужно по учебникам, а не по примерам. Пример не даст системных знаний.
Другого ответа и не ожидал.По непойми каким языком с кучей непонятных терминов написанным учебникам через пару лет точно научусь, а пока как могу так и делаю, пусть хоть так работает, чем вообще никак.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39238991
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailТочно такую же таблицу из текстбоксов не сделаешь в плане оформления.Вот это мне и непонятно. У текстбокса точно такие же настройки границы, как и у фрейма. Может что-то не понимаю, может на каком-нить Win10 и каком-нить Офисе2017 это выглядит иначе...
На скриншоте две ячейки выполнены с помощью текстбоксов без фреймов. Найдете какие?
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39238999
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailДругого ответа и не ожидал.По непойми каким языком с кучей непонятных терминов написанным учебникам через пару лет точно научусь, а пока как могу так и делаю, пусть хоть так работает, чем вообще никак.Что вам мешает выбрать учебник, написанный понятным языком? Не видел книжного магазина, где не дают ознакомиться с изданием перед покупкой - хоть часами сиди изучай.
Согласитесь, пересказывать учебник в топике форума - глупо.
Хотите, можно курсы организовать, мастер-класс... Но это не бесплатно же. Здесь мы все-таки отвечаем на конкретные вопросы, а не на "научите меня программировать".

И еще. Вы боитесь потратить время на чтение учебника, но я вас уверяю, чем дольше вы будете писать плохой код, тем больше он будет тянуть вас ко дну, и в конечном итоге вы потратите больше времени, чем на то, чтобы изначально разобраться и написать хорошо.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39239105
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По ячейкам: 3 и 5, угадал? Попробую, правда заголовки колонок наверное придется оставить в Label внутри фреймов, иначе придётся как-то делать вывод текста по умолчанию в textbox с форматированием, пока для меня это сложно.

По науке: я и сам понимаю разницу между "подскажи" и "сделай за меня". Я также сторонник компактных кодов, но пока для меня это сложно, разберусь со временем. Я с VBA знаком от силы недели 2-3, и то методом научного втыка. В своём коде пробовал один раз объявлять переменную, а потом присваивать закладкам значения (Dim rng), но код перестал работать. Поэтому я вернулся к копипасту и каждый раз объявлял переменную для вставки каждой закладки. Вот и получилось:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Set rng = bm("NumberFirst1").Range 'присваиваем переменной rng ссылку на закладку "NumberFirst1"
rng.Text = Me.NumberFirst1.Text  'определяем новый текст закладки
bm.Add "NumberFirst1", rng   'заменяем закладку "NumberFirst1"
Set rng = bm("NumberFirst11").Range
rng.Text = Me.NumberFirst1.Text
bm.Add "NumberFirst11", rng

Set rng = bm("NumberFirst2").Range
rng.Text = Me.NumberFirst2.Text
bm.Add "NumberFirst2", rng
Set rng = bm("NumberFirst22").Range
rng.Text = Me.NumberFirst2.Text
bm.Add "NumberFirst22", rng



Как правильно записать, чтобы объявить один раз переменную и потом несколько раз использовать не нашел, поэтому пока оставил так.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39239115
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче темный лес для меня пока Ваши красоты в кодах. Придет время - научусь, все программисты тут тоже не родились такими и не сразу стали писать красивые коды. На детей же не орут, когда они только начинают ходить и у них это плохо получается. Да криво, зато работает, другие среднестатистические и специально не обученные и этого не могут.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39239131
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailПо ячейкам: 3 и 5, угадал?Не угадал, ячейки 1 и 2.
А 3 и 5 - это просто фреймы без текстбоксов (лень их было туда возвращать, а так как у фреймов установлен прозрачный фон, сквозь него просвечивает фон формы, поэтому они чуть чуть другого цвета)
ypmailправда заголовки колонок наверное придется оставить в Label внутри фреймовопять за рыбу деньги. У меток есть все те же самые свойства обрамления, нет никакой необходимости во фреймах, если речь идет только об оформлении
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39239150
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailКак правильно записать, чтобы объявить один раз переменную и потом несколько раз использовать не нашел, поэтому пока оставил так.
Примерно так может выглядеть ваш код в цикле
Код: vbnet
1.
Public Const TableRowCount As Integer = 8

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Dim i As Integer, BmName As String
For i=1 To TableRowCount
  BmName = "NumberFirst"+CStr(i)
  Set rng = bm(BmName).Range
  rng.Text = Me.Controls(BmName).Text
  bm.Add BmName, rng
  Set rng = bm(BmName+CStr(i)).Range
  rng.Text = Me.Controls(BmName).Text
  bm.Add BmName+CStr(i), rng
Next


А вообще, по хорошему, то, что в самом документе несколько раз повторяется одно и то же - тоже не гуд, должно быть один раз и размножаться кодом. А количество повторений должно быть забито глобальной константой ТОЛЬКО в одном месте для всех применений. А то, если потребуется внести косметические изменения в дизайн ярлыка, то придется это делать восемь раз. Но к этому вы уже со временем придете.
ypmailНа детей же не орут, когда они только начинают ходитьПростите, если вы восприняли критику в свой адрес именно так, ни в коем разе не хотел вас обидеть, только простимулировать
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39243819
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

По Вашему способу код не становится короче, т.к. в нём только программно определяются имена полей, всё остальное приходится также по несколько раз прописывать.
От переменной rng избавиться не получается, т.к. она постоянно принимает новые значения, её приходится прописывать для каждого поля. Снова копипаст получается.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39244404
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы предложили фрагмент, я показал как его можно сократить в 8 раз.

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

зачем нужно избавляться от rng - не понял вообще...
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39244529
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Учусь, пыхтю, туплю, извините за глупые вопросы
Тут строка
Код: vbnet
1.
rng.Text = Me.Controls(BmName).Text


повторяется, нельзя её как в математике вынести за скобки? Я имею ввиду, как-то избежать повторов.

Вот тут
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub NumberFirst1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If (KeyAscii < 48 Or KeyAscii > 57) Then KeyAscii = 0
End Sub
Private Sub NumberFirst2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If (KeyAscii < 48 Or KeyAscii > 57) Then KeyAscii = 0
End Sub
Private Sub NumberFirst3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If (KeyAscii < 48 Or KeyAscii > 57) Then KeyAscii = 0
End Sub


мне кажется тоже надо сократить, нашел пример, там какие-то Class Modul используют, прописывают коды в разных местах и в class modul и в коде формы и просто в Modul1. пока пытаюсь разобраться в этом темном лесу и применить к своему примеру.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39244547
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У них в примере работает, а у меня выдаёт ошибку на
Код: vbnet
1.
Public aoTxtBxes(1 To 4) As New clsmTxtBxes


Пробовал эту строчку в своем Module1 - не работает
в отдельном модуле - не работает
вообще удалил - начинает ругаться на кусок в UserForm1
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Private Sub UserForm_Initialize()
    Dim i As Integer
    'Присваиваем последовательно значениям массива значения объектов
    For i = 1 To 8
        Set aoTxtBxes(i).oTxtBx = Me.Controls("NumberFirst" & i)
    Next i
End Sub


Ну естесственно, ведь aoTxtBxes не объявлена нигде, если эту строчку вообще удаляю.
И как у них в примере ругается и без
Код: vbnet
1.
Public aoTxtBxes(1 To 4) As New clsmTxtBxes

дальше код не работает.
На кусок в Class1 пока не ругается, т.к. первую строчку еще не поборол
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Option Explicit
Public WithEvents oTxtBx As MSForms.TextBox    'создаем элемент с отслеживанием его событий
'за назначение с отслеживанием событий отвечает оператор WithEvents
'(может применяться только в модулях классов)

Private Sub oTxtBx_Change()
    MsgBox "Вы изменили значение " & oTxtBx.Name, vbInformation, "Информациооное окно"
End Sub
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39244567
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде начал разбираться с модуль классами. Помимо этой строчки надо было прописать Sub Show_Form().
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39244577
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В результате использования модуль класса код сократился до
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
 Private Sub UserForm_Initialize()
    Dim i As Integer
    'Присваиваем последовательно значениям массива значения объектов
    For i = 1 To 8
        Set aoTxtBxes(i).oTxtBx = Me.Controls("NumberFirst" & i)
        Set aoTxtBxes(i).oTxtBx = Me.Controls("NumberLast" & i)
    Next i
End Sub



Спасибо за замечание по поводу громоздкости кода и подсказки! Буду дальше что-нибудь упрощать.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39244610
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не работает из-за этих First и Last. Я в сообщении выше просто второй строкой прописал для Last, но так не работает.
Пробовал так:
Код: vbnet
1.
Set aoTxtBxes(i).oTxtBx = Me.Controls("Number" & ("First" OR "Last") & i)


Как быть с разными именами текстбоксов?
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39244690
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmail
Код: vbnet
1.
rng.Text = Me.Controls(BmName).Text



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

ypmail
Код: vbnet
1.
2.
3.
Private Sub NumberFirst3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If (KeyAscii < 48 Or KeyAscii > 57) Then KeyAscii = 0
End Sub



мне кажется тоже надо сократить,это достаточно бессмысленный код, он не дает нажать в текстбоксе нецифровые кнопки, но никак не защищает от вставки из буфера, перетаскивания текста и т.п.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39244695
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmail
Код: vbnet
1.
Set aoTxtBxes(i).oTxtBx = Me.Controls("Number" & ("First" OR "Last") & i)



Как быть с разными именами текстбоксов?никак, либо делать сквозную нумерацию текстбоксов, либо вернуться к своему предыдущему варианту. Переупрощать, конечно не надо тоже. Однако тут тоже есть косяк:
Код: vbnet
1.
2.
3.
4.
    For i = 1 To 8
        Set aoTxtBxes(i).oTxtBx = Me.Controls("NumberFirst" & i)
        Set aoTxtBxes(i).oTxtBx = Me.Controls("NumberLast" & i)
    Next i

У вас вторая строка нивелирует действие первой. То есть вы назначили aoTxtBxes(i).oTxtBx одно значение, а потом сразу затерли его другим значением. Так что работать у вас будут только Last-ы. Раз у вас 16 текстбоксов то..... НЕТ вспомните, я говорил, что лучше, чтобы число 8 было объявлено в ОДНОМ месте в виде константы и нигде более не использовалось в виде числа. Так что у вас N строк в таблице и N*2 текстбоксов, следовательно и массив должен быть не 1 To N, а 1 To N*2
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39244879
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proypmail
Код: vbnet
1.
2.
3.
Private Sub NumberFirst3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If (KeyAscii < 48 Or KeyAscii > 57) Then KeyAscii = 0
End Sub



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

Как на счёт такого варианта?:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    Private Sub NumberFirst1_Change()
        intPos = NumberFirst1.SelStart
        strTmp = ""
        For i = 1 To Len(NumberFirst1.Text)
            ch = Mid(NumberFirst1.Text, i, 1)
            If (ch >= "0" And ch <= "9") Then
                strTmp = strTmp & ch
            Else
                intPos = intPos - 1
            End If
        Next
        NumberFirst1.Text = strTmp
        If intPos > 0 Then
            NumberFirst1.SelStart = intPos
        End If
    End Sub


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

Очень уж не хочется сквозную нумерацию вместо NumberFirst1 (Last и т.д.), сложнее будет в коде ориентироваться (по крайней мере мне), но раз других путей нет...
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39244881
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailВроде не позволяет вводить ничего кроме цифр и вставка из буфера не работает.так лучше
ypmailОчень уж не хочется сквозную нумерацию вместо NumberFirst1 (Last и т.д.), сложнее будет в коде ориентироваться (по крайней мере мне), но раз других путей нет...почему нет? Я бы как раз оставил First и Last - код будет нагляднее, что тоже важно.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39244898
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЯ бы как раз оставил First и Last - код будет нагляднее, что тоже важно.
Тогда у меня опять копипаст получается. Этот кусок кода надо копировать для всех First, потом для всех Last. Опять ничего не получается с компактностью.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39244915
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, я же писал выше
Shocker.Pro
Код: vbnet
1.
2.
3.
4.
    For i = 1 To 8
        Set aoTxtBxes(i).oTxtBx = Me.Controls("NumberFirst" & i)
        Set aoTxtBxes(i).oTxtBx = Me.Controls("NumberLast" & i)
    Next i

Это вполне нормальный подход, только ошибка в том, что массив должен состоять из 16 элементов, а не из 8 и заполняться соответственно
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39244916
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В классе этот кусок вообще не хочет работать (даже i на j поменял)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Option Explicit
Public WithEvents oTxtBx As MSForms.TextBox
 
Private Sub oTxtBx__Change()
        intPos = oTxtBx.SelStart
        strTmp = ""
        For j = 1 To Len(oTxtBx.Text)
            ch = Mid(oTxtBx.Text, j, 1)
            If (ch >= "0" And ch <= "9") Then
                strTmp = strTmp & ch
            Else
                intPos = intPos - 1
            End If
        Next
        oTxtBx.Text = strTmp
        If intPos > 0 Then
            oTxtBx.SelStart = intPos
        End If
    End Sub



Думал это загоню в модуль класс и этот код будет проверяться на каждом textbox. Не тут-то было. На форме с конкретным именем текстбокса работает, а в модуль классе нет.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39244917
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProНет, я же писал выше
Shocker.Pro
Код: vbnet
1.
2.
3.
4.
    For i = 1 To 8
        Set aoTxtBxes(i).oTxtBx = Me.Controls("NumberFirst" & i)
        Set aoTxtBxes(i).oTxtBx = Me.Controls("NumberLast" & i)
    Next i

Это вполне нормальный подход, только ошибка в том, что массив должен состоять из 16 элементов, а не из 8 и заполняться соответственно

Я пробовал везде 8 на 16 менять - не помогло.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39244918
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailЭтот кусок кода надо копировать для всех First, потом для всех Last.кроме того, это тоже решается просто:
Код: vbnet
1.
2.
3.
'основной код
MySomeProcedure "First"
MySomeProcedure "Last"

Код: vbnet
1.
2.
3.
4.
5.
6.
'процедура для выполнения однотипных действий
Sub MySomeProcedure(FieldName As String)

'однотипные действия над полем FieldName

End Sub
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39244920
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailЯ пробовал везде 8 на 16 менять - не помогло.потому что надо не тупо что-то делать, а думать над тем, что делаешь, что хочешь сделать. Я даю направление для размышлений, а не пишу код за вас. Покажите код, который "не помогло."
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39244924
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В UserForm1:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Private Sub UserForm_Initialize()
    Dim i As Integer
    For i = 1 To 16
        Set aoTxtBxes(i).oTxtBx = Me.Controls("NumberFirst" & i)
        Set aoTxtBxes(i).oTxtBx = Me.Controls("NumberLast" & i)
    Next i
End Sub



В Modul1:
Код: vbnet
1.
2.
3.
4.
Public aoTxtBxes(1 To 16) As New clsmTxtBxesFirstLast
Sub Show_Form()
    UserForm1.Show
End Sub



В Class Modules:
Код: vbnet
1.
2.
3.
4.
5.
6.
Option Explicit
Public WithEvents oTxtBx As MSForms.TextBox
 
Private Sub oTxtBx_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If (KeyAscii < 48 Or KeyAscii > 57) Then KeyAscii = 0
End Sub
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39244934
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmail
Код: vbnet
1.
2.
3.
4.
    For i = 1 To 16
        Set aoTxtBxes(i).oTxtBx = Me.Controls("NumberFirst" & i)
        Set aoTxtBxes(i).oTxtBx = Me.Controls("NumberLast" & i)
    Next i

У вас есть текстбокс с именем NumberFirst16?
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39244943
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот к чему были эти N, N*2?
Мозг уже не воспринимает ничего, надо пока забросить это дело, а то психушка по мне заплачет...
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39244947
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailВот к чему были эти N, N*2?ну пусть для начала будет 8 и 16, потом переделаете на N и N*2 (раз сразу не можете абстрагироваться, хотя это чистая алгебра за 6й класс)

У вас 8 одних текстбоксов и 8 других. Всего 16. Массив должен состоять из 16 элементов. Но заполнять-то его надо как 8+8, а не как 16+16

Я не хочу править ваш код, хочу, чтобы сами сообразили, это намного полезнее на будущее.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39244992
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В модуле оставил 1 To 16
В форме извратился уже до такого:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
 Private Sub UserForm_Initialize()
    Dim i As Integer, j As Integer
    For i = 1 To 8
        Set aoTxtBxes(i).oTxtBx = Me.Controls("NumberFirst" & i)
    Next i
    For j = 1 To 8
        Set aoTxtBxes(j).oTxtBx = Me.Controls("NumberLast" & j)
    Next j
End Sub



Снова как Вы писали "нивелирует" действие первого выражения. Левая часть до знака равенства с i и с j - отличается, правая тоже, не должно одно выражение нивелировать второе, но увы... 8 текстбоксов First, 8 Last, разные переменные i и j, почему не работает? Нигде даже нет примеров. Все самомучители показывают только простейшие примеры, нигде нет примеров синтаксиса когда надо прописать разные варианты как в моем случае. На SQL написал Where Field = '123' OR Field = '456' OR и т.д. и всё понятно, а тут какой-то тупой язык (или я :-))
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39245024
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailНа SQL написал ... и всё понятно ... а тут какой-то тупой язык (или я :-))Вы заполняете массив одними значениями. Потом тот же массив другими значениями.
Хорошо, вот вам пример на SQL
Код: sql
1.
2.
3.
4.
CREATE TABLE A (B int, C int)
INSERT A VALUES (0, 0)
UPDATE A SET B=5, C=6
UPDATE A SET B=7, C=8


У вас в таблице теперь хранятся все четыре числа 5,6,7,8? Или только 7,8 и язык SQL такой же тупой?
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39245050
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял, что у меня учитываются только 8 текстбоксов из 16, т.к. i принимает значения от 1 до 8. Нужно для левой части другую переменную, которая бы принимала значения от 1 до 16, а в правой части оставить i, снова проблема как это прописать?
Пока родил это:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
 Private Sub UserForm_Initialize()
    Dim i As Integer, j As Integer, n As Integer
For n = 1 To 16
    For i = 1 To 8
        Set aoTxtBxes(n).oTxtBx = Me.Controls("NumberFirst" & i)
        Set aoTxtBxes(n).oTxtBx = Me.Controls("NumberLast" & i)
    Next i
    Next n
End Sub


Дальше буду думать как это заставить работать.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39245091
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
For n = 1 To 16
    For i = 1 To 8

Это называется вложенный цикл. Выполнится он 8*16=128 раз. Зачем?

Но главный косяк у вас все там же. Вы пишете два подряд оператора:
Код: vbnet
1.
2.
        Set aoTxtBxes(n).oTxtBx = Me.Controls("NumberFirst" & i)
        Set aoTxtBxes(n).oTxtBx = Me.Controls("NumberLast" & i)

и прямую аналогию с
Код: sql
1.
2.
UPDATE A SET B=5, C=6
UPDATE A SET B=7, C=8

никак не хотите видеть
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39245099
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailНужно для левой части другую переменную, которая бы принимала значения от 1 до 16Я уже писал выше - переменная все та же - массив aoTxtBxes, только не 1 To 8, а 1 To 16

Вы сначала подумайте, как вы собираетесь располагать в этом массиве свои текстбоксы. Разумных вариантов ровно два:
NumberFirst1
NumberFirst2
...
NumberFirst8
NumberLast1
NumberLast2
...
NumberLast8

или

NumberFirst1
NumberLast1
NumberFirst2
NumberLast2
...
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39246290
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProypmailНужно для левой части другую переменную, которая бы принимала значения от 1 до 16Я уже писал выше - переменная все та же - массив aoTxtBxes, только не 1 To 8, а 1 To 16

Вы сначала подумайте, как вы собираетесь располагать в этом массиве свои текстбоксы. Разумных вариантов ровно два:
NumberFirst1
NumberFirst2
...
NumberFirst8
NumberLast1
NumberLast2
...
NumberLast8

или

NumberFirst1
NumberLast1
NumberFirst2
NumberLast2
...

массив у меня 1 To 16
Располагать планирую как
NumberFirst1
NumberLast1
NumberFirst2
NumberLast2

UPDATE A SET B=5, C=6
UPDATE A SET B=7, C=8

В моём случае тоже надо использовать Update?
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39246300
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailВ моём случае тоже надо использовать Update?Нет, вы же сами писали что мол в SQL все просто, в VB все сложно. Поэтому я вам привел пример на языке SQL, чтобы было понятно. В данном случае используется операция присваивания "=".
ypmailРасполагать планирую как
NumberFirst1
NumberLast1
NumberFirst2
NumberLast2ок, вот, собственно, есть код:
Код: vbnet
1.
2.
3.
4.
    For i = 1 To 8
        Set aoTxtBxes(i).oTxtBx = Me.Controls("NumberFirst" & i)
        Set aoTxtBxes(i).oTxtBx = Me.Controls("NumberLast" & i)
    Next i

Включаем знание школьной математики и думаем, какую формулу нужно применить к i в выделенных местах, чтобы получить нужные значения, а именно 1 и 2 при первом проходе цикла, 3 и 4 на втором и т.д. до 16.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39249108
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2i-1 и 2i

Если у меня в Class Modules KeyPress, то работает
Код: vbnet
1.
2.
3.
Private Sub oTxtBx_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If (KeyAscii < 48 Or KeyAscii > 57) Then KeyAscii = 0
End Sub



Пробую вместо этого использовать в Class Modules указанный выше вариант - не работает (выдаёт ошибку и выделяет IntPos)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private Sub oTxtBx_Change()
        intPos = oTxtBx.SelStart
        strTmp = ""
        For n = 1 To Len(oTxtBx.Text)
            ch = Mid(oTxtBx.Text, n, 1)
            If (ch >= "0" And ch <= "9") Then
                strTmp = strTmp & ch
            Else
                intPos = intPos - 1
            End If
        Next
        oTxtBx.Text = strTmp
        If intPos > 0 Then
            oTxtBx.SelStart = intPos
        End If
    End Sub



В коде формы кусок был рабочим, правда у меня тогда везде вместо oTxtBx было NumberFirst1. Раз я использую в классе для всех текстбоксов, то заменил на oTxtBx. IntPos как я понял определяет позицию курсора, почему в классе не хочет работать?
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39249267
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailвыдаёт ошибкутекст ошибки сообщите или требуется угадывать?
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39249505
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

variable is not defined

Когда указываю конкретное имя текстбокса NumberFirst1 все работает (но это только в коде формы), а когда вместо конкретного имени использую oTxtBx да ещё пытаюсь этот кусок кода использовать в классе, то тут облом.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39249509
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покажите полный код класса
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39250339
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
В сообщении выше писал что было и чем заменил в класссе

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private Sub oTxtBx_Change()
        intPos = oTxtBx.SelStart
        strTmp = ""
        For n = 1 To Len(oTxtBx.Text)
            ch = Mid(oTxtBx.Text, n, 1)
            If (ch >= "0" And ch <= "9") Then
                strTmp = strTmp & ch
            Else
                intPos = intPos - 1
            End If
        Next
        oTxtBx.Text = strTmp
        If intPos > 0 Then
            oTxtBx.SelStart = intPos
        End If
    End Sub
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39250349
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если variable is not defined значит variable is not defined
Не хотите показать полный текст класса - ищите ошибку сами
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39251174
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Option Explicit
Public WithEvents oTxtBx As MSForms.TextBox
 
Private Sub oTxtBx_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If (KeyAscii < 48 Or KeyAscii > 57) Then KeyAscii = 0
End Sub

'    Private Sub oTxtBx_Change()
'        intPos = oTxtBx.SelStart
'        strTmp = ""
'        For n = 1 To Len(oTxtBx.Text)
'            ch = Mid(oTxtBx.Text, n, 1)
'            If (ch >= "0" And ch <= "9") Then
'                strTmp = strTmp & ch
'            Else
'                intPos = intPos - 1
'            End If
'        Next
'        oTxtBx.Text = strTmp
'        If intPos > 0 Then
'            oTxtBx.SelStart = intPos
'        End If
'    End Sub



Через KeyPress работает. Удаляю кусок кода с KeyPress и вместо него оставляю, тот, что ниже (убираю везде ') - не работает.
Файл прилагаю.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39251196
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так правильно, вы ж первой строкой требуете обязательного объявления всех переменных (и это правильно), но не объявляете их, о чем вам и сообщает компилятор.

Освоить Ctrl+C-Ctrl+V мало, надо ж разобраться, как работает скопипастченный код.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39251221
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Спасибо за помощь!
Где ещё мне упростить код?
Наверное с помощью классов нужно избавиться от копипаста тут?:
Код: vbnet
1.
Private Sub DatePer1_Enter()
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39251239
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailСпасибо за помощь!Пожалуйста, но только расстраивает, что похерив рекомендацию потратить пару недель на учебник вы будете тратить месяцы на скачки по граблям и биться головой об стену.


ypmailГде ещё мне упростить код?Получить название месяца из числа:
Код: vbnet
1.
Format$(1, "mmmm")

- соответственно, заполнение комбобокса сделать в цикле.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39251262
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так а, собственно, как в UserForm1.Ok _Click как все было так и осталось, ничего не упоростили
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39251269
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Что толку с учебника, если в нём нет моего примера, пока я там изучаю всё подряд, не имеющее отношение к моей задаче, меня с работы уволят.
Я не программист, а ИТР, хотел немного автоматизировать свою работу. Сам вынужден этим заниматься, т.к. айтишникам платят только за обслуживание потребностей высшего руководства, но никак не узких специалистов. Если я вместо основной работы целыми днями буду изучать программирование, то точно уволят.
Дома зимой учиться ещё куда ни шло, а летом - слишком много дел, ещё и жена бросит пока книжки читаю вместо домашних дел :-)

Я рад бы всему научиться, да слишком уж цена высока для такой науки. Пусть лучше все будет как есть, работает и ладно. А то жизнь-то одна, просижу в учебниках и окажусь на мусорке с бомжами.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39251271
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProТак а, собственно, как в UserForm1.Ok _Click как все было так и осталось, ничего не упоростили

Сложно пока для понимания, да и основной работы хватает. Пожалуй пока заброшу до лучших времен.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39251274
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут надо было или специально на программиста идти учиться в свое время и сделать это основной профессией или сидеть на пенсии и от скуки самообразовываться, а так голопом по европам всего не схватишь.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39251690
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И всё же я уже подсел на это дело, не могу без Вашего Простоквашино )))
Появилась свободная минутка, и снова так и подмывает доработать код.
Немного поправил код на UserForm - стало гораздо компактнее и красивее.
Воткнулся с текстбоксами дат, хотел событие Enter тоже разместить в классе, т.к. оно одинаковое для 8 текстбоксов, но почему-то оно не работает.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39251870
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailНемного поправил код на UserForm - стало гораздо компактнее и красивее.вторым шагом - почему бы три цикла не объединить теперь в один?


Код: vbnet
1.
2.
Public aoTxtBxes(1 To 24) As New clsmTxtBxesFirstLast
Public aoTxtBxDat(1 To 24) As New clsmTxtBxDat

с циклами вы так и не разобрались до конца. Зачем вам оба массива по 24 элемента, если в одном хранится 16 элементов, а в другом - 8?


Что касается Change - действительно не хочет это событие перехватываться классом. У меня крайне мало опыта работы с контролами и формами MSForms, подозреваю, что как-то связано с тем, что если Change - это "родное" событие текстбокса, то работу Enter (то есть навигацию по контролам) обеспечивает сама форма и где-то тут у них недоработочка.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39251890
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProypmailНемного поправил код на UserForm - стало гораздо компактнее и красивее.вторым шагом - почему бы три цикла не объединить теперь в один?Имеете ввиду в Private Sub Ok_Click()?

Код: vbnet
1.
2.
Public aoTxtBxes(1 To 24) As New clsmTxtBxesFirstLast
Public aoTxtBxDat(1 To 24) As New clsmTxtBxDat

с циклами вы так и не разобрались до конца. Зачем вам оба массива по 24 элемента, если в одном хранится 16 элементов, а в другом - 8?
Ну почему же, изначально я как раз так и пробовал. Не получилось, событие Enter не работает, потом уже начал извращаться над кодом, приведя его к 1 To 24. Изначально код был такой:
Код: vbnet
1.
2.
Public aoTxtBxes(1 To 16) As New clsmTxtBxesFirstLast
Public aoTxtBxDat(1 To 8) As New clsmTxtBxDat

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
 Private Sub UserForm_Initialize()
    Dim i As Integer
    'Присваиваем последовательно значениям массива значения объектов
    For i = 1 To 8
        Set aoTxtBxes(2 * i - 1).oTxtBx = Me.Controls("NumberFirst" & i)
        Set aoTxtBxes(2 * i).oTxtBx = Me.Controls("NumberLast" & i)
        Set aoTxtBxDat(i).oTxtBxDat = Me.Controls("Date" & i)
    Next i
End Sub



Что касается Change - действительно не хочет это событие перехватываться классом. У меня крайне мало опыта работы с контролами и формами MSForms, подозреваю, что как-то связано с тем, что если Change - это "родное" событие текстбокса, то работу Enter (то есть навигацию по контролам) обеспечивает сама форма и где-то тут у них недоработочка.Заменил Enter на Change - работает (если поле не заблокировано, у меня первое разблокировано), с Enter ни в какую. Оставить как было (для каждого поля отдельно прописывать событие Enter)? Или есть ещё какие-то варианты?
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39251907
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailЗаменил Enter на Change - работаетда, я тоже это для начала попробовал. Ну чтобы не лезть уже в какую-то экзотику, можно оставить обработчики событий на форме, но содержимое я бы все-таки вынес в отдельную процедуру, хоть это и одна строка (сегодня одна, завтра десять), а в самих обработчиках прописать вызов этой процедуры.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39251908
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailИмеете ввиду в Private Sub Ok_Click()?да
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39251909
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Class Modules Enter/Exit не существует...
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39252000
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProypmailЗаменил Enter на Change - работаетда, я тоже это для начала попробовал. Ну чтобы не лезть уже в какую-то экзотику, можно оставить обработчики событий на форме, но содержимое я бы все-таки вынес в отдельную процедуру, хоть это и одна строка (сегодня одна, завтра десять), а в самих обработчиках прописать вызов этой процедуры.

Делаю процедуру в Module1:
Код: vbnet
1.
2.
3.
4.
Sub OpenCalendar()
For i = 1 To 8
Me.Date(i) = Format(Get_Date(Me.Date(i), Now), "MMMM yyyy")
End Sub



В событиях Enter на форме будет вызов этой процедуры, всего одно слово OpenCalendar
С самой процедурой что-то не то. Не пойму, как программа поймет какое значение i для того или иного текстбокса использовать? С процедурами и функциями в примитивных примерах более менее понятно, но тут 8 текстбоксов и для всех надо задать одну процедуру, по-моему нереально.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39252006
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем там цикл? Она должна делать один конкретный вызов. То есть в процедуре так и будет только одна строка. А с каким именно текстбоксом работать - передается через параметр процедуры. Можно передавать его индекс, а можно передавать сам текстбокс.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39252092
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Одной строчкой можно только показать форму Form_SelectDate.Show для всех текстбоксов, в которых я пропишу вызов функции при событии Enter. Тут же происходит формат данных, полученных функцией для конкретного текстбокса (8 шт.), да ещё в ходе срабатывания функции Get_Date происходит показ формы Form_SelectDate.Show.
Код: vbnet
1.
Me.Date1 = Format(Get_Date(Me.Date1, Now), "MMMM yyyy")


Просто форму показать, нажатие клавиши отследить и т.д. - это работает. Тут же конкретная привязка к текстбоксам Date1, Date2, Date3 и т.д. до Date8, чем универсальным их можно заменить?
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39252138
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что у вас меняется в этой строчке для каждого обработчика? Только сам текстбокс. Вот его и сделайте параметром процедуры.

Либо, как вариант Me.Controls("Date"+CStr(i)) и сделать i параметром процедуры.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39252344
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

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


Это всё, что в самоучителях пишут про параметры. Как я понял из справки в форме указываем функцию с параметром i=1:
Код: vbnet
1.
2.
3.
Private Sub Date1_Enter()
Call OpCal(i = 1)
End Sub


Процедура в Module1:
Код: vbnet
1.
2.
3.
Private Sub OpCal()
Me.Controls("Date" + CStr(i)) = Format(Get_Date(Me.Controls("Date" + CStr(i)), Now), "MMMM yyyy")
End Sub


---------------------------
Microsoft Visual Basic for Applications
---------------------------
Compile error:

Sub or Function not defined
---------------------------
ОК Справка
---------------------------

Я процедуру неправильно указываю в Date_Enter или саму процедуру OpCal неправильно записал?
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39252348
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailЭто всё, что в самоучителях пишут про параметры.Да неужели!
http://computers.plib.ru/programming/Books.VBasic6/Chapter 5/ch40.htm
http://computers.plib.ru/programming/Books.VBasic6/Chapter 5/ch39.htm
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39252358
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему-то у меня даже в списке нет этой процедуры.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39252360
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня еще путаница возникла, параметр и аргумент это одно и то же? И то и то в скобках пишут после названия процедуры, в чём разница?
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39252365
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема с отсутствием процедуры в списке была из-за Privat
Дальше, как я и предполагал, тело процедуры криво записано, а как правильно не понимаю.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39252392
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailпараметр и аргумент это одно и то же?да.
По большому счету аргумент - это со стороны вызова (по аналогии с аналогичным математическим понятием), а параметр это то же самое со стороны самой процедуры.

ypmailПроблема с отсутствием процедуры в списке была из-за Privatвот я о чем и говорю, вместо того, чтобы прочитать про какие-то основы, будем биться головой об стену.


Про Me то же самое - это основы. Me в VB - это ссылка на текущий класс или форму (которая, собственно, тоже является классом). В модуле никакого Me нет, потому что это не форма.
Соответственно, либо надо использовать процедуру там, где есть Me, либо заменить Me на UserForm1 (чтобы ссылаться на форму) - это плохой вариант, либо вместо передачи индекса i передавать сам объект текстбокса, тогда ссылка на форму не понадобится в принципе.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39268845
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProПро Me то же самое - это основы. Me в VB - это ссылка на текущий класс или форму (которая, собственно, тоже является классом). В модуле никакого Me нет, потому что это не форма.
Соответственно, либо надо использовать процедуру там, где есть Me, либо заменить Me на UserForm1 (чтобы ссылаться на форму) - это плохой вариант, либо вместо передачи индекса i передавать сам объект текстбокса, тогда ссылка на форму не понадобится в принципе.

Удалил я везде Me - ошибка. Если 8 раз прописать в модуле
Me.Date1 = Format(Get_Date(Me.Date1, Now), "MMMM yyyy")
Me.Date2 = Format(Get_Date(Me.Date2, Now), "MMMM yyyy")
и т.д. до Date8, чтобы передавать сам объект текстбокса, то тоже ничего не работает.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39268852
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
покажите, что получилось - в модуле и на форме
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39278348
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39278368
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот ещё вариант. Никак не могу понять как передавать сам объект текстбокса...
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39278467
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailНикак не могу понять как передавать сам объект текстбокса...Я так и не увидел в приложенных файлах попыток что-то передать. Текстбокс передается точно так же, как и Integer в примере у вас выше.

Процедура
Код: vbnet
1.
2.
3.
4.
5.
Sub MyProcedure(MSForms.TextBox MyTextbox)

MyTextbox.Text = "bla-bla"

End Sub

Вызов
Код: vbnet
1.
MyProcedure Date5
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39278719
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не пойму, что ему надо? Скобки все на месте. Может это не в модуле надо делать?
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39278725
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виноват, на синтаксис Си сбился.
Но ведь голова для того, чтобы думать, а не просто копипастить (впрочем, я это, кажется, уже говорил)

Код: vbnet
1.
Sub MyProcedure(MyTextbox As MSForms.TextBox)
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39278736
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот я и думал весь день, да видать думалка у меня не под то заточена, но есть надо, от которого никуда не деться )
В модуле прописал:
Код: vbnet
1.
2.
3.
Sub MyProcedure(MyTextbox As MSForms.TextBox)
MyTextbox = Format(Get_Date(MyTextbox, Now), "MMMM yyyy")
End Sub

Работает! Надеюсь правильно записал?
Вериницу энтеров для каждого поля так и придётся оставлять или есть варианты упрощения?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub Date1_Enter()
MyProcedure Date1
End Sub

Sub Date2_Enter()
MyProcedure Date2
End Sub

Sub Date3_Enter()
MyProcedure Date3
End Sub
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39278804
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailВериницу энтеров для каждого поля так и придётся оставлять?К сожалению, как мы выяснили ранее, это событие перехватываться нормально не хочет, и это не проблема программирования, а проблема где-то внутри самих объектов.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39278807
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ypmailНадеюсь правильно записал?Надеюсь, вы дадите вменяемое название процедуре все-таки. Это правило хорошего тона в программировании сильно облегчит жизнь со временем.
...
Рейтинг: 0 / 0
VBA Enter для textbox срабатывает только один раз
    #39280457
ypmail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProНадеюсь, вы дадите вменяемое название процедуре все-таки. Это правило хорошего тона в программировании сильно облегчит жизнь со временем.
Это я сразу сделал после написания сообщения. Тоже не люблю всякие MyProcedure. Спасибо большое за помощь. Как будет время, буду копать календарик, чтобы месяцы и годы как-то поудобнее перелистывать.
...
Рейтинг: 0 / 0
97 сообщений из 97, показаны все 4 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA Enter для textbox срабатывает только один раз
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]