Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.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_Sorting_Excel 2010_Quicksort - Fatal编程技术网

Excel 从左到右排序多行

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

我有一个很大的excel文件,我正在尝试按行从左到右排序,一直在尝试使用vba方法,但我的经验太少。令人惊讶的是,做一件简单的事情有多么困难

我在另一篇文章中尝试了这段代码,但将它们混合在一起,只安排了第一行

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