Tổ hợp trong excel

Chia sẻ bởi:hands
★★★★★
Quảng cáo

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ôi thử cắt nghĩa lại xem sao – trả lời đã khó, hỏi thế nào để mọi người hiểu còn khó khăn hơn đấy!
Đầu bài:
Cho các ô dữ liệu trong Excel có các số cho trước
7923456
10567890
9431632
4733168
3709046
Hãy thực hiện những yêu cầu sau:
1. Lấy các số tự nhiên duy nhất có trong các số trong các ô đã cho
Ví dụ:
7923456 thì các số là 7,9,2,3,4,5,6
3709046 thì các số là 3,7,0,9,4,6
2. Lập các tổ hợp gồm 2 chữ số sao cho cặp tổ hợp đó không lặp lại và đưa vào 1 cột số liệu sắp xếp từ thấp đến cao (không biết là có cho phép tổ hợp 33, 44 … không nhể hoặc 01,02…)
3. Đếm số lần 1 số tự nhiên được lặp lại trong các cặp tổ hợp của nó
===================
Không biết ý câu hỏi có phải là vậy! Kính mong tác giả diễn giải giùm!

Trong cái ví dụ này:

7923456
10567890
9431632
4733168
3709046

Bạn đưa ra kết quả cần đạt rồi ta nói chuyện tiếp.

Tôi làm cho bạn như sau (sai thì làm lại):
1/ Lấy duy nhất các phần tử trong chuỗi: A1: 112 => lấy 1,2, A2: 223 => lấy 2,3
2/ Đếm các tổ hợp thu được: A1 & A2 => 12,13,22,23 (theo ví dụ của bạn trên bài #3)
3/ Cấu trúc hàm tương tự hàm bạn đã áp dụng, chắc cách làm bạn đã biết.

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

Bạn cũng nên cảm ơn những người đã quan tâm đọc, dịch yêu cầu và tìm hướng giải quyết cho bạn chứ nhỉ? Hai thầy giáo BaTê và pausteigen cùng anh Vetmini đã rất nhiệt tình.

Làm thí thí chứ chưa thật hiểu cái yêu cầu "không lặp" là sao.
Hổng trúng thì trật.

Mình có cùng suy nghĩ với Ba Tê, nhưng chơi nó một cái SUB, phang vào đầu con mèo một phát cho gọn
Híc, cũng hơi khó hiểu, nếu Ba tê mà "tèo" thì mình cũng "tèo" theo, thử dùng thằng RegExp vào trường hợp này xem sao
Thân

Nếu muốn Sub thì mình sửa cái Function thành Sub, làm luôn cái cột điều kiện.
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(, .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
.Resize(K).NumberFormat = "00"
.Resize(K, 2).Value = dArr
.Resize(K, 2).Sort Key1:=
Set Dic = Nothing
End Sub

Theo tôi thấy thì nếu là cặp ký tự mới phải dùng đến dictionary, chứ cặp số thì chỉ cần mảng 100 phần tử là diễn tả được từ 00 đến 99 rồi.

Trong cấu trúc, ta đặt ra mảng 100 số nguyên tượng trưng cho số đếm của 100 kiểu khác nhau. Việc các số tương đương nhau không thành vấn đề vì sau khi đếm xong, muốn xem 07 là 70 thì cứ việc cộng arr(7) nà arr(70).

Muốn tổ hợp chuỗi A với chuỗi B thì dùng vòng lặp đại khái như sau

for c1 = 1 to Len(A)
for c2 = 1 to Len(B)
if (đặt điệu kiện trich lọc ở đây) then
cs = CInt(mid(A,c1,1) * 10 + CInt(mid(B,c2,1))
arr(cs) = ar(cs) + 1
end if
next c2
next c1

www.giaiphapexcel.com/diendan/threads/t%E1%BB%95-h%E1%BB%A3p-trong-excel.81836/#post-508378

Khóa học Power PI – Ứng dung trong Nhân sự
Khóa học SprinGO phù hợp

Khóa học Power PI – Ứng dung trong Nhân sự

TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...

Xem khóa học
★★★★★ 5 ★ 1 👤 0 ▥ 0
Quảng cáo

Bạn nên đọc

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm