搜索工作簿以查找字符串的所有匹配项

时间:2014-07-17 15:41:42

标签: excel vba search

我正在尝试编写一个vba脚本,它将搜索多页工作簿并返回包含dataToFind字符串的所有结果。目前我正在使用find和findNext函数......下面似乎按照我想要的方式浏览所有页面,但它只会一次又一次地返回单个结果。

以下是我的代码。

Function searchGrids(contract As String, pbp As String, county As String) As String()


Dim datatoFind As String
Dim sheetCount As Integer
Dim counter As Integer
Dim currentSheet As Integer
Dim pos As Integer
Dim endFlag As Integer

endFlag = 0

Set indGrid = Workbooks("2014NumberGrid")

On Error Resume Next
    currentSheet = ActiveSheet.Index
    datatoFind = contract & "-" & pbp
    sheetCount = indGrid.Sheets.Count

For counter = 1 To sheetCount

    indGrid.Sheets(counter).Activate
    If IsError(Cells.find(What:=datatoFind, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
    False).Activate) = False Then Exit For

Next counter

pos = InStr(ActiveCell.Value, datatoFind)

If pos > 0 Then

    MsgBox (ActiveCell.EntireRow.Cells(1, 2).Value)

End If

Do While endFlag = 0




    If pos = 0 Then

        endFlag = 1

    Else
    For counter = 1 To sheetCount
        Do While pos > 0
            indGrid.Sheets(counter).Activate
            indGrid.FindNext(ActiveCell).Activate

            pos = InStr(ActiveCell.Value, datatoFind)

                MsgBox (ActiveCell.EntireRow.Cells(1, 2).Value)

        Loop
    Next counter
    End If

Loop

Sheets(currentSheet).Activate
End Function

由于

P.S。有人问这个函数应该返回什么值。目前,没关系。我所要做的就是访问电子表格的数据,以便我可以使用它。然后我将返回函数内部构建的复杂字符串或字符串数​​组。任何返回的变量都将根据其他工作簿中的数据构建。如果有一个更好的方法(比如,返回所有行的范围都在里面),那么我当然绝对是开放的。

1 个答案:

答案 0 :(得分:2)

这是您可以适应的 sub 。子查找所有搜索单词 happy

的工作表

对于找到的每个实例,都会记录找到的行的列 A 中的工作表名称,地址和值。然后输出信息:

Sub FindingData()
    Dim sh As Worksheet, v As String, r As Range, _
        msg As String
    v = "happy"

    For Each sh In Worksheets
        With sh
        For Each r In .UsedRange
            If InStr(1, r.Value, v) > 0 Then
                msg = msg & .Name & vbTab & r.Address & vbTab & CStr(r.EntireRow.Cells(1).Value) & vbCrLf
            End If
        Next r
        End With
    Next sh

    MsgBox msg
End Sub

注意:我使用循环而不是 .FIND()方法。