Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting Excel VBA按特定列对命名范围进行排序_Sorting_Excel_Vba - Fatal编程技术网

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

Sorting Excel VBA按特定列对命名范围进行排序,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 A

我有一个选定的范围,在该范围内,我希望按特定列进行排序,以使每一行保持不变,即排序函数仅根据我选择的排序列对整行重新排序

到目前为止,我的代码是:

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
和降序排序类似。这对column1很有效。我的问题是,对于第2、3、4列,它只对在第1列中有值的行有效,而对没有值的行无效。例如,在下面的图像中,按第3列排序可以正确地对前9行进行重新排序,但不能对最后两行进行重新排序

有人能提出一个解决这个问题的方法吗?谢谢


我录制了一个简单的宏,它选择范围(“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

现在,您不需要做很多事情来解决您的问题:)

我录制了一个简单的宏,它选择范围(“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

现在,您不需要做很多事情来解决您的问题:)

代码中的哪个区域指的是
usedRange
?这里的usedRange指的是整个表(A:2,D:11),selRange指的是我选择排序的列by@mehow这个主意是解决这个问题的好办法+下面是1。代码中的哪个区域指的是
usedRange
?这里的usedRange指的是整个表(A:2,D:11),selRange指的是我选择排序的列by@mehow这个主意是解决这个问题的好办法+请解释一下自动过滤线在做什么?谢谢,我在第三行有“下标超出范围错误”吗?我还不确定过滤功能是什么,因为它没有隐藏任何东西-如果我在这里速度异常慢,请原谅!debug.print并检查高亮显示的黄色行的值。鼠标移到上面,看看你为什么超出范围。应用“自动筛选”可以按标题条件进行排序。它还有一个隐藏(过滤)行的附加功能,但根据您的问题,这不是您需要的。事实证明,我的原始代码是有效的-问题在于我如何计算usedRange中最后使用的行。我真的很抱歉浪费了您的时间,并感谢您的帮助-由于此解决方案也有效,我将标记为已解决。请您解释一下自动过滤线在做什么?谢谢,我在第三行有“下标超出范围错误”吗?我还不确定过滤功能是什么,因为它没有隐藏任何东西-如果我在这里速度异常慢,请原谅!debug.print并检查高亮显示的黄色行的值。鼠标移到上面,看看你为什么超出范围。应用“自动筛选”可以按标题条件进行排序。它还有一个隐藏(过滤)行的附加功能,但根据您的问题,这不是您需要的。事实证明,我的原始代码是有效的-问题在于我如何计算usedRange中最后使用的行。我真的很抱歉浪费了您的时间,并感谢您的帮助-由于此解决方案也有效,我将标记它已解决