我的
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
如果您所追求的正确顺序是
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
...只是稍微修改逻辑以正确处理相同长度的字符串。
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