[英]Excel UDF - sort numbers and text separated by comma within a cell
[英]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.