如何让VBA字符串比较与Excel公式比较结果保持一致?
让VBA使用Excel排序规则进行字符串比较
除普通拉丁字符外,Excel对各类字母文字的字符串排序表现出色,公式中的<和>比较也遵循该排序规则。但VBA中的<和>比较采用不同顺序(通常基于UNICODE()函数的结果),导致Excel公式计算结果(如示例中的B列)与VBA宏计算结果(C列)不一致。我们需要让VBA实现和Excel公式一致的字符串比较逻辑,期望通过类似somefunction(X) < somefunction(Y)的方式达成一致,注意:并非要修改排序规则,仅解决比较一致性问题。
复制重现步骤
- A列从A2(命名为"first")开始的内容为:
А Б В Г Ґ Д Е Є Ж З И Stop - B2单元格公式:
=IF(A2<A3,"Less than next","Greater than next") - D2单元格公式:
=UNICODE(A2) - C列由以下VBA宏填充:
Sub Compare() Range("first").Select Do Until ActiveCell.Value = "Stop" If ActiveCell.Value < ActiveCell.Offset(1, 0).Value Then ActiveCell.Offset(0, 2).Value = "Less than next" ElseIf ActiveCell.Value > ActiveCell.Offset(1, 0).Value Then ActiveCell.Offset(0, 2).Value = "Greater than next" Else ActiveCell.Offset(0, 2).Value = "Same as next" End If ActiveCell.Offset(1).Select Loop End Sub
解决方案
使用VBA的StrComp函数,并指定第三个参数为vbDatabaseCompare,该参数会让字符串比较遵循Excel公式使用的排序规则,从而实现结果一致。
StrComp函数的返回值说明:
- 返回
-1:第一个字符串小于第二个字符串 - 返回
0:两个字符串相等 - 返回
1:第一个字符串大于第二个字符串
修改后的宏代码如下:
Sub CompareWithExcelRules() Dim cell As Range Set cell = Range("first") Do Until cell.Value = "Stop" Dim compareResult As Integer compareResult = StrComp(cell.Value, cell.Offset(1, 0).Value, vbDatabaseCompare) Select Case compareResult Case -1 cell.Offset(0, 2).Value = "Less than next" Case 1 cell.Offset(0, 2).Value = "Greater than next" Case 0 cell.Offset(0, 2).Value = "Same as next" End Select Set cell = cell.Offset(1) Loop End Sub
补充说明
vbDatabaseCompare会采用当前系统的数据库排序规则,这和Excel公式中字符串比较的逻辑完全匹配,不管是拉丁字符还是其他语言的字母(如示例中的西里尔字母),都能得到和Excel公式一致的比较结果。同时这段代码去掉了原宏中的Select操作,让代码更高效、更稳健。
内容的提问来源于stack exchange,提问作者zsalya
相关产品推荐
相关产品推荐

