返回列表 上一主題 發帖

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

回復 3# singo1232001


    函數的部分 我有使用過
只不過這是我舉例範例 數量只有2萬多筆
若筆數越多 用函數  電腦會越吃力
後來就放棄用函數了 ><""

TOP

另一類方法, 字典中的字典:
Xl0000114_v2.rar (391.29 KB)

以Barcode前七碼分別建立字典, 記憶陣列的行位置, 以減少不必要的迴圈,
注意:Barcode同行的開始碼及結束碼的前七碼必須相同(若不行, 可改為前六碼), 儘量可做到分類!!!

TOP

回復 12# 准提部林


准大這個字典 搭配 分割 的做法實在太好了
又學到一招
比我切那個99桶方便多了
記憶體分配不大
而且可以很隨機的切成想要的字元區間
看來上萬筆資料的篩選也多了一招更方便的方式
完全體會到鏈表的好用之處
而且也學到條碼文字比大小的特殊案例
一魚兩吃 非常感謝

另外想請教准大一個概念上的問題
目前我使用陣列去切 是不是只剩下
"資料庫有多筆相同資料的情況,並且都要找出來"才會用得上了
(不過想想),字典碰上重複 ,但key值應該也可以把資料 &","& 起來 或者 &" "&起來

目前秉持實驗與學習的精神
小弟也把修改後實驗結果呈上 速度慢了些 要0.6秒

3維陣列工單查詢 v4.zip (822.72 KB)

TOP

回復 13# singo1232001


    剛剛發現 字典下面還可以再放入字典 不用擔心重複了 這招好用!
    又學到一招!

TOP

回復 13# singo1232001


我這大約要2秒左右(老PC-XP+2000),
這是分級包裝的概念...將零件組合成品, 再分級排列,
很好的運用, 讚~~~

TOP

回復 15# 准提部林


    准大的檔案 在我的電腦跑0.3秒   比我的檔案快一倍以上

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

回復 17# n7822123


這是我原來的方法,
但,,,'
1) 若行數太多, 連接字串可能超過長度, 尤其超過十萬行時, 每個數字都是六個字元
2) 連接字串本來就比較慢, 何況後面還要拆解一次

不過, 字典篏字典, 也不知可以容納多少個, 記憶體會不會掛???
沒有實測過~~~~

TOP

本帖最後由 singo1232001 於 2021-7-31 20:52 編輯

回復 19# 准提部林


之前做過測試
vba的字典沒有上限 純粹靠的是記憶體大小
只不過vba有個bug 在新增監看式的位置 只會顯示最多256個item值
但實際上 257以後沒顯示的 一樣確實有存在!

當初我也被這個bug 騙過 還在猶豫是否要繼續學字典 後來還好虛驚一場

這樣又讓我想起一條新出路
如果沒錯 資料量在更加龐大的情況 甚至字典 跟 陣列 做排序資料 還可以交互運用找到平衡點
字典嵌字典這招真的非常強大 應該可以玩很久!
想來測試一下 陣列裡面可以不可以嵌字典 如果可以的話 可玩性又高出許多
(看來是可以的,不過前面要加上set )
Sub ttt()
Dim ar
ReDim ar(5)
Set xD = CreateObject("Scripting.Dictionary")
Set ar(1) = xD
ar(2) = 123
End Sub



目前正在學習 二叉樹之類的遞迴方式 希望未來能實際應用上@@
這是在網路找到的資料 他展示了 兩種方式  遞迴 與 非遞迴的 排序方式 與前.中.後序遍歷
(簡體文 不排斥再看)
https://mp.weixin.qq.com/s?__biz=MzA3NTMzMjMyOA==&mid=2650919340&idx=1&sn=e5cf778df2f26e340fd3469d7a60785f&chksm=84875e2bb3f0d73d45172e70a3f202e404cbd21cbd4d26ad657c6dc9969fdf2eb6ab94cb9e65&scene=21#wechat_redirect
上面是第22篇
他還有第21篇跟 23篇
走投無路才找到的資料 哈哈(當初不知道如何下關鍵字)

TOP

        靜思自在 : 人要知福、惜福、再造福。
返回列表 上一主題