按大小对 ListBox 元素进行排序

问题描述 投票:0回答:2

我的

UserForm
中有一个系统,有 2 个
ListBoxes
。左边一个,右边一个。我已经完成了该功能,以便我可以在 2
ListBoxes
之间来回传递任何元素。 然后我想对
elements (strings)
中的
alphabetical order AND by size
进行排序。我所说的
size
是指 10 个字符的字符串将显示在 9 个字符的字符串之后。

这是我尝试过的:

Public Sub Sort_Listboxes(ByVal ListBox As msforms.ListBox)
Dim i As Long
Dim j As Long
Dim Temp As Variant

For i = 0 To ListBox.ListCount - 2
    For j = i + 1 To ListBox.ListCount - 1
        If ListBox.List(i) > ListBox.List(j) Or Len(ListBox.List(i)) > Len(ListBox.List(j)) Then
            Temp = ListBox.List(j)
            ListBox.List(j) = ListBox.List(i)
            ListBox.List(i) = Temp
        End If
    Next j
Next i

End Sub

通过这个函数我得到这个结果:

Element_1
Element_10
Element_2
Element_3

如果我们只采用条件的第一部分,这似乎很正常,但对于第二部分,它应该可以工作......

注意:我在两个函数中为两个列表调用

Sort_ListBoxes
函数
click_right
click_left

excel vba sorting listbox
2个回答
1
投票

如果您所追求的正确顺序是

Element_1
Element_2
Element_3
Element_10

然后尝试将

If
行替换为

If Len(ListBox.List(i)) > Len(ListBox.List(j)) Or (Len(ListBox.List(i)) = Len(ListBox.List(j)) And ListBox.List(i) > ListBox.List(j)) Then

...只是稍微修改逻辑以正确处理相同长度的字符串。


0
投票

UDF 对于确保正确排序很有用。

  • 假设分隔符是
    _
    并且最后一部分是数字。
Option Explicit

Public Sub Sort_Listboxes(ByVal ListBox As msforms.ListBox)
    Dim i As Long
    Dim j As Long
    Dim Temp As Variant
    For i = 0 To ListBox.ListCount - 2
        For j = i + 1 To ListBox.ListCount - 1
            If FormatStr(ListBox.List(i)) > FormatStr(ListBox.List(j)) Then
                Temp = ListBox.List(j)
                ListBox.List(j) = ListBox.List(i)
                ListBox.List(i) = Temp
            End If
        Next j
    Next i
End Sub

Function FormatStr(ByVal sInput As String) As String
    Dim aKey
    aKey = Split(sInput, "_")
    If UBound(aKey) > 0 Then
        If VBA.IsNumeric(aKey(1)) Then aKey(1) = Format(aKey(1), "0000")
    End If
    FormatStr = Join(aKey, "_")
End Function

测试:

?FormatStr("Element_10")>FormatStr("Element_9")
True
?"Element_10">"Element_9"
False
© www.soinside.com 2019 - 2024. All rights reserved.