Почему метод .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