返回列表 上一主題 發帖

VBA 資料搜尋問題

回復 1# Qin
請參考
VBA資料搜尋.rar (43.67 KB)

TOP

回復 12# Qin
Q1:希望VB 搜尋結果呈現的是由今至遠。
A1:已加寫了,如附件。

Q2:方便在搜尋后, 可以進一步篩選。
A2:不曾寫過這種方式,還是請其他前輩幫忙吧。

陣列的程式碼已加註,請參考:
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     Dim arr     '宣告arr為靜態陣列
  3.     Dim brr()   '宣告brr為動態陣列
  4.     If Target.Count <> 1 Then Exit Sub  '假如Change的儲存格數量不是1個的話退出程序
  5.     If Intersect(Target, [B1:B3]) Is Nothing Then Exit Sub      '假如Change的儲存格不是位於B1:B3儲存格中的任一個的話退出程序
  6.     If Target.Value = "" Then       '假如Change的儲存格的值是空值得話(被User按了Delete鍵)時....
  7.         Application.EnableEvents = False        '取消觸發事件避免因底下的Delete而再次觸發此Change事件
  8.         Rows("4:" & Cells.Rows.Count).Delete    '刪除第4列至最底列的舊資料
  9.         Application.EnableEvents = True     '恢復觸發事件
  10.         Exit Sub    '退出程序
  11.     End If
  12.     ar = Array(6, 7, 4)     '將6, 7, 4等關鍵欄位存入ar陣列中
  13.     arr = Sheets("Data").Range("A2:J" & Sheets("Data").[A1].End(4).Row)     '將Data工作表內的A2至J欄有資料的最底列存入arr靜態陣列中
  14.     n = 0   'n值存入0
  15.     For i = 1 To UBound(arr)    '從1至 arr 1維的最大下標值作為迴圈
  16.         If arr(i, ar(Target.Row - 1)) = Target.Value Then   '假如靜態陣列arr中的列i及ar陣列中欄的資料等於Change的儲存格的資料時....
  17.             n = n + 1   'n的值加1
  18.             ReDim Preserve brr(1 To 10, 1 To n)     '重新宣告動態陣列brr的一、二維上、下標的數組,以準備存入底下迴圈的資料
  19.             For j = 1 To 10     '因Data欄位總共為10欄,因此迴圈10次來讀取該arr內符合列的資料,存入動態陣列的brr內
  20.                 brr(j, n) = arr(i, j)   '將上述狀況存入值
  21.             Next j
  22.         End If
  23.     Next i
  24.     If n = 0 Then   '假如上述迴圈都找不到資料時....
  25.         MsgBox "於資料庫中並無符合搜尋條件∼", vbCritical + vbOKOnly, "請注意"      '彈出訊息警告
  26.         Exit Sub    '退出程序
  27.     End If
  28.     Application.EnableEvents = False    '取消觸發事件
  29.     For i = 1 To 3  '此迴圈主要處理B1:B3儲存格內的殘存資料
  30.         If Cells(i, 2).Address <> Target.Address Then Cells(i, 2).Value = ""    '假如B1:B3儲存格內不是Change的儲存格,則刪除資料
  31.     Next i
  32.     Application.ScreenUpdating = False      '將螢幕凍結,以減少畫面的跳動
  33.     Rows("4:" & Cells.Rows.Count).Delete    '刪除第4列至最底列的舊資料
  34.    
  35.     [A4].Resize(n, 10) = Application.Transpose(brr) '將存入brr的值轉置後放入以A4儲存格展延n列,10欄的範圍內
  36.     '注意上面的Transpose,因VBA最多只能轉置65536列資料,多了就會產生錯誤,我用的2010版,之後的版本是否有更新不得而知。
  37.    
  38.     Application.ScreenUpdating = False  '取消螢幕凍結
  39.     Application.EnableEvents = True         '恢復觸發事件
  40. End Sub
複製代碼
Book1(範圍物件法加排序).rar (20.56 KB)

TOP

回復 15# Qin

請參考
Book1(範圍物件法加排序)-1.rar (26.06 KB)

TOP

回復 18# Qin

試看看
Book1(範圍物件法加排序)-2.rar (26.14 KB)

TOP

回復 23# Qin
請參考
Book1(範圍物件法加排序)-3.rar (31.13 KB)

TOP

回復 25# Qin
原先設計不知會用到那麼多的資料,已修改程式碼。
模擬10萬筆資料大約1秒內能搜尋完成。
因上傳檔案大小限制,而無法將模擬的10萬筆資料上傳。
請參考。
Book1(範圍物件法10萬筆)-4.rar (28.64 KB)

TOP

回復 27# Qin
請查閱ThisWorkbook模組便知。

TOP

回復 71# Qin

自從准大熱心幫忙後,我就沒有再follow此題了。
至於 "Data" (資料庫) & "Search" (搜尋)這2個檔分開用,意思是將Data(資料庫)拆解至另外1個檔案嗎?
若是如此的話,我的寫法可能會開啟Search(搜尋)這個檔的時候,順便讀入Data(資料庫)至暫存工作表,作為搜尋依據。

TOP

回復 73# Qin
壓縮檔內有下列兩個檔案:
1.主程式檔案:資料搜尋.xlsm
2.資料庫檔案:SearchData.xlsx
兩個檔案必須放在同個資料夾中。
資料庫檔案名稱必須為SearchData.xlsx
資料搜尋.rar (38.76 KB)

TOP

        靜思自在 : 難行能行,難捨能捨,難為能為,才能昇華自我的人格。
返回列表 上一主題