vba - Excel VBA 如何对单行范围进行排序

标签 vba excel

我有一个范围定义为

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 将会按降序对范围进行排序。

enter image description here

仅限 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/

相关文章:

vba - .Findnext 不尊重范围集

arrays - EXCEL 公式返回不同日期范围(在 ROW 中)和不同产品(在 COLUMN 中)的 SUM

excel - 在 Excel VBA 中看不到下拉列表

excel - 如何在 vba 中引用名称不同的工作表名称

excel - 如何根据不同单元格中的特定条目向单元格添加自定义文本?

mysql - 使用 Excel 进行数据转换

Excel VBA ActiveWindow.Visible 隐藏错误的工作簿

excel - 如何让我的 VBA 项目引用 OneDrive 上的 Excel 工作簿以使用本地驱动器路径而不是 OneDrve URL 路径?

vba - 使用对象浏览器中未列出的对象属性

excel - 如何从一列数据中过滤对称词?