首页 > 解决方案 > 比较产生意外结果的字符串

问题描述

我有一个数据列表,我创建了一个表单来输入要添加到列表中的新数据。单击按钮后,它将从表单中获取信息(姓名和电子邮件地址),并按字母顺序将其添加到相应的工作表中。涉及链接单元格,因此我不能将其添加到底部并进行排序。相反,我让它在正确的工作表中搜索姓氏单元格,以将一行插入正确的位置。

这在很大程度上按预期工作,直到我遇到一个我无法弄清楚的可能独特的情况。

基本上,我有一个 if 语句检查名称是否重复,然后检查是否应该插入新名称。

    For i = 2 To lastrow

        ''^^IF STATEMENT CHECKING FOR DUPLICATE^^''
        '''''''''''''''''''''''''''''''''''''''''''
        '''vvIF STATEMENT CHECKING TO ADD DATAvv'''

        ElseIf StrComp(lastname, searchl) = 1 And StrComp(lastname, searchl2) = -1 Then

            Sheets("Master List").Range("A" & i).Offset(1).EntireRow.Insert (xlDown)
            Sheets("Master List").Range("A" & i + 1).Value = firstname
            Sheets("Master List").Range("B" & i + 1).Value = lastname
            Sheets("Master List").Range("C" & i + 1).Value = fullname

变量 searchl 和 searchl2 分别是搜索行 i 和 i + 1 中的姓氏。

我的问题是,当我尝试添加姓氏“Kralik”时,它试图在姓氏“Day”和“de Castro”之间插入数据

最初,我尝试使用以下代码行比较名称:

ElseIf lastname > searchl And lastname < searchl2 Then

这与上述代码的执行方式完全相同。然后我插入了一个断点并决定使用 StrComp 方法进行故障排除。将“Kralik”与“Day”进行比较产生了预期的结果,但将“Kralik”与“de Castro”进行比较时会出现问题。出于某种原因,代码认为“Kralik”小于“de Castro”,并输入 if 语句在该位置插入数据。更让我头疼的是,我打开了一本新的工作簿,并迅速在 A1 中输入了“Kralik”,在 A2 中输入了“de Castro”,在 A3 中输入了公式“=A1>A2”。该公式给出的结果为 TRUE,这也是我对 VBA 的期望。

编辑:经过更多的测试,我认为它必须与“Kralik”与“de Castro”的大写有关,只要“Kralik”中的“k”没有大写,我的代码就可以按预期工作。我将对变量使用 UCase 方法并返回结果。

编辑 2:使用 UCase 也可以。GSerg 在下面的回答中概述了为什么我的原始方法不起作用。

标签: excelvba

解决方案


默认情况下,Excel 公式使用不区分大小写的比较。
VBA 默认使用区分大小写的比较。

如果你想要不区分大小写的比较,要么把

Option Compare Text

在代码模块的开头默认使该代码模块中的所有文本比较不区分大小写,或者在每个特定比较中请求一个比较类型:

ElseIf StrComp(lastname, searchl, vbTextCompare) = 1 And StrComp(lastname, searchl2, vbTextCompare) = -1 Then

最重要的是,您应该在特定情况下使用二进制搜索来查找要插入的位置。MATCHwithmatch_type = 1将返回您在值应该去的排序列表中的位置。


推荐阅读