繁体   English   中英

在Excel VBA中从左到右对数据进行排序

[英]sort data left to right in excel vba

我想按列标题按字母顺序对完整的图纸数据进行排序。 下面的代码工作正常,但我每次都必须在变量(键范围和数据范围)中手动输入数据范围,因为每个文件中的列数/行数都不同。 我在下面的代码中尝试了不同的方法。 您能建议吗?有没有一种方法可以自动选择最后一列,如W下方,则最后一列是文件中的数据,并且代码应选择最后一列。 同样,列的最后一行也应该进入范围内(例如485是下面代码中文件的最后一行),这可能吗?

 Sub sortfile2()
   Dim keyrange As String
    Dim DataRange As String

    keyrange = "A1:W1"
    DataRange = "A1:W485"

    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

如果源rane是动态的,则可以使用

bottom= Range("A1").End(xlDown).Row
Set DataRange = Range("A1").CurrentRegion.Resize(bottom - 1).Offset(1)

请注意,CurrentRegion本身还不够。 您应该将其与“调整大小”和“偏移”结合使用。 如果仅尝试使用CurrentRegion并使用F8,则可以了解原因。

是的,可以确定最后一列和最后一行。

如果要确定第一( 1 )行中的最后一列,请使用以下代码:

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

如果要获取第一列的最后一行,请使用以下命令:

Cells(Rows.Count, 1).End(xlUp).Row

这是第一列/行,因此您可以根据需要进行更改。

这是数据范围。

Sub test()
    Dim rngDB As Range
    Dim Ws As Worksheet
    Dim r As Long, c As Long

    Set Ws = ActiveSheet

    With Ws
        r = .Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
        c = .Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
        Set rngDB = .Range("a1", .Cells(r, c))
        rngDB.Select
    End With
End Sub

要么

range("a1").CurrentRegion

是的,Michal的答案和其他来源帮助找到了所需的确切输出

    'Find the last non-blank cell in row 1
        lCol = Cells(1, Columns.Count).End(xlToLeft).Column
           d = Replace(Cells(1, lCol).Address(True, False), "$1", "")

        'Find the last non-blank cell in column 1
        lRow = Cells(rows.Count, 1).End(xlUp).row
        keyrange = "A1:" & d & 1
        DataRange = "A1:" & d & lRow
'below line is to print (for debugging) the calculated range
   MsgBox (keyrange)
   MsgBox (DataRange)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM