VBA中的Quicksort不会忽略字母大小写

时间:2015-08-25 12:53:33

标签: vba quicksort

我一直在寻找一种在VBA中对数组进行排序的方法,并找到了topic

但是,此功能在小写和大写字母之间也有所不同。

通常单词“also”出现在“apple”之前,但是当我使用“quick”和“APPLE”时,“APPLE”突然出现。

这是正常的,如果有,是否有办法忽略字母的情况?

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

尝试在QuickSort类/模块的顶部添加Option Compare Text。 (这应该是代码的所有顶部的第一行(或Option Explicit之后的第二行)。)

原因当然是因为" A"的ASCII值和" a"通过在即时窗口中执行以下操作来证明是不同的:

? Asc("A")
 65 

? Asc("a")
 97 

你看到" A"来之前" a"。

现在,在引用的QuickSort中,您会看到他们正在使用推理比较,使用><类型的比较器。这使用了Ascii值的严格比较(上图)。 Option Compare Text将迫使VBA考虑&#34; a&#34; =&#34; A&#34;。

在添加Option Compare Text之前尝试以下代码,然后尝试一次。

Public Sub test()
    Debug.Print "also" < "APPLE"
End Sub

或者,您可以将QuickSort修改为不区分大小写。您必须使用<函数替换所有隐含的比较符(例如>=StrComp) - 确保包含vbTextCompare作为thrid参数。

例如:

pivot < vArray(tmpHi)

......将替换为:

StrComp(pivot, vArray(tmpHi), vbTextCompare) < 0

尝试使用StrComp功能。一开始可能看起来很奇怪,但它比正常的VBA字符串比较更强大且(我相信)更快。

答案 1 :(得分:0)

是的,这是预期的行为。在ASCII中,大写字母在小写字母之前。您可以在比较周围使用UCASELCASE

 While (UCASE(vArray(tmpLow)) < UCASE(pivot) And tmpLow < inHi)
    tmpLow = tmpLow + 1
 Wend

 While (UCASE(pivot) < UCASE(vArray(tmpHi)) And tmpHi > inLow)
    tmpHi = tmpHi - 1
 Wend

我不知道这种比较的效率是多少,但从长远来看,我敢打赌它可以忽略不计。

您可以在声明处转换pivot的大小写,也可以在将数组值添加到数组时转换它们。后者可能是您的最佳解决方案,因为转换只发生一次。您可能已经发现QuickSort是一种递归算法。也可以删除每次调用必须发生的操作次数。