首页 > 解决方案 > 用户窗体中的命令按钮根据列表框中的选择删除多行

问题描述

我目前正在开发一个具有“清除进程”命令按钮的用户表单。这个想法是我的用户表单有一个列表框,它将列出所有当前进程。

从这里用户将选择他/她想从工作表中清除的过程(删除与过程相关的所有行)。

嵌入在代码中,我使用“Lisa”这个词作为前一个用户窗体的参考点,以使用 offset 函数知道进程名称应该是哪个单元格。

一旦用户确定要删除的进程,我希望能够使用“Lisa”这个词。这将始终是找到“Lisa”的行和下面的 19 行。

我已经开始了一些代码,但是当试图根据用户所做的选择来查找“Lisa”时,我遇到了一个问题。

Private Sub ClearButton_Click()

Dim findvalue As Range
Dim cDelete As VbMsgBoxResult

'hold in memory
Application.ScreenUpdating = False

'check for values
If Emp1.Value = "" Or Emp2.Value = "" Then
    MsgBox "There are no processes to delete"
    Exit Sub
End If

'confirm process should be deleted
cDelete = MsgBox("Are you sure you want to delete this process?", vbYesNo)

If cDelete = vbYes Then
    'find the process to be deleted
    '''''''set findvalue =

'''''''delete entire process
findvalue.EntireRow.Delete
End If

End Sub

希望这是足够的信息,任何帮助将不胜感激:)

标签: vbaexcel

解决方案


像这个一样小的东西会将范围设置为找到的值并将其删除:

Public Sub TestMe()

    Dim findValue As Range
    Set findValue = Selection.Find("Lisa")
    findValue.EntireRow.Delete

End Sub

作为一种好的做法,您可以findValue在删除之前检查是否不是空的。因此,您可以避免错误:

If Not findValue Is Nothing Then
    findValue.EntireRow.Delete
End If

如果您想让代码更进一步,请记住参数的默认值AfterFind()第一个单元格。因此,Find()始终从第二个单元格开始查找。为避免这种情况,并从第一个单元格开始查看,After:=显式传递参数被认为是一种好习惯:

Public Sub TestMe()

    Dim findValue As Range
    Dim selectedValue As Range

    Set selectedValue = ActiveSheet.Range(Selection.Address)
    With selectedValue
        Set findValue = .Find("Lisa", after:=.Cells(.Cells.Count))
    End With

    If Not findValue Is Nothing Then
        findValue.EntireRow.Delete
    End If

End Sub

为了使代码更加“有趣”,可以决定检查是否选择了范围(也可以选择形状)。因此,TypeName(Selection)可以与这样的东西一起使用:

If TypeName(Selection) <> "Range" Then
    MsgBox "Range is not selected!"
    Exit Sub
End If

Range.Find MSDN


推荐阅读