Как мне отредактировать этот код VBA, чтобы он принимал разные значения? - PullRequest
1 голос
/ 19 января 2020

Возникли проблемы с корректной работой этой онлайн-копии. Первый символ должен быть от A до Z, второй символ от 1 до 5, третий символ "" или от 0 до 9.

Функция ящика - указать ячейку в диапазоне A1: Z53.

Идеи включены синтаксис?

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
    Case Asc("0") To Asc("9")
    Case Asc("-")
        If Instr(1,Me.TextBox1.Text,"-") > 0 Or Me.TextBox1.SelStart > 0 Then
            KeyAscii = 0
        End If
    Case Asc(".")
        If InStr(1, Me.TextBox1.Text, ".") > 0 Then
            KeyAscii = 0
        End If
    Case Else
        KeyAscii = 0
End Select
End Sub

Ответы [ 2 ]

1 голос
/ 23 января 2020

VBA имеет ограниченное сопоставление с шаблоном, используя оператор Like :

IsInRange = text Like "[A-Z][1-9]" Or text Like "[A-Z][1-4][0-9]" Or text Like "[A-Z]5[0-3]"

Другой альтернативой может быть использование метода пересечения Excel (также будет работать, например, с " $Z$53 "):

IsInRange = Not Intersect([A1:Z53], Range(text)) Is Nothing

или Excel оператор пересечения диапазона :

IsInRange = Not Evaluate("ISERR(A1:Z53 " & text & ")")
1 голос
/ 20 января 2020

Спасибо, но я получил хороший совет по использованию RegEx. Это оказалось лучшим решением для моего приложения. После поиска я нашел предыдущий ответ, который просто нуждался в следующей модификации для работы в этом сценарии:

.IgnoreCase = False

.Pattern = "[A-Z]([1-9]|[1-4][0-9]|[5][0-3])$"

Код можно найти здесь: Применить Regex в виде текстового поля VBA

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...