【发布时间】:2015-08-08 16:58:32
【问题描述】:
我想使用 Excel VBA 执行以下操作:
1) 在列中查找某个 word_1;
2) 如果在步骤 (1) 中找到 word_1,则向右移动一列并寻找另一个名为 word_2 的单词。如果也找到 word_2,则删除整行。
另一方面,如果没有找到 word_2,则不必删除该行。
一般的想法是在一列中搜索多个单词,如果找到它们,还要仔细检查(为了安全起见)某些附属单词是否在第 2 列中。只有这样才能删除整行。
我做了以下小例子进行测试:
Col1 Col2
xxx xxx
xxx xxx
xxx xxx
findme acg
xxx xxx
findme xxx
在此示例中,我在第 1 列中搜索单词“findme”,在第 2 列中搜索相关单词“acg”。如您所见,必须删除第 4 行,因为这两个单词都出现在一行中,与例如相反第 6 行,情况并非如此。
我的最终代码:
Sub xxx()
Dim aCell As Range, bCell As Range, aSave As String
Dim fndOne As String, fndTwo As String
fndOne = "findme"
fndTwo = "acg"
Dim ws As Worksheet: Set ws = ActiveWorkbook.ActiveSheet
Application.DisplayAlerts = False
Application.ScreenUpdating = False
With ws
Set aCell = .Columns(1).Find(What:=fndOne, LookIn:=xlValues, _
lookat:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
If Not aCell Is Nothing Then
aSave = aCell.Address
Do
If LCase(.Cells(aCell.row, 2).Value) Like Chr(42) & fndTwo & Chr(42) Then
If bCell Is Nothing Then
Set bCell = .Range("A" & aCell.row)
Else
Set bCell = Union(bCell, .Range("A" & aCell.row))
End If
End If
Set aCell = .Columns(1).FindNext(After:=aCell)
Loop Until aCell.Address = aSave
End If
Set aCell = Nothing
If Not bCell Is Nothing Then bCell.EntireRow.Delete
End With
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
【问题讨论】:
-
根据您的叙述,我无法确定 .Find 方法的
lookat:=xlPart是否是故意的。您是否要匹配包含整个单词的搜索字符串或单元格的任何部分? -
@Jeeped 是的任何部分,这是有意的。抱歉,示例没有显示
-
我已将所有搜索条件用星号(ASCII 字符 0042)包裹起来,并将
xlWhole更改为xlPart以适应通配符搜索。
标签: excel vba search match multiple-columns