Board logo

標題: 如何判斷為同一組 [打印本頁]

作者: s7659109    時間: 2018-7-31 11:40     標題: 如何判斷為同一組

請問,如何依A,B及D欄為條件,判斷是否為同一組?
作者: li_hsien    時間: 2018-7-31 11:44

回復 1# s7659109

根據附件我看不太懂@@

第2列、第12列、第13列 為什麼都是NO1?

對於"同一組"有明確的定義嗎?
作者: a5007185    時間: 2018-7-31 13:51

本帖最後由 a5007185 於 2018-7-31 13:53 編輯

回復 1# s7659109

我是用VBA處理的,
請參考以下程式碼。
  1. Sub NumberCode()
  2.     Dim i%, Str$, ArrStr$
  3.     i = 2
  4.     ArrStr = "" '清空已記錄到的條件
  5.     Do Until Range("C" & i) = ""
  6.         '將A欄、B欄、D欄合併為一個字串作為條件
  7.         Str = Range("A" & i) & Range("B" & i) & Range("D" & i)
  8.         '若該條件未記錄過,則記錄之。
  9.         If InStr("," & ArrStr & ",", "," & Str & ",") = 0 Then ArrStr = ArrStr & "," & Str
  10.         '撈出Str在陣列ArrStr中的索引值
  11.         Range("F" & i) = "No. " & UBound(Split(Split(ArrStr, Str)(0), ","))
  12.         i = i + 1
  13.     Loop
  14. End Sub
複製代碼

作者: s7659109    時間: 2018-7-31 15:35

本帖最後由 s7659109 於 2018-7-31 15:37 編輯

問題:
條件:當a欄b欄及d欄一致時,才給同一編號,測試error
作者: naruto018    時間: 2018-7-31 15:39

回復 1# s7659109

填入F2,其餘下拉
  1. =IF(COUNTIFS($A$1:A1,A2,$B$1:B1,B2,$D$1:D1,D2)>0,LOOKUP(1,0/(($A$1:A1=A2)*($B$1:B1=B2)*($D$1:D1=D2)),$F$1:F1),"NO"&SUMPRODUCT(1/COUNTIF($F$1:F1,$F$1:F1)))
複製代碼

作者: s7659109    時間: 2018-7-31 15:43

因原始資料有8000筆,希望以vba解決
作者: s7659109    時間: 2018-7-31 15:54

函數測試仍error
作者: stillfish00    時間: 2018-7-31 17:27

回復 7# s7659109
你給錯條件了,你再看清楚一點。。。
作者: s7659109    時間: 2018-7-31 18:51

以no1為例第2列至第12列都是同組,其中d欄cr(借方),dr(貸方),確實以:a欄b欄及d欄為判讀要件
已更正對照內容了
作者: s7659109    時間: 2018-7-31 18:52

以no1為例第2列至第12列都是同組,其中d欄cr(借方),dr(貸方),確實以:a欄b欄及d欄為判讀要件
作者: faye59    時間: 2018-7-31 22:00

回復 10# s7659109


    以no1為例第2列至第12列都是同組,其中d欄cr(借方),dr(貸方),確實以:a欄b欄及d欄為判讀要件


參考你的附檔
1.同組標同一編號(條件為a:b:d相同)
2.希望結果(條件為a:b相同)
我的理解是這樣...
依照你的希望結果d欄位沒有參考的條件...
dr cr不管哪個都一樣歸類同組,
a與b成立就歸類同組了。

借3#大大程序修改,
這樣就跟你"希望結果"一樣了!?
  1. Sub NumberCode()
  2.     Dim i%, Str$, ArrStr$
  3.     i = 2
  4.     ArrStr = "" '清空已記錄到的條件
  5.     Do Until Range("C" & i) = ""
  6.         '將A欄、B欄、D欄合併為一個字串作為條件
  7.         Str = Range("A" & i) & Range("B" & i) '& Range("D" & i)
  8.         '若該條件未記錄過,則記錄之。
  9.         If InStr("," & ArrStr & ",", "," & Str & ",") = 0 Then ArrStr = ArrStr & "," & Str
  10.         '撈出Str在陣列ArrStr中的索引值
  11.         Range("F" & i) = "No. " & UBound(Split(Split(ArrStr, Str)(0), ","))
  12.         i = i + 1
  13.     Loop
  14. End Sub
複製代碼

作者: s7659109    時間: 2018-8-1 09:09

可以了,但如果超過百萬row,如何優化,加快速度,如附檔案
作者: a5007185    時間: 2018-8-1 22:45

回復 12# s7659109

如果是上百萬的,
我想如果是透過Excel還是需要一點時間,
我不太清楚你原始資料上百萬筆是什麼樣的狀況,
但是我將你原本的範例用自動填滿至Excel最大行數 1,048,576,
試著運作的結果大致上花了快兩分鐘的時間,
我想如果還需要減少運作時間,
可能你需要考慮其他語言的協助,
這樣可能對於你來講比較實用。

另外我想確定一下你附檔的用意,
我不太清楚你想表達的是什麼,
我不知道這和你原本的問題有什麼關聯性。
作者: s7659109    時間: 2018-8-2 07:29

需要與vlookup搭配使用,謝謝你的幫忙。
作者: s7659109    時間: 2018-8-2 07:30

也謝謝邏輯大大。




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