Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 用户窗体中的命令按钮,根据列表框中的选择删除多行_Vba_Excel - Fatal编程技术网

Vba 用户窗体中的命令按钮,根据列表框中的选择删除多行

Vba 用户窗体中的命令按钮,根据列表框中的选择删除多行,vba,excel,Vba,Excel,我目前正在开发一个userform,它有一个“clearprocess”命令按钮。我的想法是,我的userform有一个列表框,它将列出所有当前进程 从这里,用户将选择要从工作表中清除的流程(删除与流程相关的所有行) 嵌入在代码中,我使用了单词“Lisa”作为前一个userform的参考点,使用offset函数知道进程名称应该是哪个单元格 我希望能够使用“丽莎”一词,一旦用户确定了要删除的进程。这将始终是找到“Lisa”的那一行和下面的19行 我已经开始编写一些代码,但是当根据用户的选择试图查找

我目前正在开发一个userform,它有一个“clearprocess”命令按钮。我的想法是,我的userform有一个列表框,它将列出所有当前进程

从这里,用户将选择要从工作表中清除的流程(删除与流程相关的所有行)

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

我希望能够使用“丽莎”一词,一旦用户确定了要删除的进程。这将始终是找到“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

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

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

Public Sub TestMe()

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

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

If Not findValue Is Nothing Then
    findValue.EntireRow.Delete
End If
如果要使代码更进一步,请记住
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
如果类型名称(选择)“范围”,则
MsgBox“未选择范围!”
出口接头
如果结束

如果您在流程中使用,这在您的案例中几乎是强制性的,那么您可以执行以下操作:

Sub DeleteNamedRange(rngName As String)
    Range(rngName).ClearContents
    ThisWorkbook.Names(rngName).Delete
End Sub
通过以下方式调用
子项

Call DeleteNamedRange("Lisa")