亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用Excel VBA在工作簿中查找所有匹配項

使用Excel VBA在工作簿中查找所有匹配項

不負相思意 2019-12-03 16:40:38
我正在嘗試編寫一個VBA例程,該例程將使用字符串,搜索給定的Excel工作簿,并向我返回所有可能的匹配項。我目前有一個可行的實現,但是它非常慢,因為它是double for循環。當然,內置的Excel Find函數經過“優化”以查找單個匹配項,但是我希望它返回一個初始匹配項數組,然后可以將其應用于其他方法。我將發布一些我已經擁有的偽代碼For all sheets in workbook    For all used rows in worksheet        If cell matches search string            do some stuff        end    endend如前所述,此double for循環使事情運行非常緩慢,因此,我希望盡可能消除這種情況。有什么建議么?更新盡管下面的答案可以改善我的方法,但由于需要一遍又一遍地進行多次查詢,最終我得到了些許不同。相反,我決定遍歷文檔中的所有行,并為每個唯一行創建一個包含鍵的字典。然后,此指向的值將是可能匹配項的列表,以便稍后查詢時,我可以僅檢查它是否存在,如果存在,則可以快速獲取匹配項列表?;旧现皇窃谧鲆粋€初始掃描存儲一切都在一個可管理的結構,然后查詢該結構可以在完成O(1)時間
查看完整描述

3 回答

?
30秒到達戰場

TA貢獻1828條經驗 獲得超6個贊

如上所述,使用Range.Find方法以及工作簿中每個工作表的循環是最快的方法。例如,以下代碼查找字符串“ Question?”。在每個工作表中,并將其替換為字符串“ Answered!”。


Sub FindAndExecute()


Dim Sh As Worksheet

Dim Loc As Range


For Each Sh In ThisWorkbook.Worksheets

    With Sh.UsedRange

        Set Loc = .Cells.Find(What:="Question?")

        If Not Loc Is Nothing Then

            Do Until Loc Is Nothing

                Loc.Value = "Answered!"

                Set Loc = .FindNext(Loc)

            Loop

        End If

    End With

    Set Loc = Nothing

Next


End Sub


查看完整回答
反對 回復 2019-12-03
?
慕雪6442864

TA貢獻1812條經驗 獲得超5個贊

Function GetSearchArray(strSearch)

Dim strResults As String

Dim SHT As Worksheet

Dim rFND As Range

Dim sFirstAddress

For Each SHT In ThisWorkbook.Worksheets

    Set rFND = Nothing

    With SHT.UsedRange

        Set rFND = .Cells.Find(What:=strSearch, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlRows, SearchDirection:=xlNext, MatchCase:=False)

        If Not rFND Is Nothing Then

            sFirstAddress = rFND.Address

            Do

                If strResults = vbNullString Then

                    strResults = "Worksheet(" & SHT.Index & ").Range(" & Chr(34) & rFND.Address & Chr(34) & ")"

                Else

                    strResults = strResults & "|" & "Worksheet(" & SHT.Index & ").Range(" & Chr(34) & rFND.Address & Chr(34) & ")"

                End If

                Set rFND = .FindNext(rFND)

            Loop While Not rFND Is Nothing And rFND.Address <> sFirstAddress

        End If

    End With

Next

If strResults = vbNullString Then

    GetSearchArray = Null

ElseIf InStr(1, strResults, "|", 1) = 0 Then

    GetSearchArray = Array(strResults)

Else

    GetSearchArray = Split(strResults, "|")

End If

End Function


Sub test2()

For Each X In GetSearchArray("1")

    Debug.Print X

Next

End Sub

在執行“查找循環”時要小心,不要使自己陷入無限循環...請引用第一個找到的單元格地址,并在每個“ FindNext”語句之后進行比較,以確保它沒有返回到最初找到的第一個單元格。


查看完整回答
反對 回復 2019-12-03
  • 3 回答
  • 0 關注
  • 3775 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號