Я ни в коем случае не профессионал, просто к вашему сведению, я не уверен, что это лучший способ сделать это, но это то, как я это сделаю.
Обновление (я действительно говорил, что я не профессионал!):
Второй код ответа сначала будет искать фамилию, затем проверять имя, но будетсопоставьте «John Smith» с «John Smithfalls», поскольку это не означает «точную строку», просто требуется наличие строки. Это также менее эффективно, чем использование «Автофильтр». На основании другого ответа и комментариев я сделал еще один ответ, чтобы обновить его. (Принятые ответы всегда отображаются вверху страницы независимо от голосов).
Использование 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