Страницы: 1
RSS
Не срабатывает условие фильтрации символов при TextBox_KeyPress
 
Добрый день. Делаю форму ручного ввода номера столбца юзером. Хочу сделать фильтрацию по вводимым значениям - либо номер столбца, либо его буквенное обозначение. Однако, при использовании формы он допускает ввод буквы и цифры (например a1) а потом и вовсе игнорирует длину текста. Полагаю, что игнорируется условие
Код
If (KeyAscii >= 65 And KeyAscii <= 90) Or (KeyAscii >= 97 And KeyAscii <= 122) And Len(TextBox.Text) <= 3 Then
Однако, при ручной отладке это условие срабатывает и цифры не допускаются, а при обычной работе макроса - игнор. Заранее благодарю за помощь.
 
Конкретизируйте, пожалуйста, вводимые данные и желаемый результат
Если вы хотите просто провести проверку и после неё обозначить столбец через вводимую букву и/или цифру, то Вы очень сильно намудрили
Изменено: ProFessor - 16.04.2018 12:03:08
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
 
Цитата
ProFessor написал:
Конкретизируйте, пожалуйста, вводимые данные и желаемый результатЕсли вы хотите просто провести проверку и после неё обозначить столбец через вводимую букву и/или цифру, то Вы очень сильно намудрили
Я хочу сделать проверку на столбец, причем если пользователь начал вводить цифры, то дальше ввод возможен только цифр, соответственно и с буквами. Чтобы на выходе были значения от 1 (кстати, тут ошибка) до 16384 или от A до XFD, и не было значений вроде c3p0.
 
KROKS, а Вы создайте флаг, который определяет после ввода символа какой символ был введен...
Если текст, то адресуйте на филтрацию по тексту, если цифра, то фильтрация по цифрам.
Но этого, конечно же маловато, но если сделаете, то можно двигаться дальше...  ;)
 
AAF, так и сделано
Код
asciicode = Asc(Left(TextBox.Text, 1))
Select Case asciicode
   Case 48 To 57
   Case 65 To 90, 97 To 122
   Case Else
End Select
 
а какое отношение первый символ в TextBox имеет к тем, которые добавляются и добавляются в TextBox.
даже если в Ваш TextBox символы добавляются справа на лево... и то не факт, что каждый новый символ добавляется в самой левой позиции текста
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
KROKS написал:
Код ? 123456asciicode = Asc(Left(TextBox.Text, 1))Select Case asciicode   Case 48 To 57   Case 65 To 90, 97 To 122   Case ElseEnd Select

KROKS, вы довольно опытны в VBA, если понимаете взаимодействие с ascii.
Попробуйте сделать 2 алфавита, через цикл и условия

Код
   Case 48 To 57
   Case 65 To 90, 97 To 122
   Case Else


поместите в них символы
И используйте функцию like
Так должно получиться и у Вас перед глазами всегда будет строка с алфавитом для ручной проверки
Изменено: ProFessor - 16.04.2018 13:32:35
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
 
Цитата
Ігор Гончаренко написал:
а какое отношение первый символ в TextBox имеет к тем, которые добавляются и добавляются в TextBox.даже если в Ваш TextBox символы добавляются справа на лево... и то не факт, что каждый новый символ добавляется в самой левой позиции текста
Всё верно написано, правильнее будет скорее:

Код
asciicode = Asc(Right(TextBox.Text, 1))
Select Case asciicode
   Case 48 To 57
   Case 65 To 90, 97 To 122
   Case Else
End Select


Последний введённый символ, по логике будет располагаться справа (но не факт, зависит от положения курсора, но я упрощаю задачу, т.к. у Вас своя логика).
Но суть проверки всё равно не пойму, сделайте кнопку. Отлов на изменение текстбокса, в данной задаче, лишняя непонятная и нерациональная примочка
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
 
Цитата
ProFessor написал:
Вы очень сильно намудрили

Код
Private Sub TextBox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    
    On Error Resume Next
    Dim check As Range, tb$, symb, col
    
    symb = chr(KeyAscii)
    tb = Me.TextBox.Value
    col = tb & symb
    If IsNumeric(col) Then col = CDbl(col)

    Set check = Columns(col)
    If Err.Number <> 0 Then
        KeyAscii = 0
        Err.Clear
    End If

End Sub
 
Dima S, Действительно. Интересная методика, спасибо.
 
А можно как-нибудь сымитировать modeless чтобы можно было осуществлять навигацию по книге при открытом окне? Или наоборот, имитация приостановки кода, пока юзер не отработает с окном? Когда во время выполнения кода макрос попросит указать номер столбца, то совсем не факт, что юзер его наизусть помнит и книга прокручена на нужный столбец.
Изменено: KROKS - 16.04.2018 14:03:47
 
ProFessor,
отличное решение - ставим задачу проверить что пападает в ТекстБокс, а проверяем первый или последний символ находящийся в ТекстБоксе. понятно, что довольно часто или иногда это совпадет с тем что было введено, но часто - не значит всегда
а макрос, который не решает задачу, для решения которой был написан - это, мягко говоря, плохой макрос
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, Идея была в том, что если уж начали вбивать цифры, то продолжаем принимать только цифры, соответственно и с буквами. Поэтому нет необходимости проверять последний символ, достаточно первого.
 
не гуманно заставлять пользователя набирать то буквы то числа, если он может просто щелкнуть по требуемому
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, Согласен. Идеальное решение, спасибо!
 
пожалуйста)
не знаю для чего я это повторяю, но... еще раз:
опишите задачу, которая перед вами стоит, а не способ, которым Вы пытаетесь ее решать
возможно, Вам посоветуют или получите в ответ простой и эффективный способ решения
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Страницы: 1
Наверх