我目前正在处理一个具有“清除进程”命令按钮的用户窗体。我的想法是我的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
希望这是足够的信息,任何帮助将不胜感激:)
答案 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
答案 1 :(得分:0)
如果您的流程使用Named ranges,在您的情况下似乎几乎是强制性的,那么您可以执行以下操作:
Sub DeleteNamedRange(rngName As String)
Range(rngName).ClearContents
ThisWorkbook.Names(rngName).Delete
End Sub
以这种方式调用Sub
:
Call DeleteNamedRange("Lisa")