我已經被用於查找在Excel工作表中的信息的功能知道: - 鍵可以是一個變量列 - 變量字段可以搜索 表格通常不到一百列,但可以從幾百到幾十萬行進行搜索。在我們最大的文件中,我試圖優化的功能可以使用大約一百萬次。如何使用數組來提高效率,而不是在VBA
閱讀 https://fastexcel.wordpress.com/2011/10/26/match-vs-find-vs-variant-array-vba-performance-shootout/
...並找到我們的函數用於查找(3次)之後,我嘗試使用數組。
這是我寫的
Function getInfo(Key As String, NameField As String, NameKey As String, WksName As String) As Variant
On Error GoTo Error
Dim iColumnKEY As Integer
Dim iColumnFIELD As Integer
Dim i As Integer
Dim ListFields, ListKeys As Variant
ListFields = Worksheets(WksName).Range("A1:ZZ1")
i = LBound(ListFields, 2)
'To identify which column contains the Key and which one contains the
'information we are searching for
Do While iColumnKEY=0 Or iColumnFIELD=0
If i > UBound(ListFields, 2) Then
getInfo = "//error\\"
ElseIf ListFields(1, i) = NameKey Then
iColumnKEY = i
ElseIf ListFields(1, i) = NameField Then
iColumnFIELD = i
End If
i = i + 1
Loop
Dim iROW As Integer
ListKeys = Worksheets(WksName).Columns(iColumnFIELD)
i = LBound(ListKeys, 1)
Do While iROW=0
If i > UBound(ListKeys,1) Then
getInfo = "//error\\"
ElseIf ListKeys(i,1) = Key Then
iROW = i
End If
i = i + 1
Loop
getInfo = Worksheets(WksName).Cells(iROW, iColumnFIELD)
Exit Function
Error:
getInfo = "//error\\"
End Function
代碼工作的代碼,但速度很慢。我在做什麼會減慢速度?
它現在不在代碼中,但我確實嘗試了關閉屏幕更新以及自動計算。我沒有看到速度上的差異,這表明我的基本算法是主要問題。
此外,該文章是在2011年。數組仍然比Match/Find快很多?作爲一個方面說明:最終,我會建議讓一個宏在批處理中搜索一系列鍵,而不是爲每個鍵調用該函數。這意味着第一個Do ... While循環對於一個宏只能執行一次,並且只有Do_While for Rows纔會針對每個鍵運行。但是,這在短期內不是一種選擇。
感謝。任何幫助或建議將不勝感激。
謝謝!根據以前的評論,我昨晚做了一些改進。 – Jade
不客氣。您可能想嘗試一下並讓我知道。良好的編碼! – user3598756
@Jade,你通過了嗎? – user3598756