Board logo

標題: 查詢如何陣列,加快化? [打印本頁]

作者: s7659109    時間: 2019-3-7 11:56     標題: 查詢如何陣列,加快化?

If [c1].Value = "" Then MsgBox "填寫key", , "提示 Exit Sub"
Sheets("search").Rows("4:10000").ClearContents
Dim rnga As Range, rw%, arr
With Sheets("search")
    For Each rnga In Sheets("data").UsedRange
    Set rnga = rnga.Find([c1])
        r = .UsedRange.Rows.Count + 1
        If Not rng Is Nothing Then
            .Cells(r, 1).Resize(1, 6).Value = Sheets("data").Cells(rnga.Row, 1).Resize(1, 6).Value
        End If
    Next
因數據有數千筆,若查詢結果數據過多,會卡很久,請問如何加快?
作者: 准提部林    時間: 2019-3-8 10:45

請上傳檔案並說明需求條件及規則~~
作者: s7659109    時間: 2019-3-8 15:52

本帖最後由 s7659109 於 2019-3-8 15:54 編輯

需求:在工作表search c1 key 入關鍵字可全部欄位查詢(從工作表data),但筆數少ok,但筆數太多,會卡,請問該如何改?
作者: Hsieh    時間: 2019-3-8 16:39

回復 1# s7659109
  1. Sub ex()
  2. Dim Ar(), A As Range, s&, k&
  3. With Sheets("data")
  4. k = .[A4].End(xlToRight).Column
  5. For Each A In .Range(.[A5], .[A5].End(xlDown))
  6.    mystr = Join(Application.Transpose(Application.Transpose(A.Resize(, k))), Chr(10))
  7.    If InStr(mystr, Sheets("search").[C1]) > 0 Then
  8.    ReDim Preserve Ar(s)
  9.    Ar(s) = Split(mystr, Chr(10))
  10.    s = s + 1
  11.    End If
  12. Next
  13. If s > 0 Then Sheets("search").[A3].Resize(s, k) = Application.Transpose(Application.Transpose(Ar))
  14. End With
  15. End Sub
複製代碼

作者: s7659109    時間: 2019-3-11 11:06

If InStr(mystr, Sheets("search").[C1]) > 0 Then
  s = s + 1
   ReDim Preserve Ar(s)
   Ar(s) = Split(mystr, Chr(10))
    End If
問題:有看過 s = s + 1放在這個位置,但本代碼出現型態不符,差異為何?
另請教 若改成在data工作表直接查詢,以事件方式,做到隱藏(不是查詢資料),縮放功能。
作者: Hsieh    時間: 2019-3-12 09:59

回復 5# s7659109
你的問題是變動陣列大小時,將上限值先設與後設的差異
因為陣列起始值在沒有設定下是從0開始,若你是將s=s+1放在ReDim之前,那麼陣列上限是0的情況下
你卻要給陣列Ar(1)設定值,這樣就會出現超出陣列索引範圍的錯誤
底下適用儲存格Change事件供你參考
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. If Target.Address = "$AB$2" Then
  3. Range("A:A").EntireRow.Hidden = False
  4. For Each A In Range([A5], [A5].End(xlDown))
  5.   If InStr(Join(Application.Transpose(Application.Transpose(A.Resize(, 31))), Chr(10)), [AB2]) = 0 Then A.EntireRow.Hidden = True
  6. Next
  7. End If
  8. End Sub
複製代碼

作者: s7659109    時間: 2019-3-12 12:54

謝謝,Hsieh的解說。




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)