Excel VBA Сравнение строк для определения правильности формата содержимого ячейки, если это необходимо - PullRequest
1 голос
/ 11 марта 2020

Я создаю электронную таблицу проверки, в которую пользователь будет вводить данные до того, как они будут импортированы в базу данных нашей компании.

Я все это закончил, но потом мы поняли, что осталась одна дыра, которую я я изо всех сил пытаюсь подключиться.

Чтобы в моем тесте узнать, могу ли я получить что-то для выполнения того, что я хочу, пользователь вводит данные в столбцы A и B, начиная со строки 2. Столбец A является обязательным, столбец B - микс - для большинства записей в A тогда B является необязательным, но для определенных записей в A требуется B и требуется в предопределенном формате на основе A.

например. пользователь вводит «12345678» в A2, и «12345678» не является чем-то особенным, поэтому запись в B2 необязательна, пользователь вводит «11111111» в A3, а «11111111» является особенным, поэтому ему действительно необходимо поместить запись в B3, и это требуется в формате ab12cde (?? ## ???)

Пока у меня есть небольшая таблица в диапазоне N2: O6 для использования в Vlookup - N - это запись A (11111111, 22222222, et c) и B - требуемая маска (?? ## ???, ##? # ?, et c)

Я знаю, что в конечном итоге мне понадобится l oop код, но я удалил это, поскольку хочу сначала выполнить 1 прогон.

Dim b As String
Dim suf As String
Dim zzz As Integer

Last_Row_Suf = Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row

Debug.Print Last_Row_Suf

zzz = 2

If zzz <= Last_Row_Suf Then
    suf = "test"
    suf = Application.VLookup(Range("A" & zzz), Range("N2:O6"), 2, False)
    b = Range("B" & zzz).Value
    If suf Like b Then
        Range("D" & zzz).Value = 1
    Else
        Range("D" & zzz).Value = 0
    End If
    zzz = zzz + 1
Else
End If

    Debug.Print suf
    Debug.Print b

Проблема, с которой я сталкиваюсь, заключается в том, что Like возвращает False, когда я пытаюсь сравнить, например, xy45trn и ab12cde

Мне также нужно выполнить предыдущие шаги, чтобы проверить, находится ли A2 в обязательной таблице или нет, как будто его нет, тогда я просто пропущу, так как мне все равно, что находится в B2, но suf не получает обновляется при сбое Vlookup.

Вероятно, много проблем, но, надеюсь, кто-то может указать мне правильное направление.

* 1 019 * Спасибо

1 Ответ

1 голос
/ 11 марта 2020

Примерно так:

Sub Tester()

    Dim c As Range, m, v
    Dim wsData As Worksheet, wsLookup As Worksheet

    Set wsData = ThisWorkbook.Sheets("Sheet1")
    Set wsLookup = ThisWorkbook.Sheets("Config")

    'loop over the input in ColA
    For Each c In wsData.Range(wsData.Range("A2"), _
                               wsData.Cells(Rows.Count, 1).End(xlUp)).Cells
        'lookup table is on a separate sheet
        m = Application.VLookup(c.Value, wsLookup.Range("A2:B20"), 2, False)

        If Not IsError(m) Then
            'got a hit from the lookup table
            v = Trim(c.Offset(0, 1).Value)
            'using Like
            c.Offset(0, 3).Value = IIf(v Like m, "OK", "Error")
            'using RegExp
            'c.Offset(0, 3).Value = IIF(MatchesPattern(v, m), "OK", "Error")
        End If

    Next c

End Sub

Если Like не соответствует вашим потребностям, вы можете использовать объект регулярного выражения для выполнения vbalidation: немного сложнее с точки зрения шаблона, но намного более мощный.

Function MatchesPattern(v, patt As String) As Boolean
    Static reg As Object
    If reg Is Nothing Then Set reg = CreateObject("VBScript.RegExp")
    reg.Pattern = patt
    MatchesPattern = reg.Test(v)
End Function

Ссылка на RegExp: https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/scripting-articles/ms974570 (v = msdn.10)? redirectedfrom = MSDN

...