Excel VBA 2类似值未检测到匹配

Excel VBA 2类似值未检测到匹配,vba,excel,Vba,Excel,大家好 我的excel宏有点问题。代码中有一部分将表格1中的单元格与表格2中的单元格进行比较。问题是,即使sheet1中的单元格与sheet2中的单元格匹配,它仍显示为“不匹配” 我相信其中一个单元格ValueA或ValueB中有隐藏的字符。它们的内容来自不同的来源。我试着用CLEAN()公式,但没用。有什么想法吗?请参阅上面的链接文件。我复制并粘贴了这两个值,以便您可以测试可能隐藏的内容 我正在处理大量的数据行,所以我不想在VBA中使用DO。是否有公式或代码只在单元格中留下可见字符和空格 ==

大家好

我的excel宏有点问题。代码中有一部分将表格1中的单元格与表格2中的单元格进行比较。问题是,即使sheet1中的单元格与sheet2中的单元格匹配,它仍显示为“不匹配”

我相信其中一个单元格ValueA或ValueB中有隐藏的字符。它们的内容来自不同的来源。我试着用CLEAN()公式,但没用。有什么想法吗?请参阅上面的链接文件。我复制并粘贴了这两个值,以便您可以测试可能隐藏的内容

我正在处理大量的数据行,所以我不想在VBA中使用DO。是否有公式或代码只在单元格中留下可见字符和空格

================================================================


这是另一个示例,它取自主文件本身,因此与原始文件非常接近。如您所见,sheet1 B列中有一个公式,用于检查sheet2中是否已存在每个记录ID。它们都表示“未找到”(在sheet2中不存在),但其中许多实际上已经存在于sheet2中,包括记录ID“1743840”。如果手动按住CTRL+F键在sheet2中查找记录ID,您将看到它在那里,查找系统工作,但公式不工作。

在所附的工作表中,B3中的值存储为文本,而单元格C3中的值是数字,因此从技术上讲,它们是不同的。您可以通过将D3中的公式更改为:

=IF(B3+0=C3+0,"Same","Not Same")
+0强制将文本解释为数字。通过将0添加到已存储为文本的数值,可以将相同的逻辑应用于较大的工作表

要快速将文本转换为数字,这里有一种使用VBA的方法(不知道数据的布局):


这假设B1是一个空白单元格,并且作为文本存储的数字在B2:B2000中。您必须调整范围以适应您的情况,或者发布有关数据布局的更多详细信息。

与您的情况相关,假设您比较了Sheet1单元格A1中的值和Sheet2单元格A1中的值。好的起点是尝试Excel工作表函数,如:在Sheet1的单元格A2中输入的
=(A1=Sheet2!A1)
,然后查看结果。根据调查结果,继续使用工作表函数或VBA(必要时)。 如果单元格格式不同(例如一个格式为文本,另一个格式为数字),请将两者转换为文本并应用trim()函数(以防万一)。
Rgds,

Hmmm。您的示例没有宏,它有一个公式

消除文本/数字问题的一种方法是使用精确的工作表函数(该函数既适用于数字,也适用于文本字符串)

e、 g:

如果要使其不区分大小写,请使用UPPER将文本字符串更改为全大写

嗯,根据你的新例子,一个简单的UDF就可以了。它模仿了您手动使用的“查找”方法。我让它区分大小写,但你可以很容易地改变它。根据是否存在匹配,下面的返回值为true或false。R是要搜索的范围,因此它可能是OldFile$A$2:$160澳元

Function IsFound(S As String, R As Range) As Boolean
    With R
        If Not .Find(what:=S, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=True) Is Nothing Then
            IsFound = True
        Else
            IsFound = False
        End If
    End With
End Function

尝试将查找值替换为
IFERROR(值($A2),$A2)

所以,你的公式变成

=IF(IFERROR(MATCH(IFERROR(VALUE($A2),$A2),OldFile!A:A,0),"NOT FOUND")<>"NOT FOUND","FOUND","NOT FOUND")
=IF(IFERROR(匹配(IFERROR(值($A2),$A2),OldFile!A:A,0),“未找到”)“未找到”,“已找到”,“未找到”)

Hi,如果我强制它们是文本而不是数字,怎么样?这些值有时包含所有数字,有时包含字母数字F1245645@user3682866请参阅我的编辑。我添加了一些VBA,可以在两行代码中将存储为文本的数字范围更改为真数字(无需循环)。如果您需要更多帮助,请发布有关您的数据布局的更多详细信息,但希望这能帮助您开始。谢谢苏,我可以看到我们正在接近解决此问题,但我正在寻找与您的解决方案相反的解决方案。我应该比较文本类型的单元格,而不是数字。您的解决方案将单元格内容转换为数字,然后再进行比较。我比较的是
这样的文本,如果12356485等于F12356485
,应该说
不匹配
@user3682866 Ah,那么你应该用代表性数据更新你的附件和问题。在你发布的内容中,数字存储为文本,数字序列存储为数字,但从技术上讲,它们并不匹配。我已经为您提供了一个解决方案,可以解决这个问题(并且对混合了数字和字符串的单元格没有影响)。如果您试图找到12356485等于F12356485的实例,这是一个完全不同的问题,可能需要一个helper列将数字从字符串中分离出来,也可能需要更全面的VBA。选择你的毒药…不,我正在试图找到
12356485
不等于
F12356485
的实例,这就是为什么配方应该吐出
不匹配的原因。我只需要比较示例excel文件中的ValueA和ValueB,但即使示例文件单元格只包含数字,我也需要将它们作为文本进行比较。我正在比较的值是RecordID,如“F1523Q546”和“T5T466546”和“65435546”。您好,我很抱歉没有在我的帖子中说明这一点,但是的,原始文件实际上是sheet1和sheet2的比较,与您的公式相同,但我认为问题在于单元格值以及我比较它们的方式,因为即使是我在这里链接的示例文件,它们不匹配,这不可能是我的比较公式中的错误?请检查,我编辑了文章并添加了一个新的示例文件,接近原始文件。这似乎有效,太棒了!:你能告诉我哪里出了问题,为什么我需要添加
IFERROR(VALUE($A2),$A2)
?我不知道这是否会成为一个问题,但是如果OldFile中的值是一个数字的文本表示,这似乎不起作用
Function IsFound(S As String, R As Range) As Boolean
    With R
        If Not .Find(what:=S, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=True) Is Nothing Then
            IsFound = True
        Else
            IsFound = False
        End If
    End With
End Function
=IF(IFERROR(MATCH(IFERROR(VALUE($A2),$A2),OldFile!A:A,0),"NOT FOUND")<>"NOT FOUND","FOUND","NOT FOUND")