我有一个范围定义为
Set myRange=Range("$E$10,$G$10,$I$10")
这些单元格中的值为-1、-1.2、1 当我迭代范围时,我得到打印的值 顺序为-1, -1.2, 1
我想对这个范围进行排序,以便当我迭代该范围时 我会看见: -1.2, -1, 1
我不想在实际工作表中重新组织这些单元格。
我基本上是在尝试模仿普通编程语言中的排序功能,但对于 Excel 范围,我希望“单元格”在范围数据结构内重新排列
我尝试过天真的
myRange.Sort key1:=myRange.Item(1, 1), order1:=xlAscending, Header:=xlNo
但它没有做任何事情
最佳答案
Excel 不会对不连续的范围进行排序。
但是通过使用ArrayList
对值进行排序,可以很容易地按顺序获取范围值。使用 SortAnyRange
并将其 Desc
参数设置为 true 将会按降序对范围进行排序。
仅限 Windows
Sub TestSortAnyRange()
SortAnyRange Range("$E$10,$G$10,$I$10")
End Sub
Sub SortAnyRange(Target As Range, Optional Desc As Boolean)
Dim r As Range
Dim list As Object
Set list = CreateObject("System.Collections.ArrayList")
For Each r In Target
list.Add r.Value
Next
list.Sort
If Desc Then list.Reverse
For Each r In Target
r.Value = list(0)
list.Remove list(0)
Next
End Sub
<小时/>
MAC 或 WINDOWS
OP 请求一个可以在 Mac 或 Windows 平台上运行的子例程。因此,我重构了代码,用数组和 BubbleSort 例程替换了 ArrayList(在 Mac 上不可用)。
Sub SortAnyRange(Target As Range, Optional Desc As Boolean)
Dim r As Range
Dim list
Dim i As Long, j As Long
ReDim list(0 To Target.Cells.Count - 1)
For Each r In Target
list(i) = r.Value
i = i + 1
Next
For i = LBound(list) To UBound(list)
For j = i + 1 To UBound(list)
If list(i) > list(j) Then
SrtTemp = list(j)
list(j) = list(i)
list(i) = SrtTemp
End If
Next j
Next i
i = IIf(Desc, UBound(list), 0)
For Each r In Target
r.Value = list(i)
i = i + IIf(Desc, -1, 1)
Next
End Sub
关于vba - Excel VBA 如何对单行范围进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40570959/