Excel 2013:使用VBA基于第一行值对列进行sorting

我想实现一个Excelmacros,将列“C”中的所有列sorting到包含数据的最后一列(列A和B不受影响)。

根据它们的第一行(这是一个string)的单元格值,列应该从A-> Zsorting。

到目前为止,我想出了下面的代码,我不喜欢那么多,因为它包含了sorting范围的硬编码数字,使代码不是很健壮。

Sub SortAllColumns() Application.ScreenUpdating = False 'Sort columns With ActiveWorkbook.Worksheets("mySheet").Sort .SetRange Range("C1:ZZ1000") .Header = xlYes .MatchCase = False .Orientation = xlLeftToRight .Apply End With Application.ScreenUpdating = True End Sub 

search互联网,可能会发现很多build议获取最后使用的列或行。 然而,他们中的大多数将炸毁代码超过我的预期。

我不是一个VBA专家,如果有人能够以一种优雅而有效的方式来解决这个问题,这将是一件好事。

如果这是重要的:我们绝对不会有更多的1000行和1000列。

任何build议是高度赞赏。

编辑:

  • 改变临时表添加声明,使其始终作为最后一个
  • 相应地修改了删除声明

如果您需要通过移动列来对列进行sorting,以便从左到右排列标题,然后尝试使用此代码

 Option Explicit Sub main() Dim lastCol As Long With Sheets("mySheet") lastCol = .cells(1, .Columns.Count).End(xlToLeft).Column Call OrderColumns(Range(.Columns(3), Columns(lastCol))) End With End Sub Sub OrderColumns(columnsRng As Range) Dim LastRow As Long With columnsRng LastRow = GetColumnsLastRow(columnsRng) With .Resize(LastRow) .Copy With Worksheets.Add(after:=Worksheets(Worksheets.Count)).cells(1, 1).Resize(.Columns.Count, .Rows.Count) 'this will add a "helper" sheet: it'll be removed .PasteSpecial Paste:=xlPasteAll, Transpose:=True .Sort key1:=.Columns(1), Order1:=xlAscending, Orientation:=xlTopToBottom, Header:=xlNo .Copy End With .PasteSpecial Paste:=xlPasteAll, Transpose:=True Application.DisplayAlerts = False: Worksheets(Worksheets.Count).Delete: Application.DisplayAlerts = True 'remove the "helper" sheet (it's the (n-1)th sheet) End With End With End Sub Function GetColumnsLastRow(rng As Range) As Long Dim i As Long 'gets last row of the given columns range GetColumnsLastRow = -1 With rng For i = 1 To .Columns.Count GetColumnsLastRow = WorksheetFunction.Max(GetColumnsLastRow, .Parent.cells(.Parent.Rows.Count, .Columns(i).Column).End(xlUp).row) Next i End With End Function 

它临时使用“助手”(最后被删除)表单。

感谢@SiddharthRout的build议和修订,我得到了这个:

 Sub SortAllColumns() Application.ScreenUpdating = False Dim ws As Worksheet Dim LastRow As Long Dim LastColumn As Long Dim LastColumnLetter As String Set ws = ThisWorkbook.Sheets("mySheet") 'Get range With ws LastRow = .Range("A" & .Rows.Count).End(xlUp).Row LastColumn = .Cells(1, .Columns.Count).End(xlToLeft).Column LastColumnLetter = Split(.Cells(, LastColumn).Address, "$")(1) 'Sort columns Range("C1:" & LastColumnLetter & LastRow).Select .Sort.SortFields.Clear .Sort.SortFields.Add Key:=Range("C1:" & LastColumnLetter & 1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With .Sort .SetRange ws.Range("C1:" & LastColumnLetter & LastRow) .Header = xlYes .MatchCase = False .Orientation = xlLeftToRight .Apply End With End With Application.ScreenUpdating = True End Sub