Excel VBA范围查找和删除

我有几个关于VBA的问题,希望你们能帮助我。 我是一个非常新的VBA编码器,所以你可以提供任何帮助,非常感谢。

目标 – 如果在“valueRange”中find类似的值,则从“cellRange”中删除所有行

代码到目前为止

Sub DeleteRows() Set valueRange = Worksheets("Delete Rows").Range("A4:A65000") Set cellRange = Worksheets("Load File").Columns(Worksheets("Delete Rows").Range("F1").Value) For Each Cel In cellRange.Cells For Each Value In valueRange.Cells If Cel.Value = Value.Value Then Cel.EntireRow.Delete End If Next Value Next Cel End Sub 

问题1: valueRange并不总是全部填充65000行。 我怎样才能使范围只抓住从A4的(直到它打空列)

问题2:类似问题1,但cellRange

问题3:每当一行被删除,它似乎影响如何设置范围。 这意味着如果它删除第10行,则循环进入第11行而不再检查第10行。 我怎么能说出看第二遍或再次通过文件。

P1:这里有两个选项
a)如果Cel.Value是空的,则退出
b)适当的范围select,请参考这里的人: Excel:select所有的行,直到空的单元格

P2:和上面一样

P3:至于 – 每个人都不能“倒退”,你所能做的最好的是
a)不要删除该行,而是将其数字存储在一个Long数组中,然后添加一个For-Next并删除“标记的”行,如:

 For x = UBound(myLongArray)-1 To 0 Step -1 cel(x).EntireRow.Delete Next x 

b)而不是For-Each,将行数(通过ROWS函数 )存储在一个variables中,并通过“Step-1”循环遍历行

正如其他人所说,删除时必须退后一步。

此外,我修改了以避免在ValueRange中的每个单元格上不必要的迭代,而是使用Match()函数来检查Cel.Value存在于ValueRange

 Sub DeleteRows() Dim r as Long Dim valueRange as Range, cellRange as Range Dim Cel as Range Set valueRange = Worksheets("Delete Rows").Range("A4:A65000").End(xlUp) '<~~ Get the last unused row Set cellRange = Worksheets("Load File").Columns(Worksheets("Delete Rows").Range("F1").Value) For r = cellRange.Cells.Count to 1 Step -1 '<~~ When deleting rows you must step backwards through the range to avoid the error you are encountering.' Set Cel = cellRange.Cells(r) 'Check to see if Cel.Value exists in the ValueRange using the "Match" function' If Not IsError(Application.Match(Cel.Value,ValueRange,False) Then Cel.EntireRow.Delete End If Next r End Sub 

干得好。

 ' Declare your variables to get intellisense Dim rngDelete As Range Dim cellRange As Range Dim valueRange As Range ' Get only the rows with data Set valueRange = Worksheets("Delete Rows").Range("A4") If valueRange.Offset(1, 0) <> "" Then Set valueRange = Worksheets("Delete Rows").Range(valueRange, valueRange.End(xlDown)) End If ' Get only the rows with data Set cellRange = Worksheets("Load File").Cells(Worksheets("Delete Rows").Range("F1").value,1) If cellRange.Offset(1, 0) <> "" Then Set cellRange = Worksheets("Load File").Range(cellRange, cellRange.End(xlDown)) End If Dim cel As Range Dim value As Range ' make cel your outer since it has more rows For Each cel In cellRange.Cells For Each value In valueRange.Cells If value.value = cel.value Then ' Don't delete it yet but store it in a list If rngDelete Is Nothing Then Set rngDelete = cel.EntireRow Else Set rngDelete = Union(rngDelete, cel.EntireRow) End If ' no need to look further Exit For End If Next Next ' Wipe them out all at once rngDelete.Delete