Board logo

標題: [發問] 如何去對應出總表中互相替代的品號(附件) [打印本頁]

作者: abc9gad2016    時間: 2016-9-9 00:26     標題: 如何去對應出總表中互相替代的品號(附件)

想請問大大,
我想在總表.xlsx中的空白欄位,可以從替代表.xlsx中,找出總表內的品號,是互相替代的關係
舉例:總表的第四列與第五列查看替代表後,可得知是互為替代,顯示的方式不一定要寫替代,也可以用數字代替
(但是每一組替代的數字要不同,才能區分,例如第4.5列替代 都寫1,第30.31.32列替代 則寫2)

不知道函數有沒有辦法計算出來,希望能夠從中學習,之後若遇到類似的問題可以自己解決>"<

感謝各位大大

[attach]25190[/attach]
作者: ML089    時間: 2016-9-9 08:50

回復 1# abc9gad2016


D2 =IFERROR(MATCH(B2,[替代表.xlsx]Sheet1!$B:$B,),IFERROR(MATCH(INDEX([替代表.xlsx]Sheet1!$B:$B,MATCH(B2,[替代表.xlsx]Sheet1!$C:$C,)),[替代表.xlsx]Sheet1!$B:$B,),""))
下拉

相同號碼為替代品
作者: abc9gad2016    時間: 2016-9-9 17:29

回復 2# ML089

版大你好,輸入下去發現有一些地方有問題 抱歉沒說明白,想再做請教

因為替代表中,B欄可能有重複料號,但是對應替代料C欄是不同的料號(或者相反)
例如以下,其實是替代 用公式套入會顯示不同數字
DNZ132540
DNZ13250Z

另外還有一種比較麻煩的事,A替代B、B替代C  那A就列入替代C
舉例以下:其實是相互替代的
SD4231700
SD4230501
SD4023050

感激不盡
作者: ML089    時間: 2016-9-9 23:53

回復 3# abc9gad2016

請在檔案上標示幾個情況及你想要的顯示,這樣比較容易懂。
作者: abc9gad2016    時間: 2016-9-10 09:32

回復 4# ML089


請參考附件,想要得到像總表D欄的結果(但數字不用要照順序,只要區分出每個替代的數字是不同的即可)
[attach]25203[/attach]
作者: abc9gad2016    時間: 2016-9-11 09:26

請問大大,如果函數真的沒辦法得到正確的結果,VBA可以做得出來嗎
作者: ML089    時間: 2016-9-12 14:17

回復 6# abc9gad2016

目前公式只能處理2階完成99%正確,若要多階(也不知會有多少階)可能太耗時。
晚上我再使用輔助欄位處理看看。
使用VBA應該是比較容易。
作者: 准提部林    時間: 2016-9-12 14:40

本帖最後由 准提部林 於 2016-9-12 14:44 編輯

依替代邏輯, 以下是否為共同群組?
群組(1)
SBP525320  SBP525321
SBP636650  SBP636750
SBP636750  SBP800800
SBP636750  SBP735823
SBP800800  SBP824323
SBP800800  SBP170550
SBP824323  SBP821250
SBP824323  SBP525320
SBP800800  SBP636750
SBP636650  SBP800800
SBP735823  SBP800800
SBP525320  SBP824323
SBP525321  SBP525320
群組字串:
SBP636650/SBP636750/SBP800800/SBP735823/SBP824323/SBP170550/SBP821250/SBP525320/SBP525321

群組(2)
SBM511636/SBM532163/SBM312480/SBM511637/SBM51163F/SBM511670/SBM511660/SBM511671/SBM516250/SBM511672/SBM551621/SBM51163I/SBM503216/SBM516200/SBM151216
作者: 准提部林    時間: 2016-9-12 15:38

為方便,將兩檔併為一檔:
[attach]25227[/attach]

程式碼對新手來說有點複雜,
沒時間,就不加註解,
替代邏輯若不符合原意,也沒時間再重寫!
作者: abc9gad2016    時間: 2016-9-12 20:43

回復 9# 准提部林

感謝版大,這正是小弟想要的結果!!

不知道版大熟不熟悉坊間的EXCEL課程,有沒有推薦上課的老師

希望也能將EXCEL給學好學滿

再次感謝
作者: abc9gad2016    時間: 2016-9-12 20:54

回復 7# ML089

感謝ML版大的幫助,小弟原本嘗試用index與match函數求解,但礙於程度不佳,也沒辦法帶出完整的替代關係,總是發現遺漏的地方

下面准提部林版大的VBA已幫助我所需要的結果,也相當感謝ML版大的幫忙,感謝!!

應該是很簡單的問題被我講得這麼複雜,後來想想其實問題可以簡單化如下
[attach]25230[/attach]
作者: 准提部林    時間: 2016-9-13 11:33

本帖最後由 准提部林 於 2016-9-13 11:49 編輯

回復 10# abc9gad2016


檢測一下資料,發現〔替代表〕C721 的 DN6818800 後面含有一個不可見字元及空白字元,
這會造成資料比對上的錯誤,須注意∼∼

以下程式碼可以試試看,清除BC欄空白字元及不可見字元(只針對AscW(160))
Sub UURR()
[B:C].Replace ChrW(160), "", Lookat:=xlPart
[B:C].Replace " ", "", Lookat:=xlPart
End Sub

另外,替代群組若太多品項,造成字串太長,可能也會有比對出錯的問題,
我沒有去研究字典檔的key及item最多的字元限制(目前測過1000個字元還可以)!!!

