Sub TEST()
Dim Arr, Brr, xD, i&, T1$, T2$, N1&, N2&, R&, C&
ActiveSheet.UsedRange.Offset(, 4).ClearContents
Set xD = CreateObject("Scripting.Dictionary")
Arr = Range([B1], [A65536].End(xlUp))
ReDim Brr(1 To UBound(Arr), 1 To 200)
Brr(1, 1) = "重複值"
For i = 2 To UBound(Arr)
T1 = Arr(i, 1): T2 = Arr(i, 2)
If T1 = "" Or T2 = "" Then GoTo 101
R = xD(T1): C = xD(T2)
If R = 0 Then N1 = N1 + 1: R = N1: xD(T1) = N1
If C = 0 Then N2 = N2 + 1: C = N2: xD(T2) = N2
Brr(R + 1, 1) = T1: Brr(1, C + 1) = T2
Brr(R + 1, C + 1) = T2
101: Next i
If N1 = 0 Or N2 = 0 Then Exit Sub
[E1].Resize(R + 1, C + 1) = Brr
End Sub
Sub L2()
Dim Arr, Brr, K, D As Object
Set D = CreateObject("Scripting.Dictionary")
[E1].CurrentRegion.ClearContents
Arr = Range([B1], [A65536].End(xlUp))
For R = 2 To UBound(Arr)
編$ = Arr(R, 1)
D(編) = D(編) & "," & Arr(R, 2)
Next
'===========
Brr = Array("重複值", "A", "B", "C", "D", "E", "F", "G")
[E1].Resize(1, UBound(Brr) + 1) = Brr
ReDim Brr(1 To D.Count, 1 To UBound(Brr))
For Each Key In D.keys
K = Split(D(Key), ",")
If UBound(K) > 1 Then
Ro% = Ro% + 1
Brr(Ro, 1) = Key
For C = 1 To UBound(K) 'ASC("A")=65
Brr(Ro, Asc(UCase(K(C))) - 63) = K(C)
Next
End If
Next
[E2].Resize(UBound(Brr), UBound(Brr, 2)) = Brr
End Sub
2.比較難懂的寫法~1個For迴圈
(實測執行速度沒有比較快..........)
Sub L1()
Dim Arr, Brr, D As Object
Set D = CreateObject("Scripting.Dictionary")
[E1].CurrentRegion.ClearContents
Arr = Range([B1], [A65536].End(xlUp))
Brr = Array("重複值", "A", "B", "C", "D", "E", "F", "G")
[E1].Resize(1, UBound(Brr) + 1) = Brr
ReDim Brr(1 To UBound(Arr), 1 To UBound(Brr))
For R = 2 To UBound(Arr)
編$ = Arr(R, 1): 組$ = D(編)
If 組 = "" Then
D(編) = Arr(R, 2)
ElseIf Val(組) = 0 Then 'ASC("A")=65
Ro% = Ro% + 1: Brr(Ro, 1) = 編: D(編) = Ro
Brr(Ro, Asc(UCase(組)) - 63) = 組
Brr(Ro, Asc(UCase(Arr(R, 2))) - 63) = Arr(R, 2)
ElseIf Val(組) >= 1 Then
Brr(Val(組), Asc(UCase(Arr(R, 2))) - 63) = Arr(R, 2)
End If
Next
[E2].Resize(UBound(Brr), UBound(Brr, 2)) = Brr
End Sub作者: 准提部林 時間: 2020-4-6 16:29
沒注意要"重覆"的:
Sub TEST()
Dim Arr, Brr, xD, i&, T1$, T2$, N1&, N2&, R&, C&, U&
ActiveSheet.UsedRange.Offset(, 4).ClearContents
Set xD = CreateObject("Scripting.Dictionary")
Arr = Range([B1], [A65536].End(xlUp))
ReDim Brr(1 To UBound(Arr), 1 To 200)
Brr(1, 1) = "重複值"
For i = 2 To UBound(Arr)
T1 = Arr(i, 1): T2 = Arr(i, 2)
If T1 = "" Or T2 = "" Then GoTo 101
C = xD(T2)
If C = 0 Then N2 = N2 + 1: C = N2: xD(T2) = C: Brr(1, C + 1) = T2
U = xD(T1 & "/")
If U = 0 Then xD(T1 & "/") = C: GoTo 101
R = xD(T1)
If R = 0 Then N1 = N1 + 1: R = N1: xD(T1) = R: Brr(R + 1, 1) = T1
Brr(R + 1, C + 1) = T2
If U > 0 Then Brr(R + 1, U + 1) = Brr(1, U + 1): U = -99
101: Next i
If N1 = 0 Or N2 = 0 Then Exit Sub
With [E1].Resize(N1 + 1, N2 + 1)
.Value = Brr
.Sort Key1:=.Item(1), Order1:=xlAscending, Header:=xlYes
End With
End Sub
Option Explicit
Sub TEST_1()
Dim Brr, Crr, Z, i&, R&, C%, Y&, X%, T$, T1$, T2$, V1%, V2%, Tr&
Set Z = CreateObject("Scripting.Dictionary")
Brr = Range([B2], [A65536].End(xlUp))
ReDim Crr(100, 100)
For i = 1 To UBound(Brr)
T1 = Brr(i, 1): T2 = Brr(i, 2): T = Z(T1 & "/t"): Tr = Z(T1 & "/tr")
V1 = Z(T1 & "/r"): V2 = Z(T2 & "/c"): R = Z(T1): C = Z(T2)
If T1 = "" Or T2 = "" Then GoTo i01
If R = 0 Then
Y = Y + 1
Z(T1) = Y
Z(T1 & "/r") = 1
Z(T1 & "/t") = T2
Z(T1 & "/tr") = IIf(V2 = 0, X + 1, Z(T2))
End If
If C = 0 Then
X = X + 1
Z(T2) = X: C = X
Z(T2 & "/c") = 1
Crr(0, X) = T2
End If
Crr(R * -(V1 = 1), 0) = T1
Crr(R * -(V1 = 1), C) = T2
If T <> "" Then Crr(R, Tr) = T: Z(T1 & "/t") = ""
i01: Next
If X = 0 Or Y = 0 Then Exit Sub
Crr(0, 0) = "重複值"
With [E10].Resize(Y + 1, X + 1)
.Value = Crr: .Sort Key1:=.Item(1), Order1:=1, Header:=1
End With
Set Z = Nothing: Erase Brr, Crr
End Sub作者: singo1232001 時間: 2023-11-10 23:21
Sub test()
Set CN = CreateObject("adodb.connection"): V = Application.Version
If V >= 12 Then C = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;"
If V < 12 Then C = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;"
CN.Open C & "Data Source=" & ThisWorkbook.FullName:
With ActiveSheet: .Range("E:Z").ClearContents
q = "select distinct 組別 from [" & .Name & "$A1:B] order by 組別"
ar = CN.Execute(q).getrows
.[F1].Resize(1, UBound(ar, 2) + 1) = ar
q = "select 編號 from [" & .Name & "$A1:A] group by 編號 "
.[E2].CopyFromRecordset CN.Execute(q & "having count(*) > 1 order by 編號")
.[E1] = "重複值": w = 6
For Each Z In ar
o = "select b.組別 from [" & .Name & "$E1:E] as a left join ( "
o = o & "select * from [" & .Name & "$A1:B] where 組別='" & Z & "') as b on a.重複值 = b.編號"
.Cells(2, w).CopyFromRecordset CN.Execute(o): w = w + 1
Next: End With
End Sub
[attach]36993[/attach]