Почему, несмотря на совпадение на листе Excel, функция Application.Match работает не так, как должна? - PullRequest
0 голосов
/ 01 июня 2018

Код ниже:

Private Sub txtv_AfterUpdate()
Total_rows_Entries = Worksheets("Entries").Range("A" & Rows.Count).End(xlUp).Row

If IsError(Application.Match(txtv.Value, Worksheets("Entries").Range("A2:A" & Total_rows_Entries), 0)) = False Then
    MsgBox "This voucher number has already been used previously. Voucher numbers cannot be duplicated."
End If

End Sub

txtv.Value является числовым типом, и это значение текстового поля.

Рабочая таблица показана ниже: Worksheet

Моя цель сопоставления состоит в том, что если на листе уже есть число «123», то оно должно вернуть окно сообщения, но оно всегда обходит его, независимо от того, изменил ли я тип на .Text или.Value или измените тип ячейки в Excel вручную на общий, текстовый или числовой.

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Я собираюсь предположить, что это связано с тем, что ваш столбец - это числа, а элемент совпадения - строковые значения, или наоборот.

Попробуйте:

Private Sub txtv_AfterUpdate()
Total_rows_Entries = Worksheets("Entries").Range("A" & Rows.Count).End(xlUp).Row

If IsError(Application.Match(INT(txtv.Value), Worksheets("Entries").Range("A2:A" & Total_rows_Entries), 0)) = False Then
    MsgBox "This voucher number has already been used previously. Voucher numbers cannot be duplicated."
End If

End Sub

Или, если это наоборот, попробуйте:

Private Sub txtv_AfterUpdate()
Total_rows_Entries = Worksheets("Entries").Range("A" & Rows.Count).End(xlUp).Row

If IsError(Application.Match(CStr(txtv.Value), Worksheets("Entries").Range("A2:A" & Total_rows_Entries), 0)) = False Then
    MsgBox "This voucher number has already been used previously. Voucher numbers cannot be duplicated."
End If

End Sub
0 голосов
/ 01 июня 2018

Вы можете использовать метод Range.Find, при котором числа будут храниться в виде чисел или текста:

Private Sub txtv_AfterUpdate()
    If Not Worksheets("Entries").Range("A:A").Find(What:=txtv.Value, LookAt:=xlWhole) Is Nothing Then
        MsgBox "This voucher number has already been used previously. Voucher numbers cannot be duplicated."
    End If
End Sub
0 голосов
/ 01 июня 2018

Попробуйте это широкое сравнение.

If not (IsError(Application.Match(clng(txtv.Value), Worksheets("Entries").columns(1), 0)) And _
        IsError(Application.Match(cstr(txtv.Value), Worksheets("Entries").columns(1), 0))) Then
    MsgBox "This voucher number has already been used previously." & vblf & _
           "Voucher numbers cannot be duplicated."
End If

В качестве альтернативы, попробуйте что-то только немного более интенсивное вычисление, но не заботится, является ли искомое значение строковым или числовым.

If cbool(Application.countif(Worksheets("Entries").columns(1), txtv.Value)) Then
    MsgBox "This voucher number has already been used previously." & vblf & _
           "Voucher numbers cannot be duplicated."
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...