返回列表 上一主題 發帖

VBA 資料搜尋問題

回復 50# Qin


1) 如果只用 "xU.AutoFilter Field:=3, Criteria1:=">=" & Ur1(3) " 這上半句語法,
在搜尋過程中, 對其他資料會不會有影響. (如: 資料搜尋出來不完整或搜尋速度緩慢等問題.)
__只針對日期篩選,不會影響其它欄位

2) 我用( .xls OR .xlsx) 共40萬筆資料搜尋時, 大概要花30秒的時間, 請問還可以加速嗎?
__改用ARRAY或許可以快些,但未實測,無法確定

3) 在編號搜尋欄位, 例如編號是 " 20000350"  "11005710"  "10003210" 而我只需鍵入 " 2*350 " 或 " 11*5710"... 也可以把資料搜出來.
__編號是〔數值〕,〔篩選〕無法用文字比對

TOP

回復 50# Qin


試試看吧:
SearchData03.rar (56.23 KB)

TOP

回復 53# Qin


如果篩選出來的資料會超過6萬筆, 將60000改為更大(多大? 自行斟酌)

TOP

回復 55# Qin

Sub Search_Data(Ur1, Ur2)
Dim Sht As Worksheet, Arr, Brr, i&, j%, k%, N&, dd&
Dim Mybook As Workbook, xB As Workbook, xChk%
Call Clear_All
xN = "Data.xls": Set Mybook = ThisWorkbook
On Error Resume Next: Set xB = Workbooks(xN): On Error GoTo 0
If xB Is Nothing Then
   Application.ScreenUpdating = False
   Set xB = Workbooks.Open("C:\Users\Ms Tan\Desktop\Data.xls", , 1, , "1234")
   Mybook.Activate: xChk = 1
End If
'----------------------------
ReDim Brr(1 To 400000, 1 To 10) '若資料會超過6萬筆,自行更改
For Each Sht In xB.Sheets
    If LCase(Left(Sht.Name, 4)) <> "data" Then GoTo 101
    Arr = Range(Sht.[J2], Sht.Cells(Rows.Count, 1).End(xlUp))
    For i = 1 To UBound(Arr)
        For j = 0 To 2
            If Ur1(j) <> "" Then If LCase(Arr(i, Ur2(j))) Like LCase(Ur1(j)) = False Then GoTo 102
        Next j
        dd = 0
        If IsDate(Arr(i, 3)) Then dd = Arr(i, 3)
        If dd < Ur1(3) Then GoTo 102
        N = N + 1
        For k = 1 To UBound(Brr, 2): Brr(N, k) = Arr(i, k): Next
102: Next i
101: Next
If xChk = 1 Then xB.Close 0
'----------------------------
If N = 0 Then MsgBox "找不到符合資料!": Exit Sub
With [A8:J8].Resize(N)
     .Value = Brr
     .Sort Key1:=.Item(3), Order1:=xlDescending, Header:=xlNo
     [A4:J5].Copy
     .Cells.PasteSpecial Paste:=xlFormats
End With
[A6].Select
End Sub

Sub Clear_All()
With Sheets("Search")
     If .FilterMode Then .ShowAllData
     With .UsedRange.Offset(7, 0)
          .ClearContents
          .Interior.ColorIndex = xlNone
     End With
     .[A1,C1:C3].Interior.ColorIndex = 15
     .[B1:B3].Interior.ColorIndex = 35
     .[A6].Select
End With
End Sub

Sent_01.rar (135.54 KB)

TOP

本帖最後由 准提部林 於 2018-10-4 10:57 編輯

回復 59# Qin

品名搜尋會出現錯誤:
__看[data]表的 G2703 為#N/A,

For j = 0 To 2
    If IsError(Arr(i, Ur2(j))) Then GoTo 102 '在這位置加這一行
    If Ur1(j) <> "" Then If LCase(Arr(i, Ur2(j))) Like LCase(Ur1(j)) = False Then GoTo 102
Next j


