Почему метод .Find() в Excel VBA показывает только первые 15 символов?

У меня есть список Excel с идентификатором и данными (около 8000 строк и т.д.). Идентификатор может быть только цифрами или цифрами с символами. Как " 2222222222222223" или " 222222222222222A" (ячейки с идентификатором отформатированы как текст)

Если я попытаюсь найти адрес записи с идентификатором, он будет вставлять теперь строку, потому что она не найдет их. Что означает, что в End я удвоил все записи.


Итак, мой вопрос: сколько символов сравнивает метод поиска?

With objSheet
     strAdresseExcel = .Cells.Find(What:=str, After:=.Cells(1, 1), _ 
     LookAt:=Excel.XlLookAt.xlWhole, MatchCase:=True, SearchFormat:=False).Address
    End with

Итак, я создал фиктивный список с 8000 строк, где у всех ID был номер " 2222222222222222", и я нашел что-то.

В Excel сравниваются только первые 15 символов, если в строке есть только цифры, но я отлично работаю, если есть письмо в ID! Вы можете увидеть проблему в изображении ниже

Информация к изображению:
Строка A:
Я работал с Условным форматированием.
(На вкладке "Главная" нажмите "Условное форматирование", "Выделите правила ячеек", "Дублирующие значения" )
Работает только тогда, когда идентификатор имеет цифры или есть разница в первых 15 символах.

Строка B:
Я работал с Формулой. (= IF (COUNTIF (A: A; A2) > 1, "Double", ""))
Как вы можете видеть, эта же проблема происходит и здесь.

введите описание изображения здесь

Ответ 1

Это, похоже, работает для меня, если я не пропущу что-то, что вполне возможно:)

Он возвращает первый адрес, где ячейка сопоставлена ​​и печатает длины искомых строк. У меня есть установка набора данных в Sheet1, как показано, с числовыми данными, которые хранятся в виде текста (я добавил апостроф в начале каждого значения)

 Sub testSO()
    Dim objSheet   As Worksheet: Set objSheet = ThisWorkbook.Sheets("Sheet1")
    Dim strToFind  As String: strToFind = "22222222222222222222222"
    Dim strAddress As String

    strAddress = objSheet.Cells.Find(strToFind, objSheet.Cells(1, 1), _
    LookAt:=Excel.XlLookAt.xlWhole, MatchCase:=True, SearchFormat:=False).Address

    'Print out findings
    Debug.Print strAddress, Len(strToFind), Len(objSheet.Range(strAddress))
End Sub

Выход:

$A$5 23 23

Ответ 2

Как было указано, COUNTIF() будет анализировать значения как числовые, где это возможно, перед сравнением.

Хотя Excel может отображать 30 десятичных знаков, его точность для указанного числа ограничена 15 значимыми цифрами, а вычисления могут иметь точность, которая еще меньше из-за трех проблем: округление, усечение, и двоичное хранилище.

введите описание изображения здесь

Как вы можете видеть в примере, 16-значные значения, которые можно преобразовать в целые числа, сравниваются по их первым 15 значащим цифрам, поэтому он выглядит так, как если бы в столбце было 10 вхождений, а строки с буквами корректно оцениваются COUNTIF() как уникальные в столбце.

Я не смог воспроизвести эту проблему с помощью VBA .Find(), но условное форматирование с помощью дубликатов показывает то же поведение, что и COUNTIF().

Подробнее о проблеме: https://en.wikipedia.org/wiki/Numeric_precision_in_Microsoft_Excel