excel:我如何在一个单元格内排序?

时间:2010-08-03 18:56:07

标签: excel

我有一个用逗号分隔的字符串,是否可以使用excel公式在单元格内的值内进行排序?

3 个答案:

答案 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获得,所以你可以尝试一下。

相关问题