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


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