Excel VBA Проверка значения ячейки (первые 3 символа) по списку на другом листе - PullRequest
0 голосов
/ 29 января 2020

Допустим, после ввода данных необходимо проверить ячейку "A1" (у меня есть материал, который будет go для субмодуля, так что это не проблема)

Теперь мне нужно убедитесь, что введенные данные используют префикс из sheet2 с диапазоном C2: C250, большинство используют 3 символа, но некоторые из них 4, поэтому мне нужно убедиться, что первые 3-4 символа данных соответствуют этому диапазону. а затем мне также нужно убедиться, что после совпадения первых 3 или 4 символов они не ставят пробел.

Valid prefix examples
ABC
SEDC
SDR
SCT
KJLS
LOS

Example of cell value
ABC12XZY34 - Would match on ABC and no space = Valid
SEDC12XZY34 - Would also match on SEDC and no spcae = Valid
ABC 12ZYX12 - Would match on ABC but there is a space = Invalid
SEDC 12XYZ34 - Would match on SEDC but there is a spcae = Invalid
ABC12 XZY34 - Would match on ABC and no space right after prefix = Valid
SEDC12 XZY34 - Would also match on SEDC and no space right after prefix = Valid

Я не уверен, как сопоставить только первые 3 или 4 символа и затем убедитесь, что после префикса нет пробела, но в другом месте могут быть пробелы.

Префикс может быть любой комбинацией из 3-4 chr, а rest может быть и комбинацией chr, включая пробелы, только не после приставка.

У нас есть пользователи, которые продолжают ставить пробел после префикса, и это вызывает ошибки на серверной части, и им приходится заставлять их это исправлять.

Нужно, чтобы он работал в VBA Sub.

Спасибо за помощь.

Обновлено: Добавлено более четкое описание потребностей.

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Я сделал это, если вам нужно решение VBA:

Sub check_prefix()
    'Get text from the cell that you want to check.
    'I'm suposing that the cell is active because you said that you want to execute the code when the user
    'change a value
    If InStr(ActiveCell.Text, " ") Or Len(ActiveCell.Text) < 3 Then
        'The value is invalid.Do something
        Exit Sub
    End If
    'check if there is any compatible prefix the parameter

    If Len(ActiveCell.Text) < 4 Then
        Set Cells4 = Nothing
    Else
        Set Cells4 = Worksheets("Prefix").Range("C1:C250").Find(What:=Left(ActiveCell.Text, 4), LookIn:=xlFormulas, _
            LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
    End If
    Set Cells3 = Worksheets("Prefix").Range("C1:C250").Find(What:=Left(ActiveCell.Text, 3), LookIn:=xlFormulas, _
        LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False)
    If Cells3 Is Nothing And Cells4 Is Nothing Then
        'The value is invalid.Do something
        Exit Sub
    Else
        'The value is valid.Do something

    End If
End Sub
0 голосов
/ 29 января 2020

Пожалуйста, попробуйте эту формулу, где проверяемое число указано в A1.

=IF(ISNA(MATCH(LEFT($A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9}, $A1 &"0123456789"))-1),Sheet2!$C$2:$C$250,0)),"Invalid","Valid")

А вот и вся последовательность разработки, на случай, если вам нужно ее настроить.

[A1 =] ABC 1234

[C1] =MIN(FIND({0,1,2,3,4,5,6,7,8,9}, $A1 &"0123456789"))

[D1] =LEFT($A1,$C1-1)

[E1] =MATCH($D1,Sheet2!$C$2:$C$250,0)  -  returns #N/A in this case

[F1] =IF(ISNA(MATCH($D1,Sheet2!$C$2:$C$250,0)),TRUE,FALSE)

Замените $ D1 в формуле в F1 на формулу в D1.

=IF(ISNA(MATCH(LEFT($A1,$C1-1),Sheet2!$C$2:$C$250,0)),TRUE,FALSE)

Замените C1 в приведенной выше формуле формулой в C1

=IF(ISNA(MATCH(LEFT($A1,MIN(FIND({0,1,2,3,4,5,6,7,8,9}, $A1 &"0123456789"))-1),Sheet2!$C$2:$C$250,0)),TRUE,FALSE)

True = "Invalid "(потому что ISNA спрашивает, есть ли ошибка, которая есть, в этом случае) и Fals =" Действительный "

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