Excel 从左到右排序多行
我有一个很大的excel文件,我正在尝试按行从左到右排序,一直在尝试使用vba方法,但我的经验太少。令人惊讶的是,做一件简单的事情有多么困难 我在另一篇文章中尝试了这段代码,但将它们混合在一起,只安排了第一行Excel 从左到右排序多行,excel,vba,sorting,excel-2010,quicksort,Excel,Vba,Sorting,Excel 2010,Quicksort,我有一个很大的excel文件,我正在尝试按行从左到右排序,一直在尝试使用vba方法,但我的经验太少。令人惊讶的是,做一件简单的事情有多么困难 我在另一篇文章中尝试了这段代码,但将它们混合在一起,只安排了第一行 Sub sortfile22() Dim keyrange As String Dim DataRange As String keyrange = "A1:T1" DataRange = "A1:T8" Range("A1").Select
Sub sortfile22()
Dim keyrange As String
Dim DataRange As String
keyrange = "A1:T1"
DataRange = "A1:T8"
Range("A1").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range(keyrange), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange Range(DataRange)
.Header = xlYes
.MatchCase = False
.Orientation = xlLeftToRight
.SortMethod = xlPinYin
.Apply
End With
End Sub
我的数据看起来像这样
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
48 1 16 40 75 21 50 3 35 73 80 53 33 46 38 2 69 54 63 79
54 27 62 56 79 67 71 75 28 35 78 66 60 65 5 47 31 38 68 21
56 77 43 9 64 80 72 16 17 46 10 22 63 34 41 8 53 60 6 79
您需要单独对每一行进行排序。因此,在DataRange中按行循环,并单独对每个DataRow进行排序
Option Explicit
Public Sub SortRowWise()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim DataRange As Range
Set DataRange = ws.Range("A1").CurrentRegion
Dim DataRow As Range
For Each DataRow In DataRange.Rows 'loop through all rows of the data
With ws.Sort
.SortFields.Clear
.SortFields.Add Key:=DataRow, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange Rng:=DataRow
.Header = xlNo
.MatchCase = False
.Orientation = xlLeftToRight
.SortMethod = xlPinYin
.Apply
End With
Next DataRow
End Sub
所以这个输入数据
…将分类为:
实际上比我预期的要难一些,但代码如下: 我还借用了,标准算法,, 承蒙 , 但您可以随意使用任何其他排序算法,只需确保更改这行代码: 快速排序sortrow,LBoundsortrow,UBoundsortrow'调用快速排序 然后按以下方式执行代码:
Private Sub main()
Dim i As Integer, lc As Long, lr as Long, j As Integer
Dim arr As Variant
lr = Cells(Rows.Count, 1).End(xlUp).Row ' finds the last row
lc = Cells(1, Columns.Count).End(xlToLeft).Column ' finds the last i-th column
arr = Range(Cells(1, 1), Cells(lr, lc)).Value2
Dim sortrow() As Integer ' sorting each row separately
For i = LBound(arr, 1) To UBound(arr, 1) ' for every row
For j = LBound(arr, 2) To UBound(arr, 2) ' add
ReDim Preserve sortrow(1 To j)
sortrow(j) = arr(i, j) ' adding arr elements to SortRow
Next j
Quicksort sortrow, LBound(sortrow), UBound(sortrow) ' calling QuickSort
For j = LBound(sortrow) To UBound(sortrow)
Cells(i, j) = sortrow(j) ' print the sorted results
Next j
Next i
End Sub
按预期工作:
略加修改的数组方法
为了艺术起见,我修改了@Rawrplus的有效快速解决方案,将三个循环减少为一个,并避免了永久性重拨
您可能会从阅读中受益。实际上,内置排序算法可以从左到右排序。Orientation=xlLeftToRight应该更快,因为它可以使用多线程,而VBA不能。实际上,因为内置函数应该总是比自编VBA代码快你们应该改成长Excel,因为它的行数比Integer所能处理的要多。我这里并不是在争论效率,只是一个替代选项。我花了很长时间才把它弄对,所以不妨把它贴出来。至于长,是的,你是对的,尽管我怀疑OP会超过整数范围,因为他的数据SAT,但为了正确起见,我编辑了它,你可以在快速排序后将循环重新编码为简单的一行:Cellsi,1.Resize1,UBoundsortrow=sortrow。顺便说一句,建议完全限定范围引用:-@Rawrplus`附加提示:此外,您甚至可以将sortrow声明替换为一次,将sortrow1作为整数重拨到lc,以避免永久重拨。@T.M.谢谢您的输入,我明天会研究它。
Option Explicit ' declaration head of code module
Private Sub Main()
With Sheet1 ' << reference sheet via code name, e.g. Sheet1
' [1] do some statistics over data range
Dim i&, lr&, lc& ' declare datatype Long
lr = .Cells(.Rows.Count, 1).End(xlUp).Row ' find last row
lc = .Cells(1, .Columns.Count).End(xlToLeft).Column ' find last column
' [2] assign data to array
Dim arr(), sortrow() ' declare Variant arrays
arr = .Range(.Cells(1, 1), .Cells(lr, lc)).Value2 ' assign range data to 1-based 2-dim datafield array
' [3] sort row data and write them back to sheet
For i = LBound(arr, 1) To UBound(arr, 1) ' loop through row data
sortrow = Application.Index(arr, i, 0) ' assign current row data to 1-dim sortrow array
Quicksort sortrow, LBound(sortrow), UBound(sortrow) ' calling QuickSort
.Cells(i, 1).Resize(1, UBound(sortrow)) = sortrow ' write sorted row data back to sheet
Next i
End With
End Sub