我有一个数据列表,我创建了一个表格来输入要添加到列表中的新数据。单击按钮后,它将从表单中获取信息(名称和电子邮件地址),并将其按字母顺序添加到相应的工作表中。由于涉及到链接的单元格,因此我不能仅将其添加到底部并进行排序。相反,我在正确的工作表中搜索姓氏单元格,以将行插入正确的位置。
在我遇到一个我可能不知道的可能独特的情况之前,这在大多数情况下都按预期进行。
基本上,我有一条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在下面的回答中概述了为什么我的原始方法不起作用。
答案 0 :(得分:2)
Excel公式默认使用不区分大小写的比较。
VBA默认使用区分大小写的比较。
如果您要进行不区分大小写的比较,请输入
Option Compare Text
在代码模块的开头,默认情况下该代码模块中的所有文本比较都不区分大小写,或者在每个特定的比较中请求比较类型:
ElseIf StrComp(lastname, searchl, vbTextCompare) = 1 And StrComp(lastname, searchl2, vbTextCompare) = -1 Then
最重要的是,您应该在特定情况下使用二进制搜索来找到要插入的位置。将MATCH
与match_type = 1
一起使用,将返回您在该值应位于的排序列表中的位置。