Excel 公式对行进行排序并返回相邻单元格中的排序值

Excel 公式对行进行排序并返回相邻单元格中的排序值

我有一组多行字母数字值。例如

 a1          b1        c2     
 b1          a2        d3     
 c1          a2        d3     

我想将第 1 行、第 2 行和第 3 行的值分别排序到相邻的单元格中。例如

 a1          b1        c2     =>       a1          b1        c2       
 b1          a2        d3     =>       a2          b1        d3
 c1          a2        d3     =>       a2          c1        d3

我可以对两行进行操作,但如果超过两行,就会变得复杂。

答案1

使用 VBA 和用户定义函数相对容易。由于只有少数项目需要排序,我使用了简单的 BubbleSort。也可以使用其他方法。

要输入此用户定义函数 (UDF),alt-F11请打开 Visual Basic 编辑器。确保您的项目在 Project Explorer 窗口中突出显示。然后,从顶部菜单中选择插入/模块,并将下面的代码粘贴到打开的窗口中。

要使用此用户定义函数 (UDF),请输入如下公式

=sortAlpha(A1:C1)

在延伸到目的地的单元格范围内(例如:E1:G1)然后向下填充。

这是一数组公式并将返回一个值数组。因此,要输入它,您需要:

  • 首先选择E1:G1
  • 然后将光标放在公式栏中并输入公式
  • 最后,不要只点击,还必须在点击 的同时enter按住。如果你操作正确,Excel 会将括号放在 ctrl + shiftenter{...}围绕公式

Option Explicit

'Comment out next line for case sensitive sorting
Option Compare Text

Function sortAlpha(rg As Range) As String()
    Dim S() As String
    Dim C As Range
    Dim I As Long

ReDim S(0 To rg.Count - 1)
For Each C In rg
    S(I) = C.Text
    I = I + 1
Next C

SingleBubbleSort S

sortAlpha = S

End Function
Sub SingleBubbleSort(TempArray As Variant)
'copied directly from support.microsoft.com
    Dim Temp As Variant
    Dim I As Integer
    Dim NoExchanges As Integer

    ' Loop until no more "exchanges" are made.
    Do
        NoExchanges = True

        ' Loop through each element in the array.
        For I = LBound(TempArray) To UBound(TempArray) - 1

            ' If the element is greater than the element
            ' following it, exchange the two elements.
            If TempArray(I) > TempArray(I + 1) Then
                NoExchanges = False
                Temp = TempArray(I)
                TempArray(I) = TempArray(I + 1)
                TempArray(I + 1) = Temp
            End If
        Next I
    Loop While Not (NoExchanges)
End Sub

在此处输入图片描述

相关内容