Страницы: 1
RSS
Вернуть курсор в TextBox на VBA
 
Добрый день, друзья!
Есть вот такая разработка (прикрепил файл).
Вопрос следующий: На UserForm есть 2 TextBox и 1 ListBox.
TextBox-ы это поля ввода состоящего из 2-х частей номера, вида 000 \ 000. Если вторая часть введена неправильно, нужно, выдать сообщение пользователю и пригласить его (мигающим курсором) к повторному вводу варианта. Попробовал сделать так:
Код
            MsgBox "Диапазон допустимых значений: целое число от 1 до 12", vbCritical + vbOKOnly, "Значение вне диапазона:"
            znac = " "
            With Me
                With .tbx_NomDetalB
                    .Text = znac
                    
                    .SelStart = 1
                    .SetFocus
                    
                    ht = .Top + .Height + 35
                    wt = .Left + .Width + 15
                End With
                .Height = ht
                .Width = wt
            End With
                
            Exit Sub
, но, .SetFocus - не работает.
Есть идеи?
Всем откликнувшимся - спасибо!
 
Не то событие выбрали - зачем выгружать форму при ошибке?
См. вариант (проверяется первый ТекстБокс)
P.S. Показывайте пример (ПРИМЕР), а не свой рабочий файл.
 
Большое спасибо! Сейчас посмотрю. Это и есть ПРИМЕР. Пришлось его таким сделать.
Посмотрел. На мой взгляд, это не совсем то. Попробую объяснить на слайдах. Понимаю, что никто не станет разбираться в моем коде ... Увы.
Изменено: Григорий Калюга - 28.11.2022 20:28:13
 
Цитата
Григорий Калюга написал: Это и есть ПРИМЕР. Пришлось его таким сделать.
А как же я умудрился создать пример без ЛистБокса, без изменения размера формы? ))
 
вот тут на 0:00:17, хотелось бы чтобы приглашающе мигал курсор во 2 текстбоксе.
 
Цитата
Юрий М написал:
без ЛистБокса
в этом ЛистБоксе, полагаю, все и дело. Он по TabIndex = 3, вот туда и убегает фокус ... Это я так предположил. Может не прав?
 
Ура! Ответ с тонкой подсказки Юрия, найден!
Вот сюда:
Код
Private Sub tbx_NomDetalB_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    Dim znac As String
    znac = "": znac = Me.tbx_NomDetalB.Text

    Cancel = True
    
    If IsNumeric(znac) = False Then
ставим Cancel = True и все заработало!
Спасибо!
 
У Вас задача при закрытии формы крестиком выполнить проверку значений в ТекстБокс и в случае ошибки вывести сообщение, после чего передать фокус на ТекстБокс с ошибочным значением. Причём тут ЛистБокс?
 
Цитата
Юрий М написал:
У Вас задача при закрытии формы крестиком
при всем уважении - нет. Сейчас все заработало как надо. И хотя Вы с логикой не угадали, я вроде именно для ее объяснения все: и слайды, и видио, да и сам тестовый пример выложил, но, Вы совершенно правы - в чужом коде, да еще такого дилетанта, как я - разобраться; задача нетривиальная. Тем не менее, именно Ваше участие мне ее помогло решить. Так, что - от души спасибо! Ведь иногда, заметил неоднократно, нужен не конкретный код, а просто соучастие!
 
Доброго утра, друзья!
Подумал, что тема не будет завершена и понятна для ищущих и читающих, поэтому выкладываю работающий по заданной бизнес-логике файл. Может кому пригодится.
П.С.: Если у кого есть предложения по более короткой реализации процесса? - Милости прошу, предоставить Ваши варианты. Буду признателен.
П.С.2: Вторая, открывающаяся форма - это всего лишь заготовка. У проекта будет продолжение. Но, это ведь уже другая история ...
 
Григорий, добрый день.
Если задача уведомлять пользователя, что он ввёл не те данные, то можно это делать по событию Change, добавьте в usf_PointA код и если пользователь будет вводить буквы или цифры, то в статус баре в левом нижнем углу будет комментарий, что не так (это не так навязчиво как MsgBox) и само поле закрасится в красный, или можно вместо заливки поменять только цвет текста на красный.
Это не отменяет итоговой проверки при нажатии на крестик или некую кнопку Ок/Записать но для пользователя немного нагляднее, т.к. реакция происходит в момент ввода данных и курсор он ещё не успел куда-то переключить.
Код
Private Sub tbx_NomDetalA_Change()
    If IsNumeric(tbx_NomDetalA.Value) = False Or tbx_NomDetalA.Value < 1 And tbx_NomDetalA.Value > 12 Then
        Application.StatusBar = "Диапазон допустимых значений: целое число от 1 до 12"
        tbx_NomDetalA.BackColor = vbRed
    Else
        tbx_NomDetalA.BackColor = vbWhite
    End If
End Sub
 
Цитата
Wofchik написал:
то можно это делать по событию
Доброго дня! Очень интересное решение! Спасибо, утащил в норку ...
 
Я в подобных ситуациях  не только передаю фокус на нужный контрол, но и подкрашиваю красным или фон или шрифт.
Файл не смотрел - может там это уже реализовано )
 
Цитата
Юрий М написал:
может там это уже реализовано
да, сделал вот так.
Страницы: 1
Наверх