Excel 筛选时剪切和粘贴范围不起作用

Excel 筛选时剪切和粘贴范围不起作用,excel,vba,Excel,Vba,我有一张数据表,我想根据策略编号的开头进行筛选,然后我想将所有BFL策略移到PFL策略之后。第1行包含所有标题。我的保单编号以PFL或BFL开头 我不能直接对Z-A排序的原因是,原始数据从BFL001到BFL999,然后从PFL001到PFL999,所以对Z-A排序将首先得到PFL999,但我只想在PFL001之后将所有内容从BFL001移动到BFL999,就像简单的剪切和粘贴一样。我的范围每个月都不同,所以我使用001到999来向您展示我的原始数据是如何显示的 在我运行当前VBA模块后,它从第

我有一张数据表,我想根据策略编号的开头进行筛选,然后我想将所有BFL策略移到PFL策略之后。第1行包含所有标题。我的保单编号以PFL或BFL开头

我不能直接对Z-A排序的原因是,原始数据从BFL001到BFL999,然后从PFL001到PFL999,所以对Z-A排序将首先得到PFL999,但我只想在PFL001之后将所有内容从BFL001移动到BFL999,就像简单的剪切和粘贴一样。我的范围每个月都不同,所以我使用001到999来向您展示我的原始数据是如何显示的

在我运行当前VBA模块后,它从第1000行开始,从BFL001到PFL999,这不是我想要的。我需要从PFL001开始到PFL999,然后从BFL001开始到BFL999,中间没有空行

我不确定是否可以使用部分搜索或类似文本的方式查找以BFL开头的策略,然后剪切并粘贴到最后一行+1。不知道哪条路更快

Sub test()
    Dim LR1 As Long
    LR1 = Range("A" & Rows.Count).End(xlUp).Row

    With Worksheets("Combined")
        With .Range("A2:AU" & LR1)
             .AutoFilter Field:=1, Criteria1:="BFL" & "*"
             .Cut Range("A" & LR1 + 1)
        End With
             .AutoFilterMode = False
    End With
End Sub

VBA的一个巧妙技巧是,您可以使用
.SpecialCells
引用共享属性的某些单元格。在您的情况下,您可能希望使用
xlCellTypeVisible
,但还有许多其他单元格可以使用

这里的诀窍是手动进行切割。不能剪切彼此不相邻的单元格,但可以复制并粘贴它们。因此,我们的想法是将BFL细胞粘贴在PFL细胞的下方,然后清空原始细胞并清理空白。应用自动筛选后,您可以告诉excel仅查看与之前指定的相同范围内的可见单元格,这样您就不会得到任何额外信息。这一点很重要,因为在清除所有可见单元格时,您不希望意外地清除刚刚粘贴在下面的单元格

当你清理空白单元格时,自下而上是很重要的,因为从其他方面看,你可能会遇到索引问题。您还会注意到,我使用了
.entirerow
,这样它就删除了整行,而不仅仅是第一列

要显示所有数据,只需转到工作表。显示所有数据,,但需要检查工作表是否应用了自动筛选。有时,当您执行诸如清除单元格之类的操作时,它会关闭自动筛选功能,因此最好检查它是否仍然存在,这样宏就不会向您抛出错误

最后一点,虽然你没有错,但是没有必要将一个字符串与通配符
*
连接在一起,你可以将它们放在同一个字符串中。例如,
“BFL*”
“BFL”和“*”
相比只节省了一点打字时间

Sub test()
    Dim LR1 As Long
    Dim BFLRange As Range
    LR1 = Range("A" & Rows.Count).End(xlUp).Row
    Dim i As Long

    With Worksheets("Combined")
        With .Range("A2:AU" & LR1)
             .AutoFilter Field:=1, Criteria1:="BFL" & "*"

             Set BFLRange = .SpecialCells(xlCellTypeVisible)
             BFLRange.Copy Destination:=Worksheets("Combined").Range("A" & LR1 + 1)
        End With
        BFLRange.Clear

        For i = LR1 To 2 Step -1
            If IsEmpty(.Cells(i, 1)) Then
                .Cells(i, 1).EntireRow.Delete shift:=xlUp
            End If
        Next i
        If .AutoFilterMode Then
            .ShowAllData
        End If
    End With
End Sub
此代码段遵循@SJR的建议,删除包含BFL的整个已使用区域。我禁用警报的原因是,只会弹出一个小文本框,询问您是否确实要删除工作表行。通过关闭它,它不需要任何用户输入。值得注意的是,如果您处理大量数据,立即删除单元格将大大加快宏的速度。再次感谢@SJR

Sub test()
    Dim LR1 As Long
    Dim BFLRange As Range
    LR1 = Range("A" & Rows.Count).End(xlUp).Row
    Dim i As Long

    With Worksheets("Combined")
        With .Range("A2:AU" & LR1)
             .AutoFilter Field:=1, Criteria1:="BFL" & "*"

             Set BFLRange = .SpecialCells(xlCellTypeVisible)
             BFLRange.Copy Destination:=Worksheets("Combined").Range("A" & LR1 + 1)
        End With

        Application.DisplayAlerts = False
        BFLRange.Delete
        Application.DisplayAlerts = True

'        For i = LR1 To 2 Step -1
'            If IsEmpty(.Cells(i, 1)) Then
'                .Cells(i, 1).EntireRow.Delete shift:=xlUp
'            End If
'        Next i
        If .AutoFilterMode Then
            .ShowAllData
        End If
    End With
End Sub

谢谢你的详细解释。你的代码工作得很好,正是我需要的。好东西,但你不能一次删除范围吗?@SJR我以前从未尝试过,但看起来你可以!我将编辑我的答案,以包括代码,以及谢谢你,修改后的代码已经大大加快,因为我有超过10万的数据。