我有一个Excel表,它在打开时宽6列(A) 13,000行。我想要写一个以单元格B1开头的宏,并检查它是否包含指定的字母(我将把它放入另一个未使用的单元格中)。如果是这样的话,我希望删除整行并将其他行向上移动。然后,宏应该以B1重新开始,并重复这个过程。如果B1不包含指定的字母,我想要依次检查C1-F1。如果其中任何一个包含指定的字母,我希望删除该行,将其他行向上移动,然后重新以B1开头。
如果单元格B1-F1中没有一个包含指定的字母,那么我希望将该行留在表中。然后,我想开始用B2 (或Bn)测试下一行,我想继续这个过程,直到我用数据在最后一行中检出Fn,并保留或删除了该行。
我想留给您的是一个表,它包含原始集合中的所有行,其中指定的字母出现在该行第2-6列中的任何单元格中。
我已经离开Excel宏20年了,所以确实需要一些关于如何实现行删除、行向上移动以及类似的硬部分的一些提示。
发布于 2022-01-13 08:25:19
最快的方法是建立一个多区域范围(即不会修改工作表的只读操作),然后在一个操作中删除它。
这个VBA例程应该这样做:
Public Sub DeleteRowsHavingCriterion()
Dim J As Integer
Dim nrows As Integer
Dim ws As Worksheet
Dim UsedRange As Range
Dim toDeleteRange As Range
Dim ThisRow As Range
Dim DeleteThisRow As Boolean
Set ws = Application.ActiveWorkbook.Worksheets("WorksheetToProcess")
Set UsedRange = ws.UsedRange
Let nrows = UsedRange.Rows.Count
For J = nrows To 1 Step -1
Set ThisRow = UsedRange.Rows(J).EntireRow
DeleteThisRow = ( _
(ThisRow.Cells(1, 2).Value = "LetterForColumnB") Or _
(ThisRow.Cells(1, 3).Value = "LetterForColumnC") Or _
(ThisRow.Cells(1, 4).Value = "LetterForColumnD") Or _
(ThisRow.Cells(1, 5).Value = "LetterForColumnE") Or _
(ThisRow.Cells(1, 6).Value = "LetterForColumnF") _
)
If (DeleteThisRow) Then
If (toDeleteRange Is Nothing) Then
Set toDeleteRange = ThisRow
Else
Set toDeleteRange = Union(toDeleteRange, ThisRow)
End If
End If
Next J
If (Not (toDeleteRange Is Nothing)) Then
toDeleteRange.Delete (XlDeleteShiftDirection.xlShiftUp)
End If
End Subhttps://stackoverflow.com/questions/70691912
复制相似问题