sorting - Excel VBA 按特定列对命名范围进行排序

标签 sorting excel vba

我有一个选定的范围,在该范围内,我想按特定列进行排序,以便每一行保持相同,即排序函数只是根据我选择的排序依据的列对整个行进行重新排序。

到目前为止我的代码是这样的:

Sub CustomSortAscendingExcel(ByVal control As IRibbonControl, ByRef cancelDefault As Variant)
Dim selRange As range
Dim usedRange As range
Dim checkRange As range
Dim shtData As Worksheet
Set shtData = Worksheets("Data")
shtData.Activate
shtData.Unprotect
Set selRange = Selection
Set usedRange = returnUsedRange
Set checkRange = Intersect(usedRange, selRange)
If Not Application.Intersect(usedRange, selRange) Is Nothing Then
With ActiveSheet
    usedRange.Sort Key1:=selRange, Order1:=xlAscending, DataOption1:=xlSortNormal, MatchCase:=False, SortMethod:=xlPinYin, _
    Header:=xlNo, Orientation:=xlSortColumns
    .Sort.Apply
End With

与降序排序类似。这对于第 1 列来说效果很好。我的问题是,对于第 2、3、4 列,它仅适用于那些在第 1 列中具有值的行,不适用于任何没有值的行。例如,在下图中,按第 3 列排序会正确重新排序前 9 行,但不会重新排序最后两行。

谁能提出解决这个问题的方法吗?谢谢!

enter image description here

最佳答案

我录制了一个简单的宏,它选择 Range("A1:D5") ,应用过滤器,然后根据第三列 (C) 按升序排序

看看这个:

Range("A1:D5").Select
    Selection.AutoFilter
    ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort.SortFields.Add Key:=Range _
        ("C1:C5"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").AutoFilter.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

现在,您无需做太多事情即可解决问题:)

关于sorting - Excel VBA 按特定列对命名范围进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16335684/

相关文章:

python - 无法打开在Python代码中创建的Excel文件

arrays - 如何将不确定的数组传递并循环给 VBA 中的函数?

c# - 根据层次结构在列表中搜索字符串

vba - 为什么不能捕获通过Application.Run调用例程时发生的错误?

vba - 声明工作表时无法使用工作表中的对象

java - 如何在 arraylist 中找到前 20 个最常用的单词

javascript - 计算数组中出现的次数并对它们进行排序

正则表达式从 VBA 中的字符串中提取数字

algorithm - 外部排序和内部排序有什么区别?

mysql - 根据表 B 的排序结果更新表 A 中的值 (MySQL)