我有一个学生记录列表,其中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
答案 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