至於想[雙按左鍵]改成[ENTER]執行, 不建議這樣做,
CHANGE觸發, 每改一次即執行一次, 不太環保,
輸入並確定要搜尋條件無誤, 再執行程式, 才是最妥當, 差不了多少時間,
資料處理者, 有時不要嫌麻煩~~

TOP

回復 63# Qin


單獨手動打開data檔, 看要花多少時間???
如果檔案中有很多公式, 開啟時會自動重算, 要花些時間的!

所謂[不開啟], 實際是用別種方式開啟, 只是肉眼看不到,
沒有實際檔案測試, 什麼也說不準!!!
_我只用office 2000, 所以, 可另行發帖, 請其他人幫忙吧~~

TOP

回復 65# Qin

Sub Trans_Qty()
Dim R&
With Sheets("Qty on Hand")
     If .FilterMode Then .ShowAllData
     .UsedRange.Offset(1, 0).EntireRow.Delete
End With
R = Cells(Rows.Count, 1).End(xlUp).Row - 7
If R <= 0 Then Exit Sub
With ['Qty on Hand'!A2:I2].Resize(R)
     [A8:I8].Resize(R).Copy .Cells
     .Sort Key1:=.Item(6), Order1:=xlAscending, _
           Key2:=.Item(3), Order1:=xlAscending, Header:=xlNo
End With
With ['Qty on Hand'!I2].Resize(R)
     .Formula = "=IF(F2=F3,""A"",""B"")&TEXT(MID(I1,2,99),""0;-0;0;!0"")+N(H2)"
     .Value = .Value
     .Replace "A*", "", Lookat:=xlPart
     .Replace "B", ""
     .NumberFormatLocal = "#,##0;-#,##0"
End With
Application.Goto ['Qty on Hand'!A2]
End Sub

TOP

稍改
Sub Trans_Qty()
Dim R&
With Sheets("Qty on Hand")
     .AutoFilterMode = False
     .UsedRange.Offset(1, 0).EntireRow.Delete
End With
R = Cells(Rows.Count, 1).End(xlUp).Row - 7
If R <= 0 Then Exit Sub
With ['Qty on Hand'!A2:I2].Resize(R)
     [A8:I8].Resize(R).Copy .Cells
     .Sort Key1:=.Item(6), Order1:=xlAscending, _
           Key2:=.Item(3), Order1:=xlAscending, Header:=xlNo
End With
['Qty on Hand'!A1:I1].Resize(R + 1).AutoFilter
With ['Qty on Hand'!I2].Resize(R)
     .NumberFormatLocal = "#,##0;-#,##0"
     '.Formula = "=IF(F2=F3,""A"","""")&TEXT(MID(I1,2,99),""0;-0;0;!0"")+N(H2)" '公式(1)
     '.Formula = "=IF(F2=F3,""A"","""")&IF(ROW(A1)=1,0,MID(I1,2,99))+N(H2)"    '公式(2)
     .Formula = "=IF(F2=F3,"""",SUMIF(F:F,F2,H:H))"  '公式(3)
     '三種公式任選一個, 資料多, 看哪個快, 選哪個
     .Value = .Value
     .Replace "A*", "", Lookat:=xlPart '使用公式(3), 可省略這一行
End With
Application.Goto ['Qty on Hand'!A2]
End Sub

TOP

回復 68# Qin

更正下:
With ['Qty on Hand'!I2].Resize(R)
     .NumberFormatLocal = "#,##0;-#,##0"
     .Formula = "=IF(F2=F3,""A"","""")&TEXT(MID(I1,2,99),""0;-0;0;!0"")*(F2=F1)+N(H2)"  '公式(1)
     '.Formula = "=IF(F2=F3,""A"","""")&IF(ROW(A1)=1,0,MID(I1,2,99))*(F2=F1)+N(H2)" '公式(2)
     '.Formula = "=IF(F2=F3,"""",SUMIF(F:F,F2,H:H))" '公式(3)
     .Value = .Value
     .Replace "A*", "", Lookat:=xlPart '公式(1)及(2), 需加這一行
End With

TOP

        靜思自在 : 時時好心就是時時好日。
返回列表 上一主題