Excel 2016 VBA-如果在字符串

时间:2018-12-31 05:50:09

标签: excel vba excel-vba

如果在单元格中找到了特定的单词(“底部”),我正在尝试删除多行。我在A列中的数据如下:

OMC
Hold
Value
Bottom 13%
Advertising and Marketing
WPP
Sell
Momentum | B VGM
Bottom 13%
Advertising and Marketing
AIR
Sell
Growth
Top 9%
Aerospace - Defense Equipment
(...)

...所以我要从A4开始,如果单元格包含单词“ Bottom”,则需要删除单元格A1,A2,A3,A4和A5。

我尝试了以下代码:

Sub DeleteRow()

Dim N As Long, i As Long
N = Cells(Rows.Count, "A").End(xlUp).Row
For i = 4 To N
ActiveSheet.Cells(i, 1).Select
If InStr(1, ActiveCell.Value, "Bottom", vbTextCompare) <> 0 Then
ActiveCell.Offset(-3, 0).Delete
ActiveCell.Offset(-3, 0).Delete
ActiveCell.Offset(-3, 0).Delete
ActiveCell.Offset(-3, 0).Delete
ActiveCell.Offset(-3, 0).Delete 


ElseIf InStr(1, ActiveCell.Value, "Bottom", vbTextCompare) = 0 Then
i = i + 4
End If
Next i

End Sub

...基本上尝试从列的顶部开始,检查单元格A4是否包含单词Bottom,如果包含,则将删除单元格A1,这会将数据向上移动,因此再次删除A1,然后再次,直到下一个股票代码在单元格A1中。但是现在我希望它再次从A4开始,然后重复该过程。如果A4中的新值不包含“底部”(即,如果它显示“顶部”或其他任何内容),则它需要跳到下一行并在此处进行检查。总是从A4单元重新开始,这样就不会遗漏任何东西。

本质上,我试图以不包含“底部”的所有正确数据作为结束,上面的示例让我留下了:

AIR
Sell
Growth
Top 9%
Aerospace - Defense Equipment
(...)

...我只是不知道当行被删除并向上移动时如何处理。

我在这里看到了一个可能的解决方案:

Excel VBA Delete Rows

但不知道如何实现。提前非常感谢!

3 个答案:

答案 0 :(得分:1)

请尝试使用此代码。

此代码使用Find方法获取包含“底部”一词的单元格(如果找到),则Delete从其上方3行到其下方1行的单元格。

Sub DeleteRow() Dim R As Range, cellsToDel As String 'looking for cells that contain the word 'bottom' Set R = ActiveSheet.Range("A:A").Find("Bottom", LookIn:=xlValues) 'if found Do While Not R Is Nothing 'get cells address to be deleted cellsToDel = "A" & R.Row - 3 & ":A" & R.Row + 1 'delete the cells ActiveSheet.Range(cellsToDel).Delete xlShiftUp 'looking for cells that contain the word 'bottom' again Set R = ActiveSheet.Range("A:A").Find("Bottom", LookIn:=xlValues) Loop End Sub

祝你好运。

参考: Excel VBA reference

答案 1 :(得分:0)

如果我从示例中正确地解决了您的问题,则确实需要删除数据中LAST“底部”行上方的所有内容-再加上一行。

Excel在范围的Find方法中具有执行此搜索的强大功能:


Dim SearchData as Range, LastBottom as Range
Set SearchData = Range("A1",Range("A1").End(xlDown))  ' assumes no blank lines

Set LastBottom= SearchData.Find("Bottom ",SearchDirection:=xlPrevious) If LastBottom IS Nothing Then MsgBox "Couldn't find it" Else Range(Rows(1),Rows(LastBottom.Row+1).Delete End if

备注: 如评论所述,我假设使用“ End(xlDown)”而不是电子表格最后一行的“ xlUp”来查找数据的末尾时,数据没有空行。

因此,您会看到“查找”功能,“ xlPrev”搜索方向从底部开始向上,找到最后一个“底部”单元格。

如果要删除整个行,请使用Row()函数,或使用多个函数,请使用Range(Rows(X),Rows(Y))来运行“ .Delete”方法以及整个批次他们中的一个命令消失了。

答案 2 :(得分:0)

尝试:

Option Explicit

Sub test()

    Dim LastRow As Long, i As Long

    With ThisWorkbook.Worksheets("Sheet1")

        LastRow = .cells(.Rows.Count, "A").End(xlUp).Row

        For i = LastRow - 1 To 1 Step -5

            If InStr(.Range("A" & i).Value, "Bottom") <> 0 Then
                .Rows(i + 1).Delete
                .Rows(i).Delete
                .Rows(i - 1).Delete
                .Rows(i - 2).Delete
                .Rows(i - 3).Delete
            End If

        Next i

    End With

End Sub
相关问题