VBA UserForm删除记录后确认MsgBox重复弹出问题求助
问题排查:删除记录后确认MsgBox重复弹出
问题场景
我做了个带搜索功能的UserForm,用户搜完记录后点“Delete”按钮删除。删除前会弹确认框,点“Yes”就删记录、重置表单,再弹提示说记录已移除。但现在删完之后,确认框会再弹一次,求帮忙找问题。
原代码
Private Sub Img_Delete_click() Dim sh As Worksheet Set sh = ThisWorkbook.Sheets("My Form") sh.Unprotect "" Dim X As Long Dim Y As Long X = Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlValues, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False _ , MatchByte:=False, SearchFormat:=False).Row For Y = 16 To X If Sheets("My Form").Cells(Y, 12).Value = txt_Search.Text Then If MsgBox("Do you want to delete this record?", vbQuestion + vbYesNo, "Confirmation") = vbYes Then sh.Unprotect "" Rows(Y).Delete Else Exit Sub End If Call Reset_all MsgBox "Your record has been removed from the form.", vbInformation, "Record deleted" txt_name.SetFocus sh.Protect "" End If Next End Sub
问题出在这几点
- 正向遍历搞乱行索引:用
For Y = 16 To X从前往后循环,删完第Y行后,下面的行都会往上挪一行,原本的Y+1行变成新的Y行。循环到下一次时,会再次检查这个新Y行,若它的第12列值和搜索文本匹配,就会重复弹出确认框。 - 删除后未终止循环:删除记录后没有立刻停止循环,导致后续循环仍会查找匹配项,重复触发确认弹窗逻辑。
- 逻辑位置错误:重置表单、弹提示等操作放在循环内部的匹配判断里,只要找到匹配就执行,循环未终止的话这些操作也会重复触发。
修改后的代码
Private Sub Img_Delete_click() Dim sh As Worksheet Set sh = ThisWorkbook.Sheets("My Form") sh.Unprotect "" Dim X As Long Dim Y As Long ' 明确指定工作表查找最后一行,避免误操作其他表 X = sh.Cells.Find(What:="*", After:=sh.Range("A1"), LookIn:=xlValues, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, _ MatchCase:=False, MatchByte:=False, SearchFormat:=False).Row ' 从最后一行往回遍历,删除行后不影响未遍历行的索引 For Y = X To 16 Step -1 If sh.Cells(Y, 12).Value = txt_Search.Text Then If MsgBox("Do you want to delete this record?", vbQuestion + vbYesNo, "Confirmation") = vbYes Then sh.Rows(Y).Delete ' 指定工作表操作,避免修改其他表 Call Reset_all MsgBox "Your record has been removed from the form.", vbInformation, "Record deleted" txt_name.SetFocus sh.Protect "" Exit For ' 删除后立即退出循环,避免重复弹窗 Else sh.Protect "" ' 取消删除时也要保护工作表 Exit Sub End If End If Next Y End Sub
关键改动说明
- 反向遍历行:用
For Y = X To 16 Step -1从后往前查询,删除行后不影响前面未遍历行的索引,避免重复匹配或漏查。 - 删除后终止循环:添加
Exit For,删除一条记录后立刻停止循环,不会继续查找匹配项,自然不会重复弹出确认框。 - 绑定目标工作表:所有单元格、行操作都加上
sh.前缀,确保仅操作"My Form"工作表,避免因当前激活表错误导致问题。 - 调整逻辑位置:将重置表单、弹提示、保护工作表的逻辑移至确认删除的分支中,仅在成功删除时执行,取消删除时也会保护工作表,逻辑更严谨。
内容的提问来源于stack exchange,提问作者Joffee
相关产品推荐
相关产品推荐

