Bạn muốn diễn đạt cho mọi người hiểu được ý bạn thì bạn nên giải thích kèm kết quả cụ thể cho 1 vài ô trong file xem sao. Nói mơ hồ vậy sao hiểu được đúng ý bạn. Làm sai lại mất công.Tách từng chuỗi số trong A1 và A2 và lập tổ hợp (ko lặp) 2 phần tử lại với nhau. Vd A1 là 321, A2 la 457. Có các tổ hợp là: 14,15,17,24,25,27,34,35,37. Sau đó đếm số lần của các số được tổ hợp lại và điền vào dãy từ 00 đến 99.
Tách từng chuỗi số trong A1 và A2 và lập tổ hợp (ko lặp) 2 phần tử lại với nhau. Vd A1 là 321, A2 la 457. Có các tổ hợp là: 14,15,17,24,25,27,34,35,37. Sau đó đếm số lần của các số được tổ hợp lại và điền vào dãy từ 00 đến 99.
Function UniqueString(Str As String) As String
Dim i As Long, Mstr As String
Str = Replace(Str, " ", "")
With CreateObject("Scripting.Dictionary")
For i = 1 To Len(Str)
Mstr = Mid(Str, i, 1)
If Not .Exists(Mstr) Then
.Add Mstr, ""
UniqueString = UniqueString & Mstr
End If
Next
End With
End Function
Function DEM(Rng As Range, Dk As String) As Long
Dim i As Long, j As Long, Arr, iStr As Long, jStr As Long
Dim Str1 As String, Str2 As String, Tmp As String, CountStr As Long
Arr = Rng.Value
For i = 1 To UBound(Arr, 1) - 1
For j = i + 1 To UBound(Arr, 1)
Str1 = UniqueString(CStr(Arr(i, 1)))
Str2 = UniqueString(CStr(Arr(j, 1)))
For iStr = 1 To Len(Str1)
For jStr = 1 To Len(Str2)
Tmp = Mid(Str1, iStr, 1) & Mid(Str2, jStr, 1)
If Tmp = Dk Then CountStr = CountStr + 1
Next
Next
Next
Next
DEM = CountStr
End Function
Làm thí thí chứ chưa thật hiểu cái yêu cầu "không lặp" là sao.Đúng ý mình rồi. Số 33, 44... cũng được coi là một cặp tổ hợp. Mình không cần liệt kê chỉ cần đếm thôi. Vd ở 2 ô đầu:
70 70 71 75 76 77 78 79
90 90 91 95 96 97 98 99
20 20 21 25 26 27 28 29
................................
60 60 61 65 66 67 68 69
Khi đếm thì 07 và 70 được coi là 07, tương tự với 02 và 06, 09. Như vậy ở trường hợp 2 ô đầu các số 02,06,07,09 đều có 2 lần. Làm tiếp các ô còn lại A1 với A3,A4..đến cuối cùng A4 tổ hợp với A5.Mình đính kèm bảng liệt kê để các bạn tiện theo dõi.
Public Sub GPE_()
Dim Dic As Object, sArr(), Tem As String, dArr(1 To 100, 1 To 2)
Dim I As Long, J As Long, Dong1 As Long, Dong2 As Long, K As Long
Set Dic = CreateObject("Scripting.Dictionary")
sArr = Range([A1], [A65000].End(xlUp)).Value
For Dong1 = 1 To UBound(sArr, 1) - 1
For Dong2 = Dong1 + 1 To UBound(sArr, 1)
For I = 1 To Len(sArr(Dong1, 1))
For J = 1 To Len(sArr(Dong2, 1))
If Mid(sArr(Dong2, 1), J, 1) > Mid(sArr(Dong1, 1), I, 1) Then
Tem = Val(Mid(sArr(Dong1, 1), I, 1) & Mid(sArr(Dong2, 1), J, 1))
Else
Tem = Val(Mid(sArr(Dong2, 1), J, 1) & Mid(sArr(Dong1, 1), I, 1))
End If
If Not Dic.Exists(Tem) Then
K = K + 1
Dic.Add Tem, K
dArr(K, 1) = Tem: dArr(K, 2) = 1
Else
dArr(Dic.Item(Tem), 2) = dArr(Dic.Item(Tem), 2) + 1
End If
Next J
Next I
Next Dong2
Next Dong1
[G5].Resize(K).NumberFormat = "00"
[G5].Resize(K, 2).Value = dArr
[G5].Resize(K, 2).Sort Key1:=[G5]
Set Dic = Nothing
End Sub