如果找到(搜索词),请执行(操作)。如果没有,请结束

时间:2016-05-31 15:50:18

标签: excel vba excel-vba if-statement find

如果你们能帮助我,那会很棒,因为它会对我有所帮助。

这是我正在尝试做的事情:

  1. 搜索具有特定字词的单元格
  2. 如果找到,请复制单元格所在的整行并将其粘贴到其上方的一行中。
  3. 如果找不到,请不做任何操作并继续使用代码
  4. 这是我的代码:

    Sub Test()
    '
    ' Test Macro
    '
    ' Keyboard Shortcut: Ctrl+b
    '
    
        Range("A5").Select
        Cells.Find(What:="PL 1", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
            :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
            False, SearchFormat:=False).Activate
        If Not IsEmpty(ActiveCell.Value) Then
            ActiveCell.Rows("1:1").EntireRow.Select
            Selection.Copy
            Range("A5").Select
            ActiveSheet.Paste
        End If
        Range("A5").Select
        Cells.Find(What:="PL 2", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
            :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
            False, SearchFormat:=False).Activate
        If Not IsEmpty(ActiveCell.Value) Then
            ActiveCell.Rows("1:1").EntireRow.Select
            Selection.Copy
            Range("A6").Select
            ActiveSheet.Paste
        End If
        Range("A5").Select
        Cells.Find(What:="PL 3", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
            :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
            False, SearchFormat:=False).Activate
        If Not IsEmpty(ActiveCell.Value) Then
            ActiveCell.Rows("1:1").EntireRow.Select
            Selection.Copy
            Range("A7").Select
            ActiveSheet.Paste
        End If
    End Sub
    

    我的代码仅在找到值时才有效。如果未找到,则会遇到以下错误:enter image description here

2 个答案:

答案 0 :(得分:3)

您可以尝试这样的事情(未经测试):

viewController

原则是您需要一次编写所需的代码,然后创建一个循环来为您重复代码。

这个答案的另一部分是检查是否找到了单元格 - 为此,我们使用

检查范围是否已实际设置(这意味着它不是replyController
Sub HideAndSeek()

    Dim foundCell As Range

    For i = 1 To 3
        Set foundCell = Cells.Find(What:="PL " & i, LookIn:=xlFormulas, LookAt:=xlPart)
        If Not foundCell Is Nothing Then
            Intersect(foundCell.EntireRow, ActiveSheet.UsedRange).Offset(-1, 0).Value = _
                Intersect(foundCell.EntireRow, ActiveSheet.UsedRange).Value
        End If
        Set foundCell = Nothing
    Next

End Sub

答案 1 :(得分:3)

Cells.Find是一个返回Range对象引用的函数;当它没有找到任何内容时,引用将是Nothing。而且您无法在.Activate上致电Nothing

  

如果未找到匹配项,则此方法返回Nothing。 Find方法不会影响选择或活动单元格。MSDN

Cells.Find(What:="PL 2", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
    False, SearchFormat:=False).Activate

您需要重写代码并避免。选择和。激活,并避免使用ActiveCell并隐式使用ActiveSheet(您正在通过不符合条件进行操作) Cells使用正确的工作表参考调用。)

您的格式化使得难以阅读代码,原因如下:

  • 在不同的行上指定参数
  • 线路延续正在任意位置
  • 嵌套的成员通话未排队

比较:

Cells.Find(What:="PL 2", After:=ActiveCell, LookIn:=xlFormulas, _
           LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
           MatchCase:=False, SearchFormat:=False) _
     .Activate

这只是可读性。问题是你基本上假设 .Find返回一个有效的对象引用。 不要假设,明确检查:

Set result = Cells.Find(...)
If Not result Is Nothing Then result.Activate

但实际上,你需要想办法避免。选择和。激活。