比较产生意外结果的字符串

时间:2019-04-29 14:03:15

标签: excel vba

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

在我遇到一个我可能不知道的可能独特的情况之前,这在大多数情况下都按预期进行。

基本上,我有一条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在下面的回答中概述了为什么我的原始方法不起作用。

1 个答案:

答案 0 :(得分:2)

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

如果您要进行不区分大小写的比较,请输入

Option Compare Text

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

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

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