簡體   English   中英

對單元格中以逗號分隔的數字和文本進行排序

[英]Sort Numbers & Text Separated by Comma in Cell

我正在嘗試對文本和數字的組合進行排序。 它適用於排序,但在單元格正確的地方,它給了我一個#VALUE! 錯誤。 當它是單值示例 PR54 時,它也不會填充。 我該如何糾正?

原始單元格:A1、B13、B15

結果接收:#VALUE!

期望結果:A1、B13、B15

Function StrSort(ByVal sInp As String, _
                 Optional bDescending As Boolean = False) As String

    Dim asSS()  As String 
    Dim sSS     As String
    Dim n       As Long
    Dim i       As Long
    Dim j       As Long

    asSS = Split(sInp, ",")
    n = UBound(asSS)

 
    Dim TemporaryNumberArray() As Double

    For i = 0 To n
        If IsNumeric(Trim(asSS(i))) Then
            On Error Resume Next
            If IsError(UBound(TemporaryNumberArray)) Then
                ReDim TemporaryNumberArray(0 To 0)
            Else
                ReDim Preserve TemporaryNumberArray(0 To UBound(TemporaryNumberArray) + 1)
            End If
            On Error GoTo 0

            TemporaryNumberArray(UBound(TemporaryNumberArray)) = asSS(i)
        End If
     Next
 
    n = UBound(TemporaryNumberArray) 
    If n < 1 Then
        StrSort = sInp
    Else
        For i = 0 To n - 1
            For j = i + 1 To n
                If (TemporaryNumberArray(j) < TemporaryNumberArray(i)) Xor bDescending Then
                    sSS = TemporaryNumberArray(i)
                    TemporaryNumberArray(i) = TemporaryNumberArray(j)
                    TemporaryNumberArray(j) = sSS
                End If
            Next j
        Next i
 
        StrSort = CStr(TemporaryNumberArray(0))
        For i = 1 To n
            StrSort = StrSort & ", " & CStr(TemporaryNumberArray(i))
        Next
    End If
 
    If n < UBound(asSS) Then
        For i = 0 To UBound(asSS)
            If Not IsNumeric(asSS(i)) Then
                StrSort = StrSort & ", " & asSS(i)
            End If
        Next
    End If

End Function

先感謝您!

這對我有用。 您可以從工作表中調用SortList ,它會返回排序后的列表。

Function SortList(c) As String
    Dim arr, i
    
    arr = Split(c, ",")
    For i = LBound(arr) To UBound(arr) 'trim all array elements
        arr(i) = Trim(arr(i))
    Next i
    SortArray arr                'sort in-place
    SortList = Join(arr, ",")  'return sorted
End Function

'Sort an array in-place
Sub SortArray(list)
    Dim First As Long, Last As Long, i As Long, j As Long, tmp
    First = LBound(list)
    Last = UBound(list)
    For i = First To Last - 1
        For j = i + 1 To Last
            If DoCompare(Trim(list(i)), Trim(list(j))) Then 'compare the values
                tmp = list(j)             '...and in the original array
                list(j) = list(i)
                list(i) = tmp
            End If
        Next j
    Next i
End Sub

'Compare two values and return true if `a` is greater than `b`
'  (numeric values are sorted first)
Function DoCompare(a, b) As Boolean
    If IsNumeric(a) And IsNumeric(b) Then
        DoCompare = CDbl(a) > CDbl(b) 'two numbers
    ElseIf IsNumeric(a) Or IsNumeric(b) Then
        DoCompare = IsNumeric(b)      'one numeric, one alpha
    Else
        DoCompare = a > b             'two alphas
    End If
End Function

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM