我有一个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'。
我从示例中遗漏了一些其他列(电子邮件,登录等) 一个宏是理想的但我可以手动操作数据,如果我能弄清楚如何做到这一点!欢迎所有建议!
答案 0 :(得分:1)
我使用Range.Sort method与xlTopToBottom和xlLeftToRight方向相结合的组合获得了最佳结果。
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
通过颠倒For ... Next个陈述中的一个或两个的顺序,可以获得略微不同的结果。
答案 1 :(得分:1)
计算最后一行,我使用了COUNTA():
=COUNTA(B2:B5)
然后对Horizonatally数据进行排序。
只选择跳过第一列的数据和标题,然后点击数据标签上的排序按钮:
然后选择选项并选择Sort left to right
。
然后选择包含计数的行和订单到Largest to Smallest
:
然后按确定
答案 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)