有没有办法使用Excel和VBA对非空白连续单元格(即任意选择的范围)进行排序?

Is there a way to sort a selection of non blank contiguous cells (i.e. an arbitrarily selected range) using Excel & VBA?

提问人:Christopher Costabile 提问时间:11/17/2023 最后编辑:braXChristopher Costabile 更新时间:11/18/2023 访问量:96

问:

我的Excel文档被用作金属熔化文档。它用于混合各种合金。在制作熔体时,我们将选择行并为行着色,以指示选择熔体的材料。我有 5 个工作按钮,这是我们在任何时候都可以打开的熔体限制。我还有一个排序按钮和一个空白按钮,用于在处理金属后从单元格中删除颜色。消隐按钮还将从突出显示的单元格中删除数据。

我的问题在于,我可以使用 Excel 的自定义排序功能进行排序,但是,它从用户那里获取输入并将其应用于定义的范围。当用户选择下一组范围时,这些输入将被删除。

我的排序函数旨在首先按单元格颜色按黄色、蓝色、绿色、紫色和深蓝色的顺序排序,然后对标识列单元格值进行排序。目前,我的排序按钮适用于单列。我希望行中的数据随标识列一起移动。

所有文档的 VBA 脚本都位于一个模块中,附在下面。

New_macro() - New_macro6() 用于着色单元格,6 用于着色 None 和清除单元格。

excel文档的图片。 Picture of excel document.

ColourSort() 是不起作用的排序函数 - 错误在这里 - Enter image here

我不想对列的整个长度进行排序,因为底部有一个计数行......

Sub New_macro()

        Dim myRange As Range
        Set myRange = Selection

     Selection.Interior.Color = RGB(255, 192, 0)
 
    End Sub
    Sub New_macro2()

        Dim myRange As Range
        Set myRange = Selection

     Selection.Interior.Color = RGB(0, 176, 240)
 
    End Sub
    Sub New_macro3()

        Dim myRange As Range
        Set myRange = Selection

      Selection.Interior.Color = RGB(146, 208, 80)
 
    End Sub
    Sub New_macro4()

        Dim myRange As Range
        Set myRange = Selection

     Selection.Interior.Color = RGB(122, 48, 160)
 
    End Sub
    Sub New_macro5()

        Dim myRange As Range
        Set myRange = Selection

     Selection.Interior.Color = RGB(0, 112, 192)
 
    End Sub
    Sub New_macro6()

    Dim myRange As Range
         Set myRange = Selection

     Selection.Interior.ColorIndex = xlNone
     Selection.Clear
 
    End Sub
    Sub ColourSort()

    Dim myRange As Range
    Set myRange = Selection

    myRange.Select
        ActiveWorkbook.ActiveSheet.Sort.SortFields.Clear
        ActiveWorkbook.ActiveSheet.Sort.SortFields.Add(Selection, _
            xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255, _
            192, 0)
        ActiveWorkbook.ActiveSheet.Sort.SortFields.Add(Selection, _
            xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(0, 176 _
            , 240)
        ActiveWorkbook.ActiveSheet.Sort.SortFields.Add(Selection, _
            xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(146, _
            208, 80)
        ActiveWorkbook.ActiveSheet.Sort.SortFields.Add(Selection, _
            xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(122, 48 _
            , 160)
        ActiveWorkbook.ActiveSheet.Sort.SortFields.Add(Selection, _
            xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(0, 112 _
            , 192)
        ActiveWorkbook.ActiveSheet.Sort.SortFields.Add2 Key:=Selection() _
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With ActiveWorkbook.ActiveSheet.Sort
                .SetRange Selection
                .Header = xlGuess
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
            End With
        End Sub
Excel VBA 排序

评论

0赞 Black cat 11/17/2023
您是否对使用 Excel2010 感到满意?
0赞 Christopher Costabile 11/17/2023
它可能是 excel2016...你为什么问?
0赞 Black cat 11/17/2023
Add2 方法在 E2010 中不可用
0赞 Christopher Costabile 11/17/2023
很公平。我会仔细检查文档,如果不是,我会修改标签 - 谢谢你的突出显示
0赞 Christopher Costabile 11/17/2023
我正在运行 Excel365

答:

1赞 Themes Kreen Stone 11/17/2023 #1

我认为用 .我认为 your 的键应该表示数据排序的单个列。SortFields.Add(Selection, ...)SortFields.Add

例如:

        ActiveWorkbook.ActiveSheet.Sort.SortFields.Add2 Key:=Selection() _
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

应该说更像

        ActiveWorkbook.ActiveSheet.Sort.SortFields.Add2 Key:=Range("A3:A13") _
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

评论

0赞 Christopher Costabile 11/17/2023
我必须说,首先,对大多数人来说,“啊,嘎嘎”。不过,严肃地说,您已经明确引用了这些单元格。如果我有一个更长的数据集,那么我无法对其进行排序。它只会对这些单元格进行排序 Range(“A1:A13”)。我希望范围引用所选的单元格(即单击移位)。我想过利用选择值的字符串(即单元格的字符串),并将其作为串联插入代码中,但这不起作用
0赞 Christopher Costabile 11/21/2023 #2

我已经弄清楚出了什么问题。
初始宏:

Range("A3:C12").Select
ActiveWorkbook.ActiveSheet.Sort.SortFields.Clear
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add(Range("A3:A12"), _
    xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(255, _
    192, 0)
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add(Range("A3:A12"), _
    xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(0, 176 _
    , 240)
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add(Range("A3:A12"), _
    xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(146, _
    208, 80)
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add(Range("A3:A12"), _
    xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(122, 48 _
    , 160)
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add(Range("A3:A12"), _
    xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(0, 112 _
    , 192)
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add2 Key:=Range("A3:A12") _
    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.ActiveSheet.Sort
    .SetRange Range("A3:C12")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply

可以看出,开头的范围是“A3:C12”。用于排序的范围仅引用 A 列,即“A3:A12”。因此,如果我们用 myRange.Columns(1) 替换 Selection,我的代码将起作用,这就是我所做的,它起作用了。这是有道理的,因为一个人只对一列进行排序,因此只需要第 1 列,我的代码试图按所有列对行进行排序,从而产生错误。