搜索代码仅搜索一行(工作时)

问题描述 投票:0回答:1

我有一个包含 84 列和 249,000 多行的报告文件。 (行数每个月都会不同。)我需要能够在整个报告中搜索 9 个搜索词,并报告搜索词是否出现在每行中。 (即,如果找到第一项,请在 A 列中写“是”,第二项在 B 列中写“是”,依此类推)。

搜索词可以单独出现在 AQ 和 CC 之间的任何列中(不是每行中的同一列);在 CD 列中,搜索词可能是一系列以逗号分隔的文本。

Sub CodeSearch()
    
    Application.ScreenUpdating = False 
    Dim i As Long 
    Dim foundRng As Range 
    Dim Lastrow As Long 

    Lastrow = Cells(Rows.Count, "J").End(xlUp).Row
    
    'set worksheets 
    With ThisWorkbook 
        Set wsSource = .Worksheets("TestData") 
    End With
    
    With wsSource
    
    For i = 2 To Lastrow
    
    Set foundRng = Range("AQ" & i & ":CD" & i).Find("Term1") 
    If foundRng = True Then
        Worksheets("TestData").Range("A" & i).Value = "Yes" 
    End If
    
    Set foundRng = Range("AQ" & i & ":CD" & i).Find("Term2") 
    If foundRng Is True Then 
        Worksheets("TestData").Range("B" & i).Value = "Yes" 
    End If
    
    Set foundRng = Range("AQ" & i & ":CD" & i).Find("Term3") 
    If foundRng Is True Then 
        Worksheets("TestData").Range("C" & i).Value = "Yes" 
    End If
    
    Next i
    
    Application.ScreenUpdating = True
    
    End With 
End Sub

(代码已缩短,但您明白了要点) 我使用 J 列来计算行数,因为它不能为空。

我第一次尝试时,没有 With / End With,并且每行都有“IffoundRng Is Nothing then”。这导致仅在第 2 行的每一列中输入“是”。一旦我将“Is Nothing”更改为“Is True”,我得到一个“对象变量或 With 块未设置”。我添加了 With 块,但仍然收到该消息。

任何帮助将不胜感激。

excel vba search
1个回答
0
投票

这应该可以满足你的要求:

Sub CodeSearch()
    Dim Lastrow As Long, rw As Range

    With ThisWorkbook.Worksheets("TestData")
        Set rw = .Range("AQ2:CD2")  'start on this row
        Lastrow = .Cells(.Rows.Count, "J").End(xlUp).row
    End With
    
    Application.ScreenUpdating = False
    Do While rw.row <= Lastrow    'loop over rows
        'match is faster than find....
        If Not IsError(Application.Match("Term1", rw, 0)) Then
            rw.EntireRow.Columns("A").Value = "Yes"
        End If
        If Not IsError(Application.Match("Term2", rw, 0)) Then
            rw.EntireRow.Columns("B").Value = "Yes"
        End If
        If Not IsError(Application.Match("Term3", rw, 0)) Then
            rw.EntireRow.Columns("C").Value = "Yes"
        End If
        
        Set rw = rw.Offset(1, 0) 'next row
    Loop
    Application.ScreenUpdating = True
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.