Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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
Excel 如何根据每行中的非空单元格对区域进行排序?_Excel_Vba_Excel Formula - Fatal编程技术网

Excel 如何根据每行中的非空单元格对区域进行排序?

Excel 如何根据每行中的非空单元格对区域进行排序?,excel,vba,excel-formula,Excel,Vba,Excel Formula,如图所示,非空单元格数最多的区域中的行将移到顶部位置。以下代码将按照您的解释进行排序 Sub SortByCountA() ' 136 Dim Ws As Worksheet Dim Rng As Range Dim C As Long ' helper column Set Ws = Worksheets(1) ' change to suit


如图所示,非空单元格数最多的区域中的行将移到顶部位置。

以下代码将按照您的解释进行排序

Sub SortByCountA()
    ' 136
    
    Dim Ws      As Worksheet
    Dim Rng     As Range
    Dim C       As Long                 ' helper column
    
    Set Ws = Worksheets(1)              ' change to suit
    With Ws.UsedRange
        C = .Columns.Count + 1
        Set Rng = .Resize(, C)
    End With
    
    Application.ScreenUpdating = False
    With Rng
        .Cells(.Row, C).FormulaR1C1 = "=COUNTA(RC[" & (1 - C) & "]:RC[-1])"
        .Columns(C).FillDown
    End With
        
    With Ws.Sort
        With .SortFields
            .Clear
            .Add2 Key:=Ws.Cells(Rng.Row, C), _
                  SortOn:=xlSortOnValues, _
                  Order:=xlDescending, _
                  DataOption:=xlSortNormal
        End With
        .SetRange Rng
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    Ws.Columns(C).EntireColumn.Delete
    Application.ScreenUpdating = True
End Sub

此任务的难点在于定义需要排序的范围。以上代码对整个
UsedRange
进行排序。它不会遇到任何表,它希望从A列开始。Sort.Header的
属性设置为xlNo。一个简单的修改是将其设置为xlYes。如果您有一个更难的范围,那么一旦定义了该范围,就可以调整上述代码来处理该范围。

下面的代码将按照您解释的方式进行排序

Sub SortByCountA()
    ' 136
    
    Dim Ws      As Worksheet
    Dim Rng     As Range
    Dim C       As Long                 ' helper column
    
    Set Ws = Worksheets(1)              ' change to suit
    With Ws.UsedRange
        C = .Columns.Count + 1
        Set Rng = .Resize(, C)
    End With
    
    Application.ScreenUpdating = False
    With Rng
        .Cells(.Row, C).FormulaR1C1 = "=COUNTA(RC[" & (1 - C) & "]:RC[-1])"
        .Columns(C).FillDown
    End With
        
    With Ws.Sort
        With .SortFields
            .Clear
            .Add2 Key:=Ws.Cells(Rng.Row, C), _
                  SortOn:=xlSortOnValues, _
                  Order:=xlDescending, _
                  DataOption:=xlSortNormal
        End With
        .SetRange Rng
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    Ws.Columns(C).EntireColumn.Delete
    Application.ScreenUpdating = True
End Sub

此任务的难点在于定义需要排序的范围。以上代码对整个
UsedRange
进行排序。它不会遇到任何表,它希望从A列开始。Sort.Header的
属性设置为xlNo。一个简单的修改是将其设置为xlYes。如果您有一个更困难的范围,那么一旦定义了该范围,就不难调整上述代码以使用该范围。

在输出表
E2
中,公式被复制到以下位置:

=IFERROR(1/(1/INDEX(A$2:A$5,MATCH(IFERROR(AGGREGATE(15,6,$A$2:$A$5/($B$2:$B$5<>""),ROW(A1)),AGGREGATE(15,6,$A$2:$A$5/($B$2:$B$5=""),COUNT($A$2:$A$5)-COUNT(E$1:E1))),$A$2:$A$5,0))),"")
=IFERROR(1/(1/索引(A$2:A$5,匹配)(IFERROR(聚合(15,6,$A$2:$A$5/($B$2:$B$5)”),行(A1)),聚合(15,6,$A$2:$A$5/($B$2:$B$5=“”),计数(A$2:$A$5)-计数(E$1:E1)),$A$2:$A$A$5,0)),“)

在输出表
E2
中,跨下复制公式:

=IFERROR(1/(1/INDEX(A$2:A$5,MATCH(IFERROR(AGGREGATE(15,6,$A$2:$A$5/($B$2:$B$5<>""),ROW(A1)),AGGREGATE(15,6,$A$2:$A$5/($B$2:$B$5=""),COUNT($A$2:$A$5)-COUNT(E$1:E1))),$A$2:$A$5,0))),"")
=IFERROR(1/(1/索引(A$2:A$5,匹配)(IFERROR(聚合(15,6,$A$2:$A$5/($B$2:$B$5)”),行(A1)),聚合(15,6,$A$2:$A$5/($B$2:$B$5=“”),计数(A$2:$A$5)-计数(E$1:E1)),$A$2:$A$A$5,0)),“)
=SORT(排序)(排序(A1:C4;1;1;2;1);3;1)
在office 365中,您可以使用排序对排序。它先按A列排序,然后按B列排序,再按C列排序

=SORT(排序)(排序(A1:C4;1;1;2;1);3;1)
在office 365中,您可以使用排序对排序。它先按A列排序,然后按B列排序,再按C列排序


你能解释一下公式吗?@p.b,逻辑是按列表A的条件排序的,如果列表b有数据,否则按列表b没有数据的条件排序。你能解释一下公式吗?@p.b,逻辑是按列表A的条件排序的,如果列表b有数据,否则按列表b没有数据的条件排序的。