用户窗体中的命令按钮,用于删除多行,具体取决于列表框中的选择

时间:2018-05-23 08:03:28

标签: excel vba excel-vba

我目前正在处理一个具有“清除进程”命令按钮的用户窗体。我的想法是我的userform有一个列表框,列出所有当前进程。

用户将从此处选择他/她想要从工作表中清除的进程(删除与该进程相关的所有行)。

嵌入在代码中我使用“Lisa”这个词作为前一个用户形式的参考点,使用offset函数知道Process Name应该是哪个单元格。

一旦用户识别出要删除的过程,我希望能够使用“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

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

2 个答案:

答案 0 :(得分:0)

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

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

如果您想让代码更进一步,请记住After中参数Find()的默认值是第一个单元格。因此,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

答案 1 :(得分:0)

如果您的流程使用Named ranges,在您的情况下似乎几乎是强制性的,那么您可以执行以下操作:

Sub DeleteNamedRange(rngName As String)
    Range(rngName).ClearContents
    ThisWorkbook.Names(rngName).Delete
End Sub

以这种方式调用Sub

Call DeleteNamedRange("Lisa")