为什么Excel VBA中的.Find()方法似乎只检查前15个字符?

我有Excel列表与ID和数据(约8000行以上)。 ID的只能是数字或数字与字符。 像“ 2222222222222223 ”或“ 222222222222222A ”(带ID的单元格格式为文本)

如果我尝试使用ID查找入口地址,它将插入一个现在的行,因为它不会find它们。 什么意思,最后我把所有的参赛作品翻了一番。

所以我的问题是,查找方法比较有多less个字符?

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

所以我创build了一个8000行的虚拟列表,其中所有的ID号都是“ 2222222222222222 ”,我find了一些东西。

该Excel只比较前15个字符,如果只有数字string,但我工作正常,如果有一个字母在ID! 您可以在下面的图片中看到问题

信息到图像:
行A:
我使用条件格式。
(在主页选项卡上,单击条件格式,突出显示单元格规则,重复值)
只有当ID有数字或前15个字符有区别时才起作用。

排B:
我曾与一个公式。 ( = IF(COUNTIF(A:A; A2)> 1;“Double”;“”)
你怎么看,同样的问题也发生在这里。

在这里输入图像说明

这似乎为我工作,除非我失去了一些东西,这是完全可能的:)

它返回单元格匹配的第一个地址,并打印出search到的string的长度。 我有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

正如所指出的那样,在比较之前, COUNTIF()将在可能的情况下将值parsing为数字。

尽pipeExcel可以显示30位小数,但对于指定数字的精度限制为15位有效数字 ,并且由于三个问题(四舍五入,截断和二进制存储),计算的精度可能会更低。

在这里输入图像描述

正如您在示例中所看到的那样,可以转换为整数的16位数字的前15个有效数字进行比较,因此看起来就好像列中每次出现10次,而具有字母的string则可以正确评估由COUNTIF()在列中唯一。

我无法用VBA .Find()重现此问题,但重复的条件格式显示与COUNTIF()相同的行为。

更多的问题: https : //en.wikipedia.org/wiki/Numeric_precision_in_Microsoft_Excel