根据填充的cels数量,将Excel列排在左侧

时间:2016-07-07 21:32:42

标签: excel excel-vba sorting vba

我有一个Excel2013工作表,其中包括侧面的用户名,AD安全组的名称,他们每个都是顶部的成员,如果用户在组中,则在cel中为“X”。像这样:

           AllUsers ITgroup DistroList Admins
Jason       X       X       X
Srinivas    X               X          X
Mary        X       X       X          X
Tyler       X       X       X

我想根据该组中的用户数量从左到右对列进行排序,因此结果如下所示:

           AllUsers DistroList  ITgroup     Admins
Jason       X       X           X
Srinivas    X       X                       X
Mary        X       X           X           X
Tyler       X       X           X

(请注意" ITgroup"和#34; DistroList"已切换位置,因为DistroList中有更多用户。)

我没有空列,因为它们已被删除(以及它们的列标题);有几百列,但每个列中至少有一个'X'。

我从示例中遗漏了一些其他列(电子邮件,登录等) 一个宏是理想的但我可以手动操作数据,如果我能弄清楚如何做到这一点!欢迎所有建议!

4 个答案:

答案 0 :(得分:1)

我使用Range.Sort method与xlTopToBottom和xlLeftToRight方向相结合的组合获得了最佳结果。

reorderLeftToRight
reorderLeftToRight sub之前的样本数据

Sub reorderLeftToRight()
    Dim r As Long, c As Long
    With Worksheets("Sheet16")
        With .Cells(1, 1).CurrentRegion
            For c = 2 To .Columns.Count
                .Cells.Sort Key1:=.Columns(c), Order1:=xlAscending, _
                            Orientation:=xlTopToBottom, Header:=xlYes
            Next c
            For r = 2 To .Rows.Count
                .Cells.Sort Key1:=.Rows(r), Order1:=xlAscending, _
                            Orientation:=xlLeftToRight, Header:=xlYes
            Next r
        End With
    End With
End Sub

reorderLeftToRight_after
reorderLeftToRight sub后的样本数据

通过颠倒For ... Next个陈述中的一个或两个的顺序,可以获得略微不同的结果。

答案 1 :(得分:1)

计算最后一行,我使用了COUNTA():

=COUNTA(B2:B5)

然后对Horizo​​natally数据进行排序。

只选择跳过第一列的数据和标题,然后点击数据标签上的排序按钮:

enter image description here

然后选择选项并选择Sort left to right

然后选择包含计数的行和订单Largest to Smallest

enter image description here

然后按确定

enter image description here

答案 2 :(得分:1)

选择我,接我......哈哈。

这对我来说听起来像是一个基本的冒泡。所以这就是:

Sub BubbleSortColumns()
    Application.ScreenUpdating = False
    Dim lastColumn As Long, lLeft As Long, lRight As Long

    lastColumn = Cells(1, Columns.Count).End(xlToLeft).Column

    For lRight = 2 To lastColumn
        For lLeft = lRight + 1 To lastColumn
            If WorksheetFunction.CountA(Columns(lLeft)) > WorksheetFunction.CountA(Columns(lRight)) Then
                Columns(lLeft).Cut
                Columns(lRight).Insert Shift:=xlToRight

            End If
        Next
    Next

    Application.CutCopyMode = False
    Application.ScreenUpdating = True
End Sub

答案 3 :(得分:0)

如果列/行集相对较小,这是一个方法:

enter image description here

  1. 范围B9:F13:{=TRANSPOSE(A1:E5)}(数组公式Ctrl+Shift+Enter
  2. 范围A10:=COUNTIF(C10:F10,"X")
  3. 范围A11:=IF(ISERROR(MATCH(COUNTIF(C11:F11,"X"),$A$10:A10,0)),COUNTIF(C11:F11,"X"),COUNTIF(C11:F11,"X")+0.1)(打破关系),向下拖动
  4. 将范围A9:F13至A16复制为值并在Count
  5. 上排序
  6. 范围A23:{=TRANSPOSE(B16:F20)}
  7. 复制|粘贴值并从单元格中删除0。