Board logo

標題: [發問] 找出重覆資料 [打印本頁]

作者: mdr0465    時間: 2021-3-2 14:54     標題: 找出重覆資料

各位大大,
我用有限的能力寫了一個"找出重覆資料的程式”, 但我有一些問題我未能解決,請各位幫忙

1.        在H欄,只顯示重覆的儲存格位置,而不顥示本身的儲存格位置
2.        在重覆的情況下, 比如F2格有”Y”的字,如何找出重覆的儲存格D86都可以有同樣的文字呢?
3.        在超過2個重覆的情況下,J 欄可以多重顯示A欄的名稱,

謝謝
作者: hcm19522    時間: 2021-3-2 18:59

https://blog.xuite.net/hcm19522/twblog/589639767
作者: mdr0465    時間: 2021-3-4 00:03

回復 2# hcm19522


    謝謝你的回覆,但可不可以用VBA解決我所有的問題,謝謝
作者: 軒云熊    時間: 2021-3-5 03:09

本帖最後由 軒云熊 於 2021-3-5 03:23 編輯

回復 3# mdr0465

有空幫我試試看 是不是你要的結果 感謝  有一個問題 就是資料太多 會等很久...因為迴圈太多了而且是直接輸入到儲存格 看看有沒有大大可以幫忙  

[attach]33095[/attach]
作者: mdr0465    時間: 2021-3-5 14:38

回復 4# 軒云熊


    軒云熊師兄
很感謝你的幫忙,為了更配合我的需要,但當中有些地方,我嘗試自行修改程式,但始終功力有限,我都失敗了,想再次向你指教
 
1.      如果在A欄的文字不是全部一樣, 當在D欄找出有相同的時候, I欄的儲存格能否做到全部顯示出A欄相對應的儲存格文字? 比例(H欄是D6,D4, 相對應是I欄是A,B)
 
2.      而當D欄找出相同的時候, F欄相的儲存格是有”Y”字的時候, 所有相同的儲存格都會同樣顯示一樣的文字,
 
萬分感謝你
作者: samwang    時間: 2021-3-5 16:12

回復 5# mdr0465

不太能理解您所描述的問題,可否請您直接將實際的需求附上解答而附檔上來
資料比數可以少一點
謝謝
作者: mdr0465    時間: 2021-3-5 16:57

回復 6# samwang


  SAMWANG 謝謝你幫忙, 是我表達能力不好,
請看附圖,希望你會明白我的意思,謝謝
作者: ML089    時間: 2021-3-5 19:43

回復 7# mdr0465
  1. Sub test()

  2.     Dim D As Object, R, x, k

  3.     Application.ScreenUpdating = False
  4.     [A2:A10000].EntireRow.Interior.ColorIndex = xlNone
  5.     [H2:J10000].Clear

  6.     Set D = CreateObject("Scripting.Dictionary")
  7.     For Each R In Range("D1").CurrentRegion.Columns(4).Cells
  8.         R.Interior.ColorIndex = xlNone
  9.         If Not D.Exists(R.Value) Then
  10.             Set D(R.Value) = R
  11.         Else
  12.             Set D(R.Value) = Union(D(R.Value), R)
  13.         End If
  14.     Next
  15.     [H1] = "電話重覆儲存格位置"
  16.     [I1] = "對應場的名稱"
  17.     For Each R In D.KEYS
  18.         If D(R).Cells.Count > 1 Then
  19.             D(R).EntireRow.Interior.ColorIndex = 6
  20.             For Each x In D(R)
  21.                 x位置 = ""
  22.                 x場地 = ""
  23.                 For Each k In D(R)
  24.                     If x.Address <> k.Address Then
  25.                         x位置 = x位置 & "," & k.Address(0, 0)
  26.                         x場地 = x場地 & "," & k.Offset(0, -3)
  27.                     End If
  28.                 Next
  29.                 x.Offset(0, 4) = Mid(x位置, 2, 99)
  30.                 x.Offset(0, 5) = Mid(x場地, 2, 99)
  31.             Next
  32.         End If
  33.     Next
  34.     Application.ScreenUpdating = True
  35. End Sub
複製代碼

作者: 軒云熊    時間: 2021-3-5 22:03

本帖最後由 軒云熊 於 2021-3-5 22:04 編輯

回復 7# mdr0465

建議你用  ML089版大 的修改 剛才測試 資料過多的話 不會太慢...而且邏輯很清楚
  1. Sub test()

  2.     Dim D As Object, R, x, k

  3.     Application.ScreenUpdating = False
  4.     [A2:A10000].EntireRow.Interior.ColorIndex = xlNone
  5.     [H2:J10000].Clear

  6.     Set D = CreateObject("Scripting.Dictionary")
  7.     For Each R In Range("D1").CurrentRegion.Columns(4).Cells
  8.         R.Interior.ColorIndex = xlNone
  9.         If Not D.Exists(R.Value) Then
  10.             Set D(R.Value) = R
  11.         Else
  12.             Set D(R.Value) = Union(D(R.Value), R)
  13.         End If
  14.     Next
  15.     [H1] = "電話重覆儲存格位置"
  16.     [I1] = "對應場的名稱"
  17.     For Each R In D.KEYS
  18.         If D(R).Cells.Count > 1 Then
  19.             D(R).EntireRow.Interior.ColorIndex = 6
  20.             For Each x In D(R)
  21.                 x位置 = ""
  22.                 x場地 = ""
  23.                 For Each k In D(R)
  24.                     If x.Address <> k.Address Then
  25.                         x位置 = x位置 & "," & k.Address(0, 0)
  26.                         x場地 = x場地 & "," & k.Offset(0, -3)
  27.                     End If
  28.                 Next

  29.                 x.Offset(0, 2) = "Y"

  30.                 x.Offset(0, 4) = Mid(x位置, 2, 99)
  31.                 x.Offset(0, 5) = Mid(x場地, 2, 99)
  32.             Next
  33.         End If
  34.     Next
  35.     Application.ScreenUpdating = True
  36. End Sub
複製代碼

作者: samwang    時間: 2021-3-5 23:21

回復 7# mdr0465


請測試看看,謝謝。

Sub test()
Dim xD, Arr, Brr(), i&, Ar, a&, b$, j%
Set xD = CreateObject("Scripting.Dictionary")
Arr = Range([F1], [a65536].End(3))
ReDim Brr(1 To UBound(Arr), 1 To 4)
For i = 1 To UBound(Arr)
    If xD.Exists(Arr(i, 4) & "") Then
        m = m + 1
        列 = xD(Arr(i, 4) & "")
        Brr(列, 3) = Brr(列, 3) & "_" & m
        Brr(列, 4) = Brr(列, 4) & "_" & Arr(i, 1)
    Else
        m = m + 1
        xD(Arr(i, 4) & "") = i
        Brr(m, 2) = Arr(i, 4)
        Brr(m, 3) = m
        Brr(m, 4) = Arr(i, 1)
    End If
Next

For i = 1 To UBound(Arr)
    For ib = 1 To UBound(Brr)
        pos = InStr(Brr(ib, 3), "_")
        If pos > 0 And Arr(i, 4) = Brr(ib, 2) Then
            Ar = Split(Brr(ib, 3), "_")
            For j = 0 To UBound(Ar)
                a = Split(Brr(ib, 3), "_")(j)
                b = Split(Brr(ib, 4), "_")(j)
                If i <> a Then
                    If Cells(i, 8) = "" Then
                        Cells(i, 8) = "D" & a
                        Cells(i, 9) = b
                        Rows(i).EntireRow.Interior.ColorIndex = 6
                    Else
                        Cells(i, 8) = Cells(i, 8) & "," & "D" & a
                        Cells(i, 9) = Cells(i, 9) & "," & b
                    End If
                End If
            Next
        End If
    Next
Next
End Sub
作者: 准提部林    時間: 2021-3-6 11:28

ARRAY 處理資料
RANGE-UNION填色
[attach]33103[/attach]
作者: mdr0465    時間: 2021-3-6 23:02

回復 8# ML089

ML089師兄,
真的謝謝你幫忙
作者: mdr0465    時間: 2021-3-6 23:04

回復 9# 軒云熊
   
