Tổ hợp trong excel (1 người xem)

  • Thread starter Thread starter anjhan
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

anjhan

Thành viên mới
Tham gia
19/4/09
Bài viết
22
Được thích
1
Nghề nghiệp
Đang thất nghiệp
Xin lỗi. Mình xin close topic. Mình thấy chủ đề này không thực tế lắm. Mong các bạn thông cảm.
 
Lần chỉnh sửa cuối:
Bạn cần viết rõ câu hỏi hơn 1 chút: Phép tổ hợp ở đây là tổ hợp gì? Lấy chuỗi A2 ghép với chuỗi A1 hay là tách từng số ra và lập tổ hợp 2 phần tử hay bao nhiêu phần tử? Bạn trình bày câu hỏi mạch lạc và từng ý, từng yêu cầu một nhé!
Như thế thì mới đủ rõ để trả lời chứ!
 
Upvote 0
Xin close topic tại đây.!!!!!!!!!!!!!!!!!
 
Lần chỉnh sửa cuối:
Upvote 0
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.
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.
 
Upvote 0
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!
 
Lần chỉnh sửa cuối:
Upvote 0
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.
 
Upvote 0
Xin close topic ở đây.
 
Lần chỉnh sửa cuối:
Upvote 0
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.
Mã:
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.
 
Upvote 0
Đú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.
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.
 

File đính kèm

Upvote 0
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
 

File đính kèm

Upvote 0
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.
PHP:
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
 
Upvote 0
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
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom