VBA Regex Заменить цикл - PullRequest
       8

VBA Regex Заменить цикл

0 голосов
/ 24 сентября 2018

В настоящее время возникают проблемы с циклом замены регулярных выражений для форматирования системы заявок

Я тестирую сегмент кода, который будет соответствовать регулярному выражению определенного формата для номера заявки.Номер билета должен быть в формате «INC01234567» (до 8 цифр).«INC» может быть необязательным, так что пользователь может просто ввести конечный номер (IE 1234567), и цикл добавит дополнительные «0», чтобы дать числовое значение до 8 цифр.В настоящее время, однако, я застрял в математической проблеме, когда добавляется слишком много нулей к результату, если вы вводите полный номер заявки.

I

Sub Incident()
Dim sInc As String  'Incident Number Field
Dim strPattern As String: strPattern = "^(?:INC|NC|C)?([0-9]{1,8}$)"
Dim strReplaceINC As String: strReplaceINC = "$1"
Dim regEx As New RegExp
Dim strInput As String
Dim IncResult As Boolean

Do
    If strPattern <> "" Then

        strInput = inputbox("Input Incident Number", "Ticket Number")

        If strInput = vbNullString Then
            Exit Sub
        End If

        IncResult = False

        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = True
            .Pattern = strPattern
        End With

        If regEx.Test(strInput) Then
            sInc = regEx.Replace(strInput, strReplaceINC)
            Dim L As Integer: L = Len(sInc)
            Do
                sInc = "0" & sInc
                L = L + 1
            Loop While L <= 8
            sInc = "INC" & sInc
            IncResult = True
            'sInc = strInput
        Else
            MsgBox ("Please input a valid ticket number format")
            IncResult = False
        End If
    End If

Loop While IncResult = False
MsgBox (sInc)
End Sub

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

Вы проверяете условие в конце цикла, то есть цикл всегда будет выполняться хотя бы один раз, независимо от длины sInc.

Просто замените:

Do
    sInc = "0" & sInc
    L = L + 1
Loop While L <= 8

С:

While L < 8
    sInc = "0" & sInc
    L = L + 1
Wend
0 голосов
/ 24 сентября 2018

Регулярное выражение "^(?:INC|NC|C)?([0-9]{1,8}$)" соответствует 8-значному номеру билета 012345678, не так ли?Таким образом, If regEx.Test(strInput) Then будет истинным, и do..loop будет запущен как минимум вовремя, прежде чем сломается

0 голосов
/ 24 сентября 2018

Цикл ненужных накладных расходов, просто используйте Format()

Замените все это:

Dim L As Integer: L = Len(sInc)
Do
    sInc = "0" & sInc
    L = L + 1
Loop While L <= 8
sInc = "INC" & sInc

На это:

sInc = "INC" & Format(sInc, "00000000")
...