powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA Enter для textbox срабатывает только один раз
25 сообщений из 97, страница 3 из 4
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
25 сообщений из 97, страница 3 из 4
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA Enter для textbox срабатывает только один раз
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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