版上使用EXCEL的人,大部份是用到哪學到哪,有問題就是買些書.GOOGLE,或VBA內建說明檔找材料,
幾乎都是靠時間累積經驗的,這急不來∼∼
作者: Andy2483    時間: 2023-4-28 16:18

回復 9# 准提部林


    謝謝前輩
後學藉此範例學習陣列與字典,很多還看不懂,暫學習心得如下,請前輩再指導

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

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


Sub Get_Group()
Dim Arr, Brr, Q, xD1, xD2, A$, b$, T$, TT$, S$, i&, N&, R&
'↑宣告變數:(Arr,Brr,Q,xD1,xD2)是通用型變數,(A,b,T,TT,S)是字串變數,
'(i,N,R)是長整數變數

Arr = Range([替代表!B2], [替代表!C1].Cells(Rows.Count, 1).End(xlUp))
'↑令Arr這通用型變數是 二維陣列,以替代表[B2]到 C欄最後有內容儲存格值帶入
Set xD1 = CreateObject("Scripting.Dictionary")
'↑令xD1這通用型變數是 字典
For i = 1 To UBound(Arr)
'↑設順迴圈!i從1到 Arr陣列縱向最大索引列號
    A = Arr(i, 1): b = Arr(i, 2): TT = ""
    '↑令A這字串變數是 i迴圈列第1欄Arr陣列值,
    '令b這字串變數是 i迴圈列第2欄Arr陣列值,令TT這字串變數是 空字元

    If A <> "" And b <> "" Then
    '↑如果A變數不是 空字元,且b變數也不是 空字元??
       T = xD1(A) & " " & xD1(b) & " " & A & " " & b
       '↑令T變數是 A變數當key查xD1字典的item值,連接空白字元,
       '連接b變數當key查xD1字典的item值,連接空白字元,連接A變數,
       '連接空白字元,最後連接b變數所組成的新字串

       For Each Q In Split(T, " ")
       '↑設逐項迴圈!令Q這通用型變數是 以空白字元切割T變數的一維陣列,其中一子
           If InStr(TT, Q) = 0 Then TT = Trim(TT & " " & Q)
           '↑如果TT變數字串裡沒有包含Q變數字串!就令TT變數是
           '(自身連接 空字元,再連接 Q變數)後去頭尾空白字元所組成的新字串

       Next
       For Each Q In Split(TT, " ")
       '↑設逐項迴圈!令Q這通用型變數是 以空白字元切割TT變數的一維陣列,其中一子
           If Q <> "" Then xD1(Q) = TT
           '↑如果Q變數不是 空字元!就令Q變數當key,item是 TT變數納入xD1字典中
       Next
    End If
Next i
'↑把所有有血緣關係的人都發一張戶口名簿
ReDim Brr(1 To UBound(Arr), 0)
'↑宣告Brr這通用型變數是二維陣列,縱向範圍從1到 Arr縱向最大索引列號,
'橫向範圍從0到0

For i = 1 To UBound(Arr)
'↑設順迴圈!i從1到 Arr縱向最大索引列號
    Brr(i, 0) = xD1(Arr(i, 1))
    '↑令i迴圈列0索引號欄陣列值是 以i迴圈列第1欄Arr陣列值查xD1字典得item值
Next i
[替代表!D2].Resize(UBound(Arr)) = Brr
'↑令替代表[D2]向下擴展 Arr陣列縱向最大索引號列數,
'這範圍儲存格值以Brr陣列值帶入
'------------------------------------------------------


Arr = Range([B2], Cells(Rows.Count, 2).End(xlUp))
'↑令Arr變數換裝現用工作表[B2]到 B欄最後有內容儲存格值
Set xD2 = CreateObject("Scripting.Dictionary")
'↑令xD2這通用型變數是 另一個字典
For i = 1 To UBound(Arr)
'↑設順迴圈!i從1到 Arr縱向最大索引列號
    T = xD1(Arr(i, 1))
    '↑令T變數是以i迴圈列第1欄Arr陣列值查 xD1字典得item值
    If T <> "" Then
    '↑如果T變數不是 空字元?
       S = xD2(T):  Q = S
       '↑令S這字串變數是 以T變數查 xD2字典得item值
       '令Q變數是 S變數值

       If S = "A" Then N = N + 1: Q = N
       '↑如果S變數是 "A"字元!就令N變數累加1,令Q變數是 N變數值
       If S = "" Then Q = "A"
       '↑如果S變數是空字元!就令Q變數是 "A"字元
       xD2(T) = Q
       '↑令以T變數當key,item是Q變數,納入xD2字典
    End If
Next

ReDim Brr(1 To UBound(Arr), 1)
'↑宣告Brr這通用型變數是二維陣列,縱向範圍從1到 Arr縱向最大索引列號,
'橫向範圍從0到1

For i = 1 To UBound(Arr)
'↑設順迴圈!i從1到 Arr縱向最大索引列號
    T = xD1(Arr(i, 1))
    '↑令T變數是 i迴圈列第1欄Arr陣列值查 xD1字典得item值
    Q = Val(xD2(T))
    '↑令Q變數是 以T變數查 xD2字典得item值轉成數值
    If Q > 0 Then Brr(i, 0) = Q: Brr(i, 1) = T
    '↑如果Q變數大於 0!就令i迴圈列0索引號欄Brr陣列值是 Q變數,
    '令i迴圈列第1欄Brr陣列值是 T變數值

Next

[D2:E2].Resize(UBound(Arr)) = Brr
'↑令[D2:E2]向下擴展Arr陣列縱向索引列號數範圍儲存格值,以Brr陣列值帶入
End Sub




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