軒云熊師兄,
感謝你百忙中幫忙,謝謝你
作者: mdr0465    時間: 2021-3-6 23:05

回復 10# samwang


   
Samsung 師兄,
萬分感謝你幫忙,謝謝
作者: mdr0465    時間: 2021-3-6 23:06

回復 11# 准提部林


  
准提部林師兄,
真的十分感激你的幫忙,謝謝你
作者: Andy2483    時間: 2023-5-31 16:28

回復 11# 准提部林


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

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

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


Sub TEST_A01()
Dim Arr, xD, i&, T$, T1$, T2$, SR, S, xR As Range, xU As Range
'↑宣告變數
Set xD = CreateObject("Scripting.Dictionary")
'↑令xD變數是 字典
With Range([J1], [A65536].End(3))
'↑以下是關於本表A~J欄儲存格的程序
     .EntireRow.Interior.ColorIndex = xlNone
     '↑令該區域全列底色是無色
     .Offset(1, 7).ClearContents
     '↑令該區域往下偏移1列,往右7欄區域儲存格清除內容
     [H1:J1] = Array("重覆位置", "重覆次數", "對應場名稱")
     '↑令[H1:J1]儲存格寫入列標題
     Arr = .Cells
     '↑令Arr變數是 二維陣列,以該區域儲存格值帶入陣列中
End With
For i = 2 To UBound(Arr)
'↑設順迴圈
    T = Arr(i, 4): T2 = Arr(i, 6)
    '↑令字串變數裝入陣列值
    xD(T) = Trim(xD(T) & " " & i)
    '↑令T變數當key,item是 自身連接空白字元,再連接i變數,所組成的新字串
    If T2 <> "" Then xD(T & "/y") = T2
    '↑如果T2變數不是空字元!就令T變數連接"/y"組成的新字串當key,
    'item是T2變數,納入xD字典中

Next i
For i = 2 To UBound(Arr)
'↑設順迴圈
    SR = Split(xD(Arr(i, 4) & ""), " ")
    '↑令SR變數是一維陣列:以陣列第4欄值提取xD字典item,
    '再以空白字元分割成為一維陣列

    If UBound(SR) <= 0 Then GoTo i01
    '↑如果SR陣列最後一個索引號<=0,就跳到標示i0位置繼續執行
    T1 = "": T2 = "": Set xR = Range("D" & i)
    '↑令T1,T2變數是 空字元,令xR變數是 D欄i列儲存格
    For Each S In SR
    '↑設逐項迴圈!令S變數是SR陣列值之一
        If Val(S) <> i Then
        '↑如果S變數轉數值後 與i變數不同
           T1 = T1 & "," & "D" & S
           '↑令T1變數是 自身連接逗號,再連接"D",最後連接S變數成新字串
           T2 = T2 & "," & Arr(S, 1)
           '↑令T2變數是 自身連接逗號,再連接S變數列第1欄Arr陣列值
        End If
    Next S
    Arr(i, 6) = xD(Arr(i, 4) & "/y")
    '↑令迴圈列第6欄Arr陣列值是 迴圈列第6欄Arr陣列值連接"/y"成的新字串,查
    '查xD字典回傳的item值

    Arr(i, 8) = Mid(T1, 2)
    '↑令迴圈列第8欄Arr陣列值是 T1變數取第2字以後的全部字串
    Arr(i, 9) = UBound(SR) + 1
    '↑令迴圈列第9欄Arr陣列值是 SR陣列最大索引號+1
    Arr(i, 10) = Mid(T2, 2)
    '↑令迴圈列第10欄Arr陣列值是 T2變數取第2字以後的全部字串
    If xU Is Nothing Then Set xU = xR Else Set xU = Union(xU, xR)
    '↑如果xU變數是空的,就令xU變數是xR變數,否則就將xR變數納入xU儲存格集裡
i01: Next i
[a1].Resize(UBound(Arr), UBound(Arr, 2)) = Arr
'↑令Arr陣列從[A1]開始寫入範圍儲存格中
If Not xU Is Nothing Then xU.EntireRow.Interior.ColorIndex = 6
'↑如果xU變數不是空的,就令該xU儲存格集所在的列整列底色為黃色
End Sub




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