返回列表 上一主題 發帖

[發問] 請益 是否有更快的查詢方式

本帖最後由 n7822123 於 2021-7-30 01:52 編輯

回復 1# fantersy

1.小弟先用資料庫(Arry) 先去讀取了 L 跟 R的所有起始Barcode  及 結束Barcode 區間 ,還有工單號碼
2.再利用迴圈 及 IF  的方式 去判別 是否在區間內開啟跟結束的Barcode。
3.如果符合條件 則帶出 工單號碼。
問題
雖然 L分頁 跟 R分頁的資料不多,但是序號分頁 有兩萬多筆資料,用迴圈跑就會跑很久(差不多20分鐘)


邏輯沒問題,才2萬多筆資料,做簡單的判斷,理論上不會跑這麼久(20分鐘)

你應該沒有用純數值運算+陣列一次輸出,若是一個個儲存格跑,會很久(儲存格是物件)

我自己嘗試,跑幾秒鐘而已,我電腦也是N年前的普通機,不可能比你快這麼多

你的附檔沒有程式(.xlsx),無法知道是哪裡花較久時間
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

本帖最後由 n7822123 於 2021-7-31 13:27 編輯

回復 15# 准提部林

同樣的概念改寫準大程式,但是速度比較慢 (不過還是比純跑迴圈快)

推測需要額外做字串串接、拆分 等運算,所以拖慢速度!

純粹用字典崁套,速度真的沒法比,真是厲害!

這概念還蠻容易理解的,像是先建立一個目錄,不用讓電腦每個去找

此做法,我第一個想到的是 ,可以應用在 多層下拉式選單


Sub TEST_AT()
Dim Arr, Brr, Crr(2), xD(2), T$, i&, j%, k, Km%, TM
TM = Timer
Crr(1) = Range([L!m1], [L!a1].Cells(Rows.Count, 1).End(xlUp))
Crr(2) = Range([R!m1], [R!a1].Cells(Rows.Count, 1).End(xlUp))
For j = 1 To 2
    Set xD(j) = CreateObject("Scripting.Dictionary")
    For i = 2 To UBound(Crr(j))
        T = Left(Crr(j)(i, j + 9), 7)
        xD(j)(T) = xD(j)(T) & " " & i
    Next i
Next j
Arr = Range([序號!a1], [序號!a1].Cells(Rows.Count, 1).End(xlUp))
ReDim Brr(1 To UBound(Arr), 1 To 2)
Brr(1, 1) = "工單號碼": Brr(1, 2) = "位置"
For i = 2 To UBound(Arr)
    T$ = Left(Arr(i, 1), 7): Km = 0
    For j = 1 To 2
        For Each k In Split(Trim(xD(j)(T)))
            k = Val(k)
            If Crr(j)(k, 9 + j) <= Arr(i, 1) And Crr(j)(k, 11 + j) >= Arr(i, 1) Then
               Brr(i, 1) = Crr(j)(k, j): Brr(i, 2) = Mid("LR", j, 1) & k
               Km = 1: Exit For
            End If
        Next
        If Km = 1 Then Exit For
j01: Next j
i01: Next i
[序號!b1].Resize(UBound(Brr), 2) = Brr
MsgBox Timer - TM
End Sub
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

本帖最後由 n7822123 於 2021-7-31 13:27 編輯

回復 14# singo1232001

物件理論上是可以無限崁套的~~~

可以玩玩 "物件類別模組",自己創造物件,並且崁套看看~
程式是依需求寫的,需求表達不清楚
或者沒有上傳附件,愛莫能助

TOP

        靜思自在 : 並非有錢魷是快樂,問心無愧心最安。
返回列表 上一主題