我有一组多行字母数字值。例如
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