我有一个用逗号分隔的字符串,是否可以使用excel公式在单元格内的值内进行排序?
答案 0 :(得分:6)
这是一个解决方案(从here窃取的快速排序代码)。您只需将按钮连接到SortVals
宏,您只需单击该按钮即可对活动单元格中的逗号分隔值进行排序。
Option Explicit
Public Sub SortVals()
Dim i As Integer
Dim arr As Variant
arr = Split(ActiveCell.Text, ",")
' trim values so sort will work properly
For i = LBound(arr) To UBound(arr)
arr(i) = Trim(arr(i))
Next i
' sort
QuickSort arr, LBound(arr), UBound(arr)
' load sorted values back to cell
Dim comma As String
comma = ""
ActiveCell = ""
For i = LBound(arr) To UBound(arr)
ActiveCell = ActiveCell & comma & CStr(arr(i))
comma = ","
Next i
End Sub
Public Sub QuickSort(vArray As Variant, inLow As Long, inHi As Long)
Dim pivot As Variant
Dim tmpSwap As Variant
Dim tmpLow As Long
Dim tmpHi As Long
tmpLow = inLow
tmpHi = inHi
pivot = vArray((inLow + inHi) \ 2)
While (tmpLow <= tmpHi)
While (vArray(tmpLow) < pivot And tmpLow < inHi)
tmpLow = tmpLow + 1
Wend
While (pivot < vArray(tmpHi) And tmpHi > inLow)
tmpHi = tmpHi - 1
Wend
If (tmpLow <= tmpHi) Then
tmpSwap = vArray(tmpLow)
vArray(tmpLow) = vArray(tmpHi)
vArray(tmpHi) = tmpSwap
tmpLow = tmpLow + 1
tmpHi = tmpHi - 1
End If
Wend
If (inLow < tmpHi) Then QuickSort vArray, inLow, tmpHi
If (tmpLow < inHi) Then QuickSort vArray, tmpLow, inHi
End Sub
答案 1 :(得分:2)
您必须拆分字符串,对值进行排序并从排序值中创建新字符串。
答案 2 :(得分:1)
当被问到这个问题时,我的LAselect框架插件无法向公众开放。但现在它是,它以优雅的方式解决了这些问题。
您只需在VBA中提供几行“解决方案”代码即可对您想要的任何内容进行排序或排序。
要获得以逗号分隔的值,请使用VBA的Split()函数。然后,您将拥有与您的单元格一样多的单独值;如果splitvalues(1)是firstname而splitvalues(0)是lastname,则Add-in可以对您的单个单元格进行排序:
Dim splitvalues1 as Variant, splitvalues2 as Variant
While LAselect(ControlSignal, BreakOutBox)
valcol = BreakOutBox.Pins.ColData
splitvalues1 = Split(BreakOutBox.Data.VBArray(BreakOutBox.Pins.RowSource, valcol), ",")
splitvalues2 = Split(BreakOutBox.Data.VBArray(BreakOutBox.Pins.RowDestin, valcol), ",")
If splitvalues1(0) > splitvalues2(0) Then
ControlSignal = LA_ISLARGER
ElseIf splitvalues1(0) < splitvalues2(0) Then
ControlSignal = LA_ISSMALLER
Else
ControlSignal = LA_ISEQUAL
End If
Wend
在LA_ISEQUAL,您必须测试splitvalues1(1)等,以进一步对名字上的重复姓氏进行排序。
你是否清楚地知道,对于我的插件来说,真正无关紧要的是你挤入一个单元格中有多少分隔符分隔的字段,甚至是你要包含在决策中的其他单元格?这两个完整的记录都会传递给您的“解决方案”代码,您可以完全自由地选择要排序的属性。
我的演示可以从www.liquorice-allsorts.com获得,所以你可以尝试一下。