Excel 筛选时剪切和粘贴范围不起作用
我有一张数据表,我想根据策略编号的开头进行筛选,然后我想将所有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。不知道哪条路更快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模块后,它从第
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万的数据。