Excel VBA 如果不是数字,则将列表框数据排序到底部

Excel VBA sort Listbox data if not numeric to bottom

我正在使用下面的代码对我的列表框数据进行数字排序。我使用以下 IF 语句来检查数据是否为数字(有些数据不是):

If IsNumeric(.List(i, 4)) And IsNumeric(.List(j, 4)) Then

我的列表框数据排序正确。然而,由于上面的 IF 语句,排序过程忽略了非数字数据。 我需要将非数字数据排序到列表框的底部。

Public Sub BubbleSort()

Dim i As Long
Dim j As Long
Dim Temp4 As Variant, Temp3 As Variant, Temp2 As Variant, Temp1 As Variant, Temp0 As Variant
With Plybooks.ListBox1
    For i = 0 To .ListCount - 2
        For j = i + 1 To .ListCount - 1
            If IsNumeric(.List(i, 4)) And IsNumeric(.List(j, 4)) Then
                If CLng(.List(i, 4)) > CLng(.List(j, 4)) Then
                    Temp4 = CLng(.List(j, 4))
                    .List(j, 4) = .List(i, 4)
                    .List(i, 4) = Temp4
                    Temp3 = .List(j, 3)
                    .List(j, 3) = .List(i, 3)
                    .List(i, 3) = Temp3
                    Temp2 = .List(j, 2)
                    .List(j, 2) = .List(i, 2)
                    .List(i, 2) = Temp2
                    Temp1 = .List(j, 1)
                    .List(j, 1) = .List(i, 1)
                    .List(i, 1) = Temp1
                    Temp0 = .List(j, 0)
                    .List(j, 0) = .List(i, 0)
                    .List(i, 0) = Temp0
                End If
            End If
        Next j
    Next i
End With

End Sub

您的列表未正确排序,因为当两个值之一不是数字时,您的排序例程不会执行任何操作。

对不能直接比较的值(对象)列表进行排序时,常见的解决方案是编写一个自定义函数来比较两个值。每次需要比较两个值时,排序函数都会调用此函数。

对于您的情况,函数可能如下所示:

Function IsLarger(v1 As Variant, v2 As Variant) As Boolean
    
    ' Compare 2 values and return
    '   True if first value is larger
    '   False if second value is larger
    
    ' Comparing:
    ' When v1 and v2 are numeric, compare the values
    ' When only one of those values is numeric, that value is considered a smaller
    ' When both values are non-numeric, make a string compare
    
    If IsNumeric(v1) And IsNumeric(v2) Then
        IsLarger = (Val(v1) > Val(v2))
    ElseIf IsNumeric(v1) Then
        IsLarger = False
    ElseIf IsNumeric(v2) Then
        IsLarger = True
    Else
        IsLarger = (UCase(v1) > UCase(v2))
    End If
            
End Function

您可以将 Sort-Routine 中的两个嵌套 if-statements 简单地替换为

If IsLarger(.List(i, 4), .List(j, 4)) Then