Board logo

標題: [發問] 雙條件搜尋與總途程公式 [打印本頁]

作者: adam2010    時間: 2021-6-13 02:10     標題: 雙條件搜尋與總途程公式

系統WIP資料只有途程編號,想要知道目前WIP已經生產到第幾道途程&總共有幾個途程
目前是用下圖的公式,但因為資料量愈來愈大(料號有上千筆*途程約35~65不等)導致有時開啟檔案會很緩慢
想請教各位高手有無其他較不吃資源的公式或者其他方法(或者是要使用巨集跑完變成文字?)
1.途程資料
[attach]33389[/attach]
2.WIP(D欄是目前的公式)
[attach]33390[/attach]
[attach]33391[/attach]
作者: 准提部林    時間: 2021-6-13 09:57

料號有上千筆*途程約35~65不等
__資料大約3~6萬行

可用定義名稱, 但不見得快多少, offset本身就會干擾工作表操作~~
用vba吧!
作者: 准提部林    時間: 2021-6-13 10:23

兩種方式:
[attach]33392[/attach]
作者: adam2010    時間: 2021-6-13 14:46

回復 2# 准提部林

版主真是太強大了,不過巨集內容看不太懂我在是是看套到正式的檔案看看,謝謝
作者: hcm19522    時間: 2021-6-13 16:06

本帖最後由 hcm19522 於 2021-6-13 16:36 編輯

D2=LOOKUP(,0/((A2=途程資料!A:A)*(B2=途程資料!C:C)),COUNTIF(OFFSET(途程資料!A$2,,,ROW($1:$1998)),途程資料!A$2:A$1999))-1&"/"&COUNTIF(途程資料!A:A,A2)

https://blog.xuite.net/hcm19522/twblog/589831005
作者: Andy2483    時間: 2023-5-25 09:51

回復 3# 准提部林


    謝謝論壇,謝謝前輩
後學藉此帖學習前輩VBA方案,方案學習心得如下,請前輩再指導

執行前:
[attach]36432[/attach]

執行結果:
[attach]36433[/attach]


Sub TEST_A1()
Dim Arr, xD, T1$, T2$, i&
'↑宣告變數:(Arr,xD)是通用型變數,(T1,T2)是字串變數,i是長整數變數
Set xD = CreateObject("Scripting.Dictionary")
'↑令xD這通用型變數是 字典
Arr = Range(Sheet1.[c1], Sheet1.Cells(Rows.Count, 1).End(xlUp))
'↑令Arr這通用型變數是 二維陣列,以表1的A~C欄儲存格值帶入陣列中
For i = 2 To UBound(Arr)
'↑設順迴圈
    T1 = Arr(i, 1): T2 = Arr(i, 3)
    '↑令T1這字串變數是 i迴圈列第1欄Arr陣列值
    xD(T1) = xD(T1) + 1
    '↑令以T1變數當key,item累加1,納入xD字典裡
    xD(T1 & "/" & T2) = Arr(i, 2)
    '↑令T1變數連接"/",再連接T2變數 所組成的新字串當key,
    'item是 i迴圈列第2欄Arr陣列值

Next i
Arr = Range(Sheet2.[c1], Sheet2.Cells(Rows.Count, 1).End(xlUp))
'↑令Arr陣列倒掉舊陣列值,換裝表2的A~C欄儲存格值
For i = 2 To UBound(Arr)
'↑設順迴圈
    T1 = xD(Arr(i, 1) & "")
    '↑令T1變數是 (以i迴圈列Arr陣列值)查 xD字典回傳item值
    'Arr(i, 1) & "":陣列值加空字元,定義讓它是字串 查字典

    T2 = xD(Arr(i, 1) & "/" & Arr(i, 2))
    '↑令T2變數是 i迴圈列第1欄Arr陣列值連接"/",再連接i迴圈列第2欄Arr陣列值,
    '所組成的新字串

    Arr(i - 1, 1) = T2 & IIf(T2 = "", "", "/") & T1
    '↑令T2變數連接"/"再連接T1變數所組成的新字串,
    '寫到Arr陣列裡(覆蓋掉原陣列值)

Next i
With Sheet2.[e2].Resize(UBound(Arr) - 1)
'↑以下是關於[E2]儲存格擴展向下Arr陣列最大索引號-1格,
'因為有效結果值是從1索引號開始放,所以要-1

     .NumberFormatLocal = "@"
     '↑令這範圍儲存格格式是 文字
     .Value = Arr
     '↑令這範圍儲存格以Arr陣列值寫入儲存格裡,超過這範圍的陣列值忽略
End With
End Sub
作者: Andy2483    時間: 2023-5-25 11:00

謝謝論壇,謝謝各位前輩
後學藉此帖練習陣列與字典,學習方案如下,請各位前輩指教

Option Explicit
Sub TEST()
Dim Brr, Crr, Y, i&, TT$, T1$, T2$, T3$
'↑宣告變數
Set Y = CreateObject("Scripting.Dictionary")
'↑令Y變數是 字典
Brr = Range([途程資料!C1], [途程資料!A65536].End(3))
'↑令Brr變數是 二維陣列,以A~C欄儲存格值帶入陣列中
For i = UBound(Brr) To 2 Step -1
'↑設逆迴圈
   T1 = Brr(i, 1): T2 = Brr(i, 2): T3 = Brr(i, 3): TT = T1 & "|" & T3
   '↑令變數裝入陣列值或陣列值所組成的字串
   If Y(T1) = "" Then Y(T1) = T2
   '↑如果T1變數查字典 其item值是空的!就令其item值是 T2變數(最大途程序號)
   Y(TT) = T2 & "/" & Y(T1)
   '↑令TT這組合字串當key,item是 T2變數連接 "/" 再連接,
   '再連接以T1變數查Y字典得到的item值所組成的新字串

Next
Brr = Range([WIP!C2], [WIP!A65536].End(3))
'↑令Brr陣列倒掉舊陣列值,換裝(WIP)表的A~C欄儲存格值
ReDim Crr(1 To UBound(Brr), 1 To 1)
'↑宣告Crr變數是 二維空陣列,縱向範圍同Brr陣列,橫向1~1
For i = 1 To UBound(Brr)
'↑設順迴圈
   Crr(i, 1) = Y(Brr(i, 1) & "|" & Brr(i, 2))
   '↑令i迴圈列第1欄Crr陣列值是 第1欄與第2欄Brr迴圈陣列值,
   '以"|"間隔 所組成的新字串,查Y字典所得到的item值

Next
With [WIP!F2].Resize(UBound(Crr), 1)
'↑以下是關於[F2]儲存格擴展向下Crr陣列最大索引號列
     .NumberFormatLocal = "@"
     '↑令這範圍儲存格格式是 文字
     .Value = Crr
     '↑令這範圍儲存格以Crr陣列值寫入儲存格裡,超過這範圍的陣列值忽略
End With
Set Y = Nothing: Erase Brr, Crr
'↑令釋放變數
End Sub




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