查找和删除具有多个条件的行

时间:2019-10-31 04:02:53

标签: excel vba

我有一个学生记录列表,其中B列列出了姓氏,C列列出了姓氏。在用户表单上是一个搜索功能,该功能将学生姓名填入值surname.value和firstname.value中,然后想要一个命令按钮在记录列表中找到该人并删除整行。我使用了与消息框一起使用的编码,然后更改了消息框以删除行,现在它不起作用了。

Private Sub CommandButton1_Click()

Dim ws As Worksheet
Set ws = Worksheets("-student records no CVI")


     Dim rngFound As Range
    Dim strFirst As String
    Dim strID As String
    Dim strDay As String

    strID = Surname.Value
    strDay = Firstname.Value

    Set rngFound = Columns("B").Find(strID, Cells(Rows.Count, "B"), xlValues, xlWhole)
    If Not rngFound Is Nothing Then
        strFirst = rngFound.Address
        Do
            If LCase(Cells(rngFound.row, "C").Text) = LCase(strDay) Then
                'Found a match
                ws.Rows(rngFound.row).EntireRow.Delete

            End If
            Set rngFound = Columns("B").Find(strID, rngFound, xlValues, xlWhole)
        Loop While rngFound.Address <> strFirst
    End If

    Set rngFound = Nothing

End Sub

2 个答案:

答案 0 :(得分:3)

使用Autofilter删除记录的简单方法:

Sub Remove_Student()
Dim Ws As Worksheet
Dim strID As String
Dim strDay As String

Set Ws = ThisWorkbook.Sheets("Sheet1")
strID = Surname.Value
strDay = Firstname.Value

Ws.AutoFilterMode = False
Ws.Range("A1").AutoFilter 2, strID
Ws.Range("A1").AutoFilter 3, strDay
Ws.AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
Ws.AutoFilterMode = False

End Sub

答案 1 :(得分:0)

我绝不只是专业人士,我不确定这是否是实现此目标的最佳方法,但我会这样做。

更新(我确实说我不是专业人士!)

第二个答案代码将首先搜索姓氏,然后检查“给定名称”,但是它将匹配“ John Smith”和“ John Smithfalls”,因为它不执行“精确字符串”,只需要显示字符串即可。与使用"AutoFilter".相比,效率也较低。根据其他答案和评论,我也提出了另一个答案来进行更新。 (无论投票如何,接受的答案总是显示在页面顶部)。

使用AutoFilter

Sub Remove_Student()

Dim wb As Workbook, ws As Worksheet

Set wb = ThisWorkbook
Set ws = wb.Sheets("Sheet1")

Dim SurnameStr As String, GivenNameStr As String
SurnameStr = "Smith"
GivenNameStr = "Joe"

With ws
 .AutoFilterMode = False
 With .Range("A1")
  .AutoFilter field:=2, Criteria1:=SurnameStr
  .AutoFilter field:=3, Criteria1:=GivenNameStr
 End With
 .AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
 .AutoFilterMode = False
End With
End Sub

使用InStr

Sub Remove_Student()

Dim wb As Workbook, ws As Worksheet

Set wb = ThisWorkbook
Set ws = wb.Sheets("Sheet1")

Dim SurnameStr As String, GivenNameStr As String
SurnameStr = "Smith"
GivenNameStr = "Joe"

Dim lRow
lRow = ws.Cells(Rows.Count, "B").End(xlUp).Row

Dim rcell As Range, rng As Range
Set rng = ws.Range("B1:B" & lRow)

For Each rcell In rng.Cells
 If InStr(1, Range(rcell.Address), SurnameStr, vbTextCompare) <> 0 Then
 'MsgBox SurnameStr & " Found in Row " & rcell.Row
  If InStr(1, Range(rcell.Offset(0, 1).Address), GivenNameStr, vbTextCompare) <> 0 Then
   'rcell.EntireRow.Delete
   MsgBox SurnameStr & " , " & GivenNameStr & " Found in Row " & rcell.Row
  End If
 End If
Next rcell

End Sub