在Excel VBA中,按升序对列中类似单元格值之间的行范围进行排序

在Excel VBA中,按升序对列中类似单元格值之间的行范围进行排序,excel,vba,Excel,Vba,因为我不熟悉编写宏。我需要帮助编写一个宏,在单元格值TLA之间对一系列行进行排序。以下是一个例子: Column A TLA 23 6 32 TLA TLA 5 21 16 40 TLA 我试图修改从这个论坛浏览的宏。但是,我无法选择行。任何指点或帮助都会对我有很大帮助。 VB: 你的构造看起来很奇怪: r =Range("A"& ActiveSheet.Rows.Count).End(xlUp).Row Fo

因为我不熟悉编写宏。我需要帮助编写一个宏,在单元格值TLA之间对一系列行进行排序。以下是一个例子:

Column A   
  TLA  
   23
    6
   32
  TLA
  TLA
    5
   21
   16
   40
  TLA
我试图修改从这个论坛浏览的宏。但是,我无法选择行。任何指点或帮助都会对我有很大帮助。 VB:


你的构造看起来很奇怪:

r =Range("A"& ActiveSheet.Rows.Count).End(xlUp).Row  
For r = r To 2 Step -1 
我认为如果你让计数器自上而下运行会更加透明,具体的原因是什么? 尽可能长地使用另一个计数器,如lCnt。 希望它能在路上帮助你

使用不同的设置范围,例如

set oRange = thisworkbook.sheets("<Name>").usedrange    'Declare oRange as excel.range
for each oRow in oRange.rows   
    lCnt = lCnt + 1
    select case oRow.cells(lcnt, 1)
        case "TLA" 
        oRow.select 
        'etc... 
    end select
next oRange 

我看不出你的代码有什么问题,只是你没有对值进行排序。 就选择而言,如果调试代码并逐步运行,您将看到行确实被选中

下面将按升序对TLA之间的所有值进行排序

Function a()
    Dim r, r2 As Long

    r2 = 0

    Application.ScreenUpdating = False
    ActiveSheet.DisplayPageBreaks = False
    r = Range("A" & ActiveSheet.Rows.Count).End(xlUp).Row
    For r = r To 1 Step -1

        If (Cells(r, 1) = "TLA") Then
            If (r2 <> 0) Then
                If (r2 - r >= 2) Then
                    With Range(r + 1 & ":" & r2)
                        .Sort Key1:=Range("A" & r + 1), _
                                Order1:=xlAscending, _
                                Orientation:=xlTopToBottom
                    End With
                End If
            End If
        r2 = r - 1
        End If

    Next r
End Function

OP的方法用于查找列中最后一个非空单元格。也可以使用您的方法,但您正在运行工作表中的每一行,其中有1048576行。诚然,空单元格将被跳过,但在这方面浪费迭代是非常低效的。我强烈怀疑他是否需要工作表中的所有行,这就是我应用usedrange的原因。它限制在实际使用的范围内。此外,当您将.cells与计数器一起使用时,显然也在进行迭代。由于wht涉及性能,加载到数组中并在内存中循环将是最快的;我避免这样做,因为我不想把人搞糊涂。
Function a()
    Dim r, r2 As Long

    r2 = 0

    Application.ScreenUpdating = False
    ActiveSheet.DisplayPageBreaks = False
    r = Range("A" & ActiveSheet.Rows.Count).End(xlUp).Row
    For r = r To 1 Step -1

        If (Cells(r, 1) = "TLA") Then
            If (r2 <> 0) Then
                If (r2 - r >= 2) Then
                    With Range(r + 1 & ":" & r2)
                        .Sort Key1:=Range("A" & r + 1), _
                                Order1:=xlAscending, _
                                Orientation:=xlTopToBottom
                    End With
                End If
            End If
        r2 = r - 1
        End If

    Next r
End Function