Excel 基于单元格值并按升序排序,将行复制到图纸底部

Excel 基于单元格值并按升序排序,将行复制到图纸底部,excel,vba,Excel,Vba,我有一张来自JIRA的Excel表格。这张表每周有不同的行。一旦它被拉出来,我有一个宏来执行各种动作。其中之一是根据列“F”中的值将某些行移动到工作表的底部。在这种特殊情况下,如果“F”列中存在值“RCR”,则该特定行应剪切并粘贴在底部 为此,我编写了以下代码。这段代码运行良好,可以完成这项工作。但问题是,因为它从下到上循环,所以具有“RCR”值的行列表是以降序方式排列的。但是我希望这些行以升序的方式进行排序 如果我在For循环中使用“1到lastRowOne”,那么发生的情况是在移动完成后删除

我有一张来自JIRA的Excel表格。这张表每周有不同的行。一旦它被拉出来,我有一个宏来执行各种动作。其中之一是根据列“F”中的值将某些行移动到工作表的底部。在这种特殊情况下,如果“F”列中存在值“RCR”,则该特定行应剪切并粘贴在底部

为此,我编写了以下代码。这段代码运行良好,可以完成这项工作。但问题是,因为它从下到上循环,所以具有“RCR”值的行列表是以降序方式排列的。但是我希望这些行以升序的方式进行排序

如果我在For循环中使用“1到lastRowOne”,那么发生的情况是在移动完成后删除该行,因此,如果下一行的值也为“RCR”,则跳过该特定行,因为它取代了已删除的行。因此,宏将移到之后的行,这将导致宏丢失某些连续值为'RCR'的行

Dim wsOne As Worksheet
Dim lastRowOne As Long
Dim lastRowTwo As Long

Set wsOne = ActiveWorkbook.Sheets("Status")

lastRowOne = wsOne.Cells(wsOne.Rows.Count, 1).End(xlUp).Row
lastRowTwo = wsOne.Cells(wsOne.Rows.Count, 1).End(xlUp).Row + 1

For I = lastRowOne To 1 Step -1
    If wsOne.Range("F" & I).Value = "RCR" Then
        wsOne.Rows(lastRowTwo).Value = wsOne.Rows(I).Value
        wsOne.Rows(I).EntireRow.Delete
    End If
Next
有什么方法可以解决这个问题吗?

使用
Union()
创建一个非连续范围,复制该范围,然后删除

    Dim wsOne As Worksheet
    Dim lastRowOne As Long
    Dim i As Long
    Dim rng As Range
    
    Set wsOne = ActiveWorkbook.Sheets("Status")
    
    lastRowOne = wsOne.Cells(wsOne.Rows.Count, 1).End(xlUp).Row
    With wsOne
        For i = 1 To lastRowOne
            If wsOne.Range("F" & i).Value = "RCR" Then
                If rng Is Nothing Then
                    Set rng = .Rows(i)
                Else
                    Set rng = Union(rng, .Rows(i))
                End If
            End If
        Next
        rng.Copy .Range("A" & lastRowOne + 1)
        rng.Delete
    End With
使用
Union()
创建非连续范围,复制该范围,然后删除

    Dim wsOne As Worksheet
    Dim lastRowOne As Long
    Dim i As Long
    Dim rng As Range
    
    Set wsOne = ActiveWorkbook.Sheets("Status")
    
    lastRowOne = wsOne.Cells(wsOne.Rows.Count, 1).End(xlUp).Row
    With wsOne
        For i = 1 To lastRowOne
            If wsOne.Range("F" & i).Value = "RCR" Then
                If rng Is Nothing Then
                    Set rng = .Rows(i)
                Else
                    Set rng = Union(rng, .Rows(i))
                End If
            End If
        Next
        rng.Copy .Range("A" & lastRowOne + 1)
        rng.Delete
    End With

这太棒了。非常感谢你。工作完美无瑕。直到现在我才意识到工会的作用。这太棒了。非常感谢你。工作完美无瑕。直到现在我才意识到工会的作用。