【问题标题】:Excel VBA 2 similar values not detected as matchingExcel VBA 2类似的值未检测为匹配
【发布时间】:2014-06-29 18:58:03
【问题描述】:

Sample Excel

大家好,

我的 excel 宏有点问题。有一部分代码比较了从 sheet1 到 sheet2 的单元格。问题是即使 sheet1 中的单元格与 sheet2 中的单元格匹配,它仍然显示为“不匹配”。

我相信其中一个单元格,无论是 ValueA 还是 ValueB,其中都有隐藏字符。他们的内容来自不同的来源。我尝试做 CLEAN() 公式,但这没有帮助。有任何想法吗?请查看上面的链接文件。我按原样复制并粘贴了 2 个值,以便您测试可能隐藏的内容。

我正在处理大量数据,因此我不想在 VBA 中使用 DO WHILE。是否有公式或代码可以在单元格中仅保留可见字符和空格?

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

Sample2

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

【问题讨论】:

  • 请检查,我编辑了帖子并添加了一个接近原版的新示例文件。

标签: vba excel


【解决方案1】:

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

消除文本/数字问题的一种方法是使用 EXACT 工作表函数(它适用于数字和文本字符串)。

例如:

=IF(EXACT(B3,C3),"Same","Not Same")

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

嗯,根据您的新示例,一个简单的 UDF 就可以解决问题。它正在模仿您手动使用的“查找”方法。我使它区分大小写,但您可以轻松更改它。下面的返回真或假,取决于是否有匹配。 R 是要搜索的范围,所以它可能是 OldFile!$A$2:$A$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

【讨论】:

    【解决方案2】:

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

    所以,你的公式变成了

    =IF(IFERROR(MATCH(IFERROR(VALUE($A2),$A2),OldFile!A:A,0),"NOT FOUND")<>"NOT FOUND","FOUND","NOT FOUND")
    

    【讨论】:

    • 这似乎有效,太棒了! :D 你能告诉我出了什么问题以及为什么我需要添加IFERROR(VALUE($A2),$A2) 吗?我的意思是那有什么作用?
    • 我不知道这是否会成为问题,但如果 OldFile 中的值是数字的文本表示,这似乎不起作用
    【解决方案3】:

    在您的附件中,B3 中的值存储为文本,而单元格 C3 中的值是数字,因此从技术上讲,它们并不相同。您可以通过将 D3 中的公式更改为以下内容来解决此问题:

    =IF(B3+0=C3+0,"Same","Not Same")
    

    +0 强制将文本解释为数字。您可以通过将 0 添加到已存储为文本的数值来将相同的逻辑应用于更大的工作表。

    要将文本快速转换为数字,这是使用 VBA 的一种方法(无需了解数据布局):

    Sheet1.Range("B1").Copy
    Sheet1.Range("B2:B2000").PasteSpecial Paste:=xlPasteAll, Operation:=xlAdd, SkipBlanks:=False, Transpose:=False
    

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

    【讨论】:

    • 嗨,如果我强制它们是文本而不是数字呢?这些值有时包含所有数字,有时包含字母数字,例如 F1245645
    • @user3682866 查看我的编辑。我添加了一些 VBA,它将以文本形式存储的数字范围更改为 2 行代码中的真实数字(无需循环)。如果您需要更多帮助,请发布有关您的数据布局的更多详细信息,但希望这可以帮助您入门。
    • 谢谢苏,我可以看到我们正在接近解决这个问题,但我正在寻找你的解决方案的反面。我应该比较 TEXT 类型的单元格,而不是数字。您的解决方案将单元格内容转换为 NUMBERS,然后再进行比较。我正在比较像 if 12356485 is equal to F12356485 这样的文本,应该是 NOT MATCH
    • @user3682866 啊,那么您应该使用代表性数据更新您的附件和问题。在您发布的内容中,您将数字存储为文本,并将相同的数字序列存储为数字,但从技术上讲,它们没有'不匹配。我已经给了你一个解决这个问题的解决方案(并且对混合了数字和字符串的单元格没有影响)。如果你试图找到 12356485 等于 F12356485 的实例,那就是完全不同的问题,将涉及从字符串中拆分数字的辅助列或更全面的 VBA。选择你的毒药......
    • 不,我正在尝试查找 12356485 不等于 F12356485 的实例,这就是公式应该输出 NOT MATCH 的原因。我只需要比较示例 excel 文件中的 ValueA 和 ValueB,但即使示例文件单元格只包含数字,我也需要将它们作为文本进行比较。我要比较的值是 RecordID,例如“F1523Q546”和“T5T466546”和“65435546”
    【解决方案4】:

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

    【讨论】:

    • 您好,我很抱歉没有在我的帖子中说明,但是原始文件实际上是 sheet1 和 sheet2 的比较,与您的公式相同,但我认为问题在于单元格值和我的方式比较它们,因为即使是我在这里链接的示例文件,它们也不匹配,这不会是我的比较公式中的错误吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    相关资源
    最近更新 更多