Lập trình thống kê so sánh mảng (2 người xem)

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

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

meacupa

Thành viên chính thức
Tham gia
2/12/11
Bài viết
77
Được thích
3
Chào các bạn.
Mình có một bài toán không thể tự mình giải được nên mình đưa lên đây để nhờ các bạn giúp đỡ mình.
Về yêu cầu của bài toán mình đã ghi rất rõ ở trong file excel đính kèm, các bạn xem rồi giúp mình nhé.
Cảm ơn các bạn nhiều
 

File đính kèm

Cái này dùng hàm Sumproduct hoặc dùng Sumif/Countif nhập theo kiểu mảng là được rồi. Tại bạn trình bày dòng cột lộn xộn nên khó nhìn ra thôi.
 
Upvote 0
Bạn tham khảo macro sau
Mã:
Sub SoSanh()
    Dim Arr1, Arr2, Res
    Dim iR1 As Long, iR2 As Long, jC1 As Long, jC2 As Long, Dem As Long
    Arr1 = [B4:P6]
    Arr2 = [R4:AB9]
    ReDim Res(1 To UBound(Arr1, 1), 1 To UBound(Arr2, 1))


    For iR1 = 1 To UBound(Arr1, 1)
        For iR2 = 1 To UBound(Arr2, 1)
            For jC1 = 1 To UBound(Arr1, 2)
                For jC2 = 1 To UBound(Arr2, 2)
                    If Arr1(iR1, jC1) = Arr2(iR2, jC2) Then
                        Dem = Dem + 1
                    End If
                Next
            Next
            Res(iR1, iR2) = Dem
            Dem = 0
        Next
    Next
    Range("AK4").Resize(UBound(Arr1, 1), UBound(Arr2, 1)) = Res
End Sub
 
Upvote 0
Bạn tham khảo macro sau
Mã:
Sub SoSanh()
    Dim Arr1, Arr2, Res
    Dim iR1 As Long, iR2 As Long, jC1 As Long, jC2 As Long, Dem As Long
    Arr1 = [B4:P6]
    Arr2 = [R4:AB9]
    ReDim Res(1 To UBound(Arr1, 1), 1 To UBound(Arr2, 1))


    For iR1 = 1 To UBound(Arr1, 1)
        For iR2 = 1 To UBound(Arr2, 1)
            For jC1 = 1 To UBound(Arr1, 2)
                For jC2 = 1 To UBound(Arr2, 2)
                    If Arr1(iR1, jC1) = Arr2(iR2, jC2) Then
                        Dem = Dem + 1
                    End If
                Next
            Next
            Res(iR1, iR2) = Dem
            Dem = 0
        Next
    Next
    Range("AK4").Resize(UBound(Arr1, 1), UBound(Arr2, 1)) = Res
End Sub

Code này lặp lại rất nhiều lần tính Ubound's. Dùng vài cái biến chứa chúng thì khỏi phải tính đi tính lại.
 
Upvote 0
Code này lặp lại rất nhiều lần tính Ubound's. Dùng vài cái biến chứa chúng thì khỏi phải tính đi tính lại.

Code đã chạy được đúng với ý mình mong muốn, các bạn nếu thấy chưa hay thì giúp mình tối ưu thêm nhé.
Cảm ơn bạn dhn46 và VetMini
 
Upvote 0
Code đã chạy được đúng với ý mình mong muốn, các bạn nếu thấy chưa hay thì giúp mình tối ưu thêm nhé. Cảm ơn bạn dhn46 và VetMini
Híc, không phải "thấy chưa hay" hay "giúp mình tối ưu thêm nhé" cóc khô gì cả, chỉ là một bài toán thường có nhiều cách giải, thích kiểu nào thì chơi kiểu nấy Bài này mình thấy làm bằng công thức cũng đơn giản thôi, nếu viết code thì viết theo kiểu dùng công thức cũng là một cách viết
Mà đã "tối ưu" thì sao lại "giúp mình tối ưu thêm nhé" được nhỉ ?. Híc, ngộ
Thân
Mã:
Public Sub SanhSo()
    Dim VungA, VungB, Mg, I, J, Wf
        Set Wf = Application.WorksheetFunction
        Set VungA = Range([B4], [B4].End(xlDown)).Resize(, 15)
        Set VungB = Range([R4], [R4].End(xlDown)).Resize(, 11)
        ReDim Mg(1 To VungA.Rows.Count, 1 To VungB.Rows.Count)
            For I = 1 To VungA.Rows.Count
                For J = 1 To VungB.Rows.Count
                    Mg(I, J) = Wf.SumProduct(Wf.CountIf(VungB.Rows(J), VungA.Rows(I)))
                Next J
            Next I
        [AD10].Resize(VungA.Rows.Count, VungB.Rows.Count) = Mg
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Híc, không phải "thấy chưa hay" hay "giúp mình tối ưu thêm nhé" cóc khô gì cả, chỉ là một bài toán thường có nhiều cách giải, thích kiểu nào thì chơi kiểu nấy Bài này mình thấy làm bằng công thức cũng đơn giản thôi, nếu viết code thì viết theo kiểu dùng công thức cũng là một cách viết
Mà đã "tối ưu" thì sao lại "giúp mình tối ưu thêm nhé" được nhỉ ?. Híc, ngộ
Thân
Mã:
Public Sub SanhSo()
    Dim VungA, VungB, Mg, I, J, Wf
        Set Wf = Application.WorksheetFunction
        Set VungA = Range([B4], [B4].End(xlDown)).Resize(, 15)
        Set VungB = Range([R4], [R4].End(xlDown)).Resize(, 11)
        ReDim Mg(1 To VungA.Rows.Count, 1 To VungB.Rows.Count)
            For I = 1 To VungA.Rows.Count
                For J = 1 To VungB.Rows.Count
                    Mg(I, J) = Wf.SumProduct(Wf.CountIf(VungB.Rows(J), VungA.Rows(I)))
                Next J
            Next I
        [AD10].Resize(VungA.Rows.Count, VungB.Rows.Count) = Mg
End Sub
Cảm ơn bạn. Vì bài này mình chạy với một dữ liệu lớn nên mình cần tối ưu để chạy được nhanh nhất. Tối ưu ở đây là cách viết code sao cho chương trình chạy nhanh nhất :)
 
Upvote 0
Cảm ơn bạn. Vì bài này mình chạy với một dữ liệu lớn nên mình cần tối ưu để chạy được nhanh nhất. Tối ưu ở đây là cách viết code sao cho chương trình chạy nhanh nhất :)
Chẳng biết chương trình của bạn có số lượng dữ liệu nhiều như thế nào mà cần tốc độ nhanh đến vậy khoảng độ dưới 1 chục giây đáp ứng được yêu cầu thì bạn cứ dùng đi.

Bài #3 mà dùng biến tạm thay cho mấy cái Ubound chắc cũng giảm kha khá thời gian. Chủ yếu nghĩ bạn đang mày mò thuật toán...
 
Upvote 0
Chào các bạn.
Mình có một bài toán không thể tự mình giải được nên mình đưa lên đây để nhờ các bạn giúp đỡ mình.
Về yêu cầu của bài toán mình đã ghi rất rõ ở trong file excel đính kèm, các bạn xem rồi giúp mình nhé.
Cảm ơn các bạn nhiều

Code đã chạy được đúng với ý mình mong muốn, các bạn nếu thấy chưa hay thì giúp mình tối ưu thêm nhé.
Cảm ơn bạn dhn46 và VetMini

"đã ghi rất rõ"? Với tôi thì "chưa ghi rõ" chứ chưa nói tới cái "rất" kia.

Yêu cầu bao giờ cũng phải miêu tả. Vấn đề đơn giản thì miêu tả bằng 1 câu, vấn đề phức tạp thì miêu tả bằng nhiều câu. Nhiều khi gặp vấn đề phức tạp còn phải trước hết là định nghĩa khái niệm. Ví dụ chỉ là làm sáng tỏ thêm miêu tả. Không bao giờ chỉ có ví dụ. Vì ví dụ có thể là "ngẫu nhiên mà thế" chứ chưa hẳn là quy luật.

Cũng như trong Toán một định lý đúng trong 1 tỷ trường hợp cụ thể chưa chắc là một định lý luôn đúng.

Bạn không miêu tả mà chỉ ví dụ thì cũng có nguy hiểm là khi gõ ví dụ mà đếm sdai và gõ sai thì người đọc sẽ không tìm ra "quy luật". Tôi cho ví dụ. Theo cách hiểu của bạn thì có lẽ AF6 = 2? Vì 63 và 65 đều xuất hiện trong 2 mảng. Nhưng bạn có AF6 = 1.

Bạn nói: "Lấy mảng B4:P4 so sánh với mảng R7:AB7 xem có bao nhieu kết quả trùng rồi ghi ra AG4( như bài trên có 3 giá trị là 74,74,74 "- 74 xuất hiện 3 lần-")"

Tôi nhìn thấy là 74 xuất hiện trong mảng 1 chỉ duy nhất 1 lần nhưng xuất hiện trong mảng 2 tới 3 lần.

1. Thế nếu 74 xuất hiện trong mảng 1 tới 3 lần nhưng chỉ 1 lần trong mảng 2 thì kết quả lấy là 1 hay 3?

2. Thế nếu 74 xuất hiến trong 1 tới 3 lần nhưng trong mảng 2 chỉ 2 lần thì kết quả là 2 hay 3?

3. Giả sử s1(a) và s2(a) là số lần xuất hiện của a trong mảng 1 và mảng 2 với a là số bất kỳ thuộc cả 2 mảng. Và kết quả lấy là max(s1(a), s2(a)), tức lấy số lớn hơn.

Từ dòng đỏ đỏ tôi có câu hỏi: "Nếu có k số x1, x2, ..., xk đều có trong 2 mảng, với k >= 1, thì kết quả trả về thế nào?"

Là:

a: Chuỗi "max(s1(x1), s2(x1)) - max(s1(x2), s2(x2)) - ... - max(s1(xk), s2(xk))". Dạng "2 - 6 - 3"
Kết quả như thế có giá trị gì? Vì nó chả nói lên cái gì cả. 6 là số lần xuất hiện của 167 hay của 82 ...? Tương tự với số lần xuất hiện là 2 và 3

b. Là 1 số duy nhất MIN(max(s1(x1), s2(x1)), max(s1(x2), s2(x2)), ... , max(s1(xk), s2(xk)))
tức MIN của các MAX

c. Là 1 số duy nhất MAX(max(s1(x1), s2(x1)), max(s1(x2), s2(x2)), ... , max(s1(xk), s2(xk)))
tức MAX của các MAX

d. Là 1 số duy nhất max(s1(x1), s2(x1)) + max(s1(x2), s2(x2)) + ... + max(s1(xk), s2(xk))

???

Thực ra theo tôi bài toán chỉ có ý nghĩa khi mà ta tìm SỐ CÁC SỐ xuất hiện đồng thời trong 2 mảng. Tức với 2 mảng 4, 2, 3, 3, 3, 3, 3, 3, 3, 3 và 1, 3, 3, 2, 2, 2, 2, 2 thì kết quả lấy là 2 do có 2 số cùng xuất hiện trong 2 mảng là 2 và 3. Theo tôi đã nói "có bao nhieu kết quả trùng" hay đúng hơn là "có bao nhieu SỐ trùng" thì phải hiểu theo cách này. Tức trả về con số 2. Không phải là 8 (8 con số 3) mà cũng không phải là "5 - 8" (5 con số 2 và 8 con số 3). "Có bao nhiêu SỐ trùng" mà rõ ràng chỉ có 2 số đều xuất hiện trong 2 mảng. Khái niệm phải chính xác. Nếu muốn một khái niệm "xung đột" với cách hiểu lô gíc thì phải định nghĩa rõ. Thế thôi. Hoặc dùng từ chính xác.

Nếu muốn kiểu như trong điểm a ở trên thì giá trị trả về hữu ích chỉ khi có dạng
Mã:
"[COLOR=#ff0000]3[/COLOR]([COLOR=#0000ff]74[/COLOR]) - [COLOR=#ff0000]1[/COLOR]([COLOR=#0000ff]82[/COLOR]) - [COLOR=#ff0000]9[/COLOR]([COLOR=#0000ff]123[/COLOR])" thay cho "3 - 1 - 9"

Lúc đó những con số 3, 1, 9 mới có ý nghĩa: đó là số lần xuất hiện lớn nhất của 74, 82, 123
----------------
Có miếng ngon nhất tôi để dành cuối cùng.

Bạn viết
Code đã chạy được đúng với ý mình mong muốn

Có chắc chắn đúng với ý bạn không? Hay là bạn không biết bạn muốn gì?

Tôi cho ví dụ.

Ví dụ 1. Bạn viết
Lấy mảng B4:P4 so sánh với mảng R7:AB7 xem có bao nhieu kết quả trùng rồi ghi ra AG4(như bài trên có 3 giá trị là 74,74,74 "- 74 xuất hiện 3 lần-")

Và theo đó bạn có AG4 = 3 (74 xuất hiện 3 lần). Code của dhn46 trả về AN4 = 0. Bạn biết tại sao không? Vì điều kiện đỏ đỏ trong
Mã:
If [COLOR=#ff0000]Arr1(iR1, jC1) = Arr2(iR2, jC2)[/COLOR] Then
                        Dem = Dem + 1
End If

không thỏa. Vì sao? Vì dữ liệu của bạn có 74 là số trong mảng 1 và là chuỗi trong mảng 2.

Ví dụ 2. Cứ cho là dữ liệu của bạn luôn là số hoặc sửa lại code của dhn46. Thế thì bạn hãy thay B6:P6 = 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 và R9:AB9 = 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2

Code của dhn46 trả về 140. Mảng 15 phần tử và mảng 11 phần tử "có 140 kết quả trùng".

Nghe "ngồ ngộ" thế nào ấy nhỉ.

Vài lời thế thôi chứ tôi không thích trò chơi đoán mò.
 
Upvote 0
... Vì bài này mình chạy với một dữ liệu lớn nên mình cần tối ưu để chạy được nhanh nhất. Tối ưu ở đây là cách viết code sao cho chương trình chạy nhanh nhất :)

Tôi nhắc nho nhỏ cho bạn chủ code về kỹ thuật code thôi. Chuyện "tối ưu để chạy được nhanh nhất" đối với tôi là thứ yếu.
Khi viết code, tôi chỉ quan trọng viết sao cho dễ hiểu (càng sát với tiêu chuẩn thì người khác càng dễ hiểu), cho dễ giám sát (càng sát với thiết kế yêu cầu thì càng dễ giám sát, xác định chỗ đúng sai), cho dễ chỉnh sửa (càng bao rộng thì càng dễ chỉnh sửa). Ba điều trên có khi mâu chọi nhau một chút cho nên phải thêm điều thứ tư là cho đạt quân bình giữa ba điều kia.

Chỉ khi nào code cần hoạt động trong tình trạng giờ thực tế (realtime) tôi mới tính đến chuyện nhanh chậm. Bởi vì khi ấy nếu không ra kết quả đúng lúc thì sử lý kế tiếp có thể sai.

Người viết code chuyên nghiệp rồi thì tự động nó có mức hiệu quả tối thiểu, nếu không phải là tối ưu thì cũng rất gần rồi, không cần thiết phải chú tâm quá. Nói thẳng ra, bạn nào có cho tôi làm phách thì cũng là ý kiến của bạn ấy.

tb. Mấy cô cậu đưa bài lên có tật hay nêu vấn đề "dữ liệu nhiều... triệu dòng...". Thật ra, đối với dân chuyên về dữ liệu thì dữ liệu nhiều phải học cách sắp xếp cho nó dễ sử lý trước khi học cách dùng hàm cho hiệu quả. Quản lý một cái kho lớn thì phải học cách chất hàng trước khi học lái xe nâng.
 
Upvote 0
"đã ghi rất rõ"? Với tôi thì "chưa ghi rõ" chứ chưa nói tới cái "rất" kia.

Yêu cầu bao giờ cũng phải miêu tả. Vấn đề đơn giản thì miêu tả bằng 1 câu, vấn đề phức tạp thì miêu tả bằng nhiều câu. Nhiều khi gặp vấn đề phức tạp còn phải trước hết là định nghĩa khái niệm. Ví dụ chỉ là làm sáng tỏ thêm miêu tả. Không bao giờ chỉ có ví dụ. Vì ví dụ có thể là "ngẫu nhiên mà thế" chứ chưa hẳn là quy luật.

Cũng như trong Toán một định lý đúng trong 1 tỷ trường hợp cụ thể chưa chắc là một định lý luôn đúng.

Bạn không miêu tả mà chỉ ví dụ thì cũng có nguy hiểm là khi gõ ví dụ mà đếm sdai và gõ sai thì người đọc sẽ không tìm ra "quy luật". Tôi cho ví dụ. Theo cách hiểu của bạn thì có lẽ AF6 = 2? Vì 63 và 65 đều xuất hiện trong 2 mảng. Nhưng bạn có AF6 = 1.

Bạn nói: "Lấy mảng B4:P4 so sánh với mảng R7:AB7 xem có bao nhieu kết quả trùng rồi ghi ra AG4( như bài trên có 3 giá trị là 74,74,74 "- 74 xuất hiện 3 lần-")"

Tôi nhìn thấy là 74 xuất hiện trong mảng 1 chỉ duy nhất 1 lần nhưng xuất hiện trong mảng 2 tới 3 lần.

1. Thế nếu 74 xuất hiện trong mảng 1 tới 3 lần nhưng chỉ 1 lần trong mảng 2 thì kết quả lấy là 1 hay 3?

2. Thế nếu 74 xuất hiến trong 1 tới 3 lần nhưng trong mảng 2 chỉ 2 lần thì kết quả là 2 hay 3?

3. Giả sử s1(a) và s2(a) là số lần xuất hiện của a trong mảng 1 và mảng 2 với a là số bất kỳ thuộc cả 2 mảng. Và kết quả lấy là max(s1(a), s2(a)), tức lấy số lớn hơn.

Từ dòng đỏ đỏ tôi có câu hỏi: "Nếu có k số x1, x2, ..., xk đều có trong 2 mảng, với k >= 1, thì kết quả trả về thế nào?"

Là:

a: Chuỗi "max(s1(x1), s2(x1)) - max(s1(x2), s2(x2)) - ... - max(s1(xk), s2(xk))". Dạng "2 - 6 - 3"
Kết quả như thế có giá trị gì? Vì nó chả nói lên cái gì cả. 6 là số lần xuất hiện của 167 hay của 82 ...? Tương tự với số lần xuất hiện là 2 và 3

b. Là 1 số duy nhất MIN(max(s1(x1), s2(x1)), max(s1(x2), s2(x2)), ... , max(s1(xk), s2(xk)))
tức MIN của các MAX

c. Là 1 số duy nhất MAX(max(s1(x1), s2(x1)), max(s1(x2), s2(x2)), ... , max(s1(xk), s2(xk)))
tức MAX của các MAX

d. Là 1 số duy nhất max(s1(x1), s2(x1)) + max(s1(x2), s2(x2)) + ... + max(s1(xk), s2(xk))

???

Thực ra theo tôi bài toán chỉ có ý nghĩa khi mà ta tìm SỐ CÁC SỐ xuất hiện đồng thời trong 2 mảng. Tức với 2 mảng 4, 2, 3, 3, 3, 3, 3, 3, 3, 3 và 1, 3, 3, 2, 2, 2, 2, 2 thì kết quả lấy là 2 do có 2 số cùng xuất hiện trong 2 mảng là 2 và 3. Theo tôi đã nói "có bao nhieu kết quả trùng" hay đúng hơn là "có bao nhieu SỐ trùng" thì phải hiểu theo cách này. Tức trả về con số 2. Không phải là 8 (8 con số 3) mà cũng không phải là "5 - 8" (5 con số 2 và 8 con số 3). "Có bao nhiêu SỐ trùng" mà rõ ràng chỉ có 2 số đều xuất hiện trong 2 mảng. Khái niệm phải chính xác. Nếu muốn một khái niệm "xung đột" với cách hiểu lô gíc thì phải định nghĩa rõ. Thế thôi. Hoặc dùng từ chính xác.

Nếu muốn kiểu như trong điểm a ở trên thì giá trị trả về hữu ích chỉ khi có dạng
Mã:
"[COLOR=#ff0000]3[/COLOR]([COLOR=#0000ff]74[/COLOR]) - [COLOR=#ff0000]1[/COLOR]([COLOR=#0000ff]82[/COLOR]) - [COLOR=#ff0000]9[/COLOR]([COLOR=#0000ff]123[/COLOR])" thay cho "3 - 1 - 9"

Lúc đó những con số 3, 1, 9 mới có ý nghĩa: đó là số lần xuất hiện lớn nhất của 74, 82, 123
----------------
Có miếng ngon nhất tôi để dành cuối cùng.

Bạn viết


Có chắc chắn đúng với ý bạn không? Hay là bạn không biết bạn muốn gì?

Tôi cho ví dụ.

Ví dụ 1. Bạn viết


Và theo đó bạn có AG4 = 3 (74 xuất hiện 3 lần). Code của dhn46 trả về AN4 = 0. Bạn biết tại sao không? Vì điều kiện đỏ đỏ trong
Mã:
If [COLOR=#ff0000]Arr1(iR1, jC1) = Arr2(iR2, jC2)[/COLOR] Then
                        Dem = Dem + 1
End If

không thỏa. Vì sao? Vì dữ liệu của bạn có 74 là số trong mảng 1 và là chuỗi trong mảng 2.

Ví dụ 2. Cứ cho là dữ liệu của bạn luôn là số hoặc sửa lại code của dhn46. Thế thì bạn hãy thay B6:P6 = 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 và R9:AB9 = 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2

Code của dhn46 trả về 140. Mảng 15 phần tử và mảng 11 phần tử "có 140 kết quả trùng".

Nghe "ngồ ngộ" thế nào ấy nhỉ.

Vài lời thế thôi chứ tôi không thích trò chơi đoán mò.

Mình rất cảm ơn bạn vì đã chỉ rõ ra những sai sót của mình :).
Mình thấy bạn đã xem bài của mình rất kỹ, mình xin trả lời bạn như sau:

A. "Tôi cho ví dụ. Theo cách hiểu của bạn thì có lẽ AF6 = 2? Vì 63 và 65 đều xuất hiện trong 2 mảng. Nhưng bạn có AF6 = 1." Cái này phải là 2 chứ không phải 1.

B."Bạn nói: "Lấy mảng B4:P4 so sánh với mảng R7:AB7 xem có bao nhieu kết quả trùng rồi ghi ra AG4( như bài trên có 3 giá trị là 74,74,74 "- 74 xuất hiện 3 lần-")"

Tôi nhìn thấy là 74 xuất hiện trong mảng 1 chỉ duy nhất 1 lần nhưng xuất hiện trong mảng 2 tới 3 lần.

1. Thế nếu 74 xuất hiện trong mảng 1 tới 3 lần nhưng chỉ 1 lần trong mảng 2 thì kết quả lấy là 1 hay 3?

2. Thế nếu 74 xuất hiến trong 1 tới 3 lần nhưng trong mảng 2 chỉ 2 lần thì kết quả là 2 hay 3?

3. Giả sử s1(a) và s2(a) là số lần xuất hiện của a trong mảng 1 và mảng 2 với a là số bất kỳ thuộc cả 2 mảng. Và kết quả lấy là max(s1(a), s2(a)), tức lấy số lớn hơn.

Từ dòng đỏ đỏ tôi có câu hỏi: "Nếu có k số x1, x2, ..., xk đều có trong 2 mảng, với k >= 1, thì kết quả trả về thế nào?"". Nếu 74 xuất hiện trong mảng 1 chỉ duy nhất 1 lần nhưng xuất hiện trong mảng 2 tới 3 lần thì kết quả là 3 lần, 74 xuất hiện trong mảng 1 là 2 lần nhưng xuất hiện trong mảng 2 tới 3 lần thì kết quả vẫn là 3 lần. Kết quả là max của số lần xuất hiện ở mảng 2.

C."Từ dòng đỏ đỏ tôi có câu hỏi: "Nếu có k số x1, x2, ..., xk đều có trong 2 mảng, với k >= 1, thì kết quả trả về thế nào?"". Nếu thế thì kết quả trả về là k, là k+n nếu có n -1 số x trùng nhau ở mảng 2.

D."Thực ra theo tôi bài toán chỉ có ý nghĩa khi mà ta tìm SỐ CÁC SỐ xuất hiện đồng thời trong 2 mảng. Tức với 2 mảng 4, 2, 3, 3, 3, 3, 3, 3, 3, 3 và 1, 3, 3, 2, 2, 2, 2, 2 thì kết quả lấy là 2 do có 2 số cùng xuất hiện trong 2 mảng là 2 và 3. Theo tôi đã nói "có bao nhieu kết quả trùng" hay đúng hơn là "có bao nhieu SỐ trùng" thì phải hiểu theo cách này. Tức trả về con số 2. Không phải là 8 (8 con số 3) mà cũng không phải là "5 - 8" (5 con số 2 và 8 con số 3). "Có bao nhiêu SỐ trùng" mà rõ ràng chỉ có 2 số đều xuất hiện trong 2 mảng. Khái niệm phải chính xác. Nếu muốn một khái niệm "xung đột" với cách hiểu lô gíc thì phải định nghĩa rõ. Thế thôi. Hoặc dùng từ chính xác.". Cái này nếu theo ý của mình thì kết quả là 7, đúng là mình diễn giải chưa rõ.

E."Có miếng ngon nhất tôi để dành cuối cùng.

Bạn viết
Code đã chạy được đúng với ý mình mong muốn


Có chắc chắn đúng với ý bạn không? Hay là bạn không biết bạn muốn gì?

Tôi cho ví dụ.

Ví dụ 1. Bạn viết
Lấy mảng B4:P4 so sánh với mảng R7:AB7 xem có bao nhieu kết quả trùng rồi ghi ra AG4(như bài trên có 3 giá trị là 74,74,74 "- 74 xuất hiện 3 lần-")


Và theo đó bạn có AG4 = 3 (74 xuất hiện 3 lần). Code của dhn46 trả về AN4 = 0. Bạn biết tại sao không? Vì điều kiện đỏ đỏ trong
Code:
If Arr1(iR1, jC1) = Arr2(iR2, jC2) Then
Dem = Dem + 1
End If
không thỏa. Vì sao? Vì dữ liệu của bạn có 74 là số trong mảng 1 và là chuỗi trong mảng 2.

Ví dụ 2. Cứ cho là dữ liệu của bạn luôn là số hoặc sửa lại code của dhn46. Thế thì bạn hãy thay B6:P6 = 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 và R9:AB9 = 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2

Code của dhn46 trả về 140. Mảng 15 phần tử và mảng 11 phần tử "có 140 kết quả trùng".

Nghe "ngồ ngộ" thế nào ấy nhỉ.". Đúng như bạn nói code này chưa đúng với ý mình, đêm qua mình test lại mới thấy có vấn đề ở chỗ 74, sáng nay định hỏi lại bạn dhn46 :). Bạn có thể sửa lại đoạn này giúp mình không?

Chốt lại mình đã có nhiều thiếu sót khi đưa ra bài toán, rất mong các bạn thông cảm mình là người mới trong môn này có gì các bạn góp ý thẳng cho mình như bạn siwtom nhé
:-=:-=:-=
 
Upvote 0
Híc, không phải "thấy chưa hay" hay "giúp mình tối ưu thêm nhé" cóc khô gì cả, chỉ là một bài toán thường có nhiều cách giải, thích kiểu nào thì chơi kiểu nấy Bài này mình thấy làm bằng công thức cũng đơn giản thôi, nếu viết code thì viết theo kiểu dùng công thức cũng là một cách viết
Mà đã "tối ưu" thì sao lại "giúp mình tối ưu thêm nhé" được nhỉ ?. Híc, ngộ
Thân
Mã:
Public Sub SanhSo()
    Dim VungA, VungB, Mg, I, J, Wf
        Set Wf = Application.WorksheetFunction
        Set VungA = Range([B4], [B4].End(xlDown)).Resize(, 15)
        Set VungB = Range([R4], [R4].End(xlDown)).Resize(, 11)
        ReDim Mg(1 To VungA.Rows.Count, 1 To VungB.Rows.Count)
            For I = 1 To VungA.Rows.Count
                For J = 1 To VungB.Rows.Count
                    Mg(I, J) = Wf.SumProduct(Wf.CountIf(VungB.Rows(J), VungA.Rows(I)))
                Next J
            Next I
        [AD10].Resize(VungA.Rows.Count, VungB.Rows.Count) = Mg
End Sub

Cảm ơn bạn nhé. Rất mong được bạn chỉ bảo thêm
 
Upvote 0
Bạn có thể sửa lại đoạn này giúp mình không?

Tôi không sửa hộ bạn vì:
1. Tác giả vẫn còn đây chứ có phải tác giả bỏ trốn đâu.
2. Những người tham gia chủ đề này là những bậc mà để ám chỉ họ thì nhiều người dùng từ "cao thủ", "siêu nhân" ... Họ đã tham gia rồi thì có gì họ sẽ sửa.
 
Upvote 0
Híc, không phải "thấy chưa hay" hay "giúp mình tối ưu thêm nhé" cóc khô gì cả, chỉ là một bài toán thường có nhiều cách giải, thích kiểu nào thì chơi kiểu nấy Bài này mình thấy làm bằng công thức cũng đơn giản thôi, nếu viết code thì viết theo kiểu dùng công thức cũng là một cách viết
Mà đã "tối ưu" thì sao lại "giúp mình tối ưu thêm nhé" được nhỉ ?. Híc, ngộ
Thân
Mã:
Public Sub SanhSo()
    Dim VungA, VungB, Mg, I, J, Wf
        Set Wf = Application.WorksheetFunction
        Set VungA = Range([B4], [B4].End(xlDown)).Resize(, 15)
        Set VungB = Range([R4], [R4].End(xlDown)).Resize(, 11)
        ReDim Mg(1 To VungA.Rows.Count, 1 To VungB.Rows.Count)
            For I = 1 To VungA.Rows.Count
                For J = 1 To VungB.Rows.Count
                    Mg(I, J) = Wf.SumProduct(Wf.CountIf(VungB.Rows(J), VungA.Rows(I)))
                Next J
            Next I
        [AD10].Resize(VungA.Rows.Count, VungB.Rows.Count) = Mg
End Sub
Bạn ơi mình sử dụng code này thì bị báo lỗi Out Of Memory. Các bạn xem giúp mình sửa lỗi này mới.
Thanks.
Mình đã sửa được rồi. :))
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu 74 xuất hiện trong mảng 1 chỉ duy nhất 1 lần nhưng xuất hiện trong mảng 2 tới 3 lần thì kết quả là 3 lần, 74 xuất hiện trong mảng 1 là 2 lần nhưng xuất hiện trong mảng 2 tới 3 lần thì kết quả vẫn là 3 lần. Kết quả là max của số lần xuất hiện ở mảng 2.

C."Từ dòng đỏ đỏ tôi có câu hỏi: "Nếu có k số x1, x2, ..., xk đều có trong 2 mảng, với k >= 1, thì kết quả trả về thế nào?"". Nếu thế thì kết quả trả về là k, là k+n nếu có n -1 số x trùng nhau ở mảng 2.

Cho tới khi này mà bạn còn không phát biểu chính xác.

Giả sử có k số cùng xuất hiện ở 2 mảng là x1, ..., xk. Giả sử x1, ..., xk đều xuất hiện n lần. Như vậy nếu tôi hiểu được bạn thì kết quả phải là k*n chứ không phải k + n.

Tôi phát biểu cho bạn (thêm vào những cái bạn đã nói, tức vd. "ta so sánh từng dòng ... với từng dòng ...")

"Ta có 2 mảng 1 và 2. Giả sử có k số x1, ..., xk, với k >= 0, đều xuất hiện trong 2 mảng. Gọi s(x1), ..., s(xk) là số lần xuất hiện của x1, ..., xk trong mảng 2. Kết quả trả về là s(x1) + ... + s(xk)"

Nếu là khác thì hãy bắt chước tôi và miêu tả rõ ràng.
--------
Tôi có cảm giác là cả 2 code trong chủ đề này đều không làm theo ý bạn. Bây giờ bạn đã thấy là cái "đã ghi rất rõ" của bạn không có giá trị gì cả.
 
Lần chỉnh sửa cuối:
Upvote 0
"Ta có 2 mảng 1 và 2. Giả sử có k số x1, ..., xk, với k >= 0, đều xuất hiện trong 2 mảng. Gọi s(x1), ..., s(xk) là số lần xuất hiện của x1, ..., xk trong mảng 2. Kết quả trả về là s(x1) + ... + s(xk)"
Đúng là cái này bạn ah
 
Upvote 0
"Ta có 2 mảng 1 và 2. Giả sử có k số x1, ..., xk, với k >= 0, đều xuất hiện trong 2 mảng. Gọi s(x1), ..., s(xk) là số lần xuất hiện của x1, ..., xk trong mảng 2. Kết quả trả về là s(x1) + ... + s(xk)"
Đúng là cái này bạn ah

Nếu bạn chắc chắn đúng yêu cầu là thế thì ...
-------------
Bạn xem tôi có nhầm không. Cũng có thể dùng thêm "đít thon". Tôi không dùng mà chọn cách khác.
Cách dùng WorksheetFunction coi như bài tập về nhà cho bạn.

Mã:
Sub SoSanh()
    Dim Arr1(), Arr2(), result() As Long
    Dim r1 As Long, r2 As Long, c1 As Long, c2 As Long, count As Long, c As Long
    Dim a As Double, b As Double, u12 As Long, u21 As Long, u22 As Long
    Arr1 = [B4:P6].Value
    Arr2 = [R4:AB9].Value
    u11 = UBound(Arr1, 1)
    u12 = UBound(Arr1, 2)
    u21 = UBound(Arr2, 1)
    u22 = UBound(Arr2, 2)
    ReDim result(1 To u11, 1 To u21)
On Error Resume Next
    For r1 = 1 To u11
        For r2 = 1 To u21
            count = 0
            For c1 = 1 To u12
                For c2 = 1 To u22
                    a = Arr1(r1, c1)
                    b = Arr2(r2, c2)
                    If Err.Number > 0 Then
                        Err.Number = 0
                    ElseIf a = b Then
                        For c = c1 + 1 To u12
                            If Arr1(r1, c) = a Then Arr1(r1, c) = 2147483647   '   Arr1(r1, c) = "*"
                        Next c
                        count = count + 1
                    End If
                Next c2
            Next c1
            result(r1, r2) = count
        Next r2
    Next r1
    Range("AK4").Resize(u11, u21) = result
End Sub
 
Upvote 0
Nếu bạn chắc chắn đúng yêu cầu là thế thì ...
-------------
Bạn xem tôi có nhầm không. Cũng có thể dùng thêm "đít thon". Tôi không dùng mà chọn cách khác.
Cách dùng WorksheetFunction coi như bài tập về nhà cho bạn.

Mã:
Sub SoSanh()
    Dim Arr1(), Arr2(), result() As Long
    Dim r1 As Long, r2 As Long, c1 As Long, c2 As Long, count As Long, c As Long
    Dim a As Double, b As Double, u12 As Long, u21 As Long, u22 As Long
    Arr1 = [B4:P6].Value
    Arr2 = [R4:AB9].Value
    u11 = UBound(Arr1, 1)
    u12 = UBound(Arr1, 2)
    u21 = UBound(Arr2, 1)
    u22 = UBound(Arr2, 2)
    ReDim result(1 To u11, 1 To u21)
On Error Resume Next
    For r1 = 1 To u11
        For r2 = 1 To u21
            count = 0
            For c1 = 1 To u12
                For c2 = 1 To u22
                    a = Arr1(r1, c1)
                    b = Arr2(r2, c2)
                    If Err.Number > 0 Then
                        Err.Number = 0
                    ElseIf a = b Then
                        For c = c1 + 1 To u12
                            If Arr1(r1, c) = a Then Arr1(r1, c) = 2147483647   '   Arr1(r1, c) = "*"
                        Next c
                        count = count + 1
                    End If
                Next c2
            Next c1
            result(r1, r2) = count
        Next r2
    Next r1
    Range("AK4").Resize(u11, u21) = result
End Sub

Cảm ơn bạn nhiều :). Để mình test thử xem sao nhé.
 
Upvote 0
Nếu bạn chắc chắn đúng yêu cầu là thế thì ...
-------------
Bạn xem tôi có nhầm không. Cũng có thể dùng thêm "đít thon". Tôi không dùng mà chọn cách khác.
Cách dùng WorksheetFunction coi như bài tập về nhà cho bạn.

Mã:
Sub SoSanh()
    Dim Arr1(), Arr2(), result() As Long
    Dim r1 As Long, r2 As Long, c1 As Long, c2 As Long, count As Long, c As Long
    Dim a As Double, b As Double, u12 As Long, u21 As Long, u22 As Long
    Arr1 = [B4:P6].Value
    Arr2 = [R4:AB9].Value
    u11 = UBound(Arr1, 1)
    u12 = UBound(Arr1, 2)
    u21 = UBound(Arr2, 1)
    u22 = UBound(Arr2, 2)
    ReDim result(1 To u11, 1 To u21)
On Error Resume Next
    For r1 = 1 To u11
        For r2 = 1 To u21
            count = 0
            For c1 = 1 To u12
                For c2 = 1 To u22
                    a = Arr1(r1, c1)
                    b = Arr2(r2, c2)
                    If Err.Number > 0 Then
                        Err.Number = 0
                    ElseIf a = b Then
                        For c = c1 + 1 To u12
                            If Arr1(r1, c) = a Then Arr1(r1, c) = 2147483647   '   Arr1(r1, c) = "*"
                        Next c
                        count = count + 1
                    End If
                Next c2
            Next c1
            result(r1, r2) = count
        Next r2
    Next r1
    Range("AK4").Resize(u11, u21) = result
End Sub

Đã test thử với Sub SoSanh()
Dim Arr1(), Arr2(), result() As Long
Dim r1 As Long, r2 As Long, c1 As Long, c2 As Long, count As Long, c As Long
Dim a As Double, b As Double, u12 As Long, u21 As Long, u22 As Long
Arr1 = [ac2:bl5500].Value
Arr2 = [a2:aa11].Value
u11 = UBound(Arr1, 1)
u12 = UBound(Arr1, 2)
u21 = UBound(Arr2, 1)
u22 = UBound(Arr2, 2)
ReDim result(1 To u11, 1 To u21)
On Error Resume Next
For r1 = 1 To u11
For r2 = 1 To u21
count = 0
For c1 = 1 To u12
For c2 = 1 To u22
a = Arr1(r1, c1)
b = Arr2(r2, c2)
If Err.Number > 0 Then
Err.Number = 0
ElseIf a = b Then
For c = c1 + 1 To u12
If Arr1(r1, c) = a Then Arr1(r1, c) = 2147483647 ' Arr1(r1, c) = "*"
Next c
count = count + 1
End If
Next c2
Next c1
result(r1, r2) = count
Next r2
Next r1
Range("bn2").Resize(u11, u21) = result
End Sub



Về mặt thời gian cũng khá lâu gấp đôi thời gian so với code của bạn concogia.
Mình chưa có thời gian để kiểm tra kỹ chương trình, có gì mai trả lời bạn sau.
Thanks
 
Lần chỉnh sửa cuối:
Upvote 0
Đã test thử với Sub SoSanh()
Dim Arr1(), Arr2(), result() As Long
Dim r1 As Long, r2 As Long, c1 As Long, c2 As Long, count As Long, c As Long
Dim a As Double, b As Double, u12 As Long, u21 As Long, u22 As Long
Arr1 = [ac2:bl5500].Value
Arr2 = [a2:aa11].Value
u11 = UBound(Arr1, 1)
u12 = UBound(Arr1, 2)
u21 = UBound(Arr2, 1)
u22 = UBound(Arr2, 2)
ReDim result(1 To u11, 1 To u21)
On Error Resume Next
For r1 = 1 To u11
For r2 = 1 To u21
count = 0
For c1 = 1 To u12
For c2 = 1 To u22
a = Arr1(r1, c1)
b = Arr2(r2, c2)
If Err.Number > 0 Then
Err.Number = 0
ElseIf a = b Then
For c = c1 + 1 To u12
If Arr1(r1, c) = a Then Arr1(r1, c) = 2147483647 ' Arr1(r1, c) = "*"
Next c
count = count + 1
End If
Next c2
Next c1
result(r1, r2) = count
Next r2
Next r1
Range("bn2").Resize(u11, u21) = result
End Sub

kết quả là sai bạn ah

VD mảng 1 gồm:
11 12 13 15 16 17 21 22 23 25 26 27 31 32 33 35 36 37 51 52 53 55 56 57 81 82 83 85 86 87 01 02 03 05 06 07

mảng 2 gồm:22 41 37 52 76 76 46 81 04 88 60 11 78 40 72 08 75 13 03 10 58 28 00 88 70 20 65

Code của bạn cho ra kết quả là 5 trong khi đúng ra là 6: 22,37,52,81,11,13

Bạn dán kiểu gì vậy?
Tôi phải lọc từ mớ đó ra các số của 2 mảng?

Nếu bạn muốn nhờ tôi thì phải phải mất max thời gian để sao cho tôi mất min thời gian. Vì vấn đề là của bạn.
------------------
Ý bạn là

Mảng 1

Mã:
11,  12, 13, 15, 16, 17, 21, 22, 23, 25, 26, 27, 31, 32, 33, 35, 36, 37, 51,  52, 53, 55, 56, 57, 81, 82, 83, 85, 86, 87, 01, 02, 03, 05, 06, 07

Mảng 2

Mã:
22, 41, 37, 52, 76, 76, 46, 81, 04, 88, 60, 11, 78, 40, 72, 08, 75, 13, 03, 10, 58, 28, 00, 88, 70, 20, 65

Nếu thế thì phải là 7 kết quả chứ không phải 6 như bạn nói. Và code của tôi trả về kết quả là 7
Kiểm tra thì thấy có 7 số cùng xuất hiện trong 2 mảng. Đó là

Mã:
 22, 37, 52, 81, 11, 13, 03

Vậy thì đừng nói là chỉ có 6 kết quả nhé. Và cũng đừng nói là code của tôi trả về 5 kết quả nhé.

Về mặt thời gian cũng khá lâu gấp đôi thời gian so với code của bạn concogia.
Mình chưa có thời gian để kiểm tra kỹ chương trình, có gì mai trả lời bạn sau.
Thanks

1. Tôi đã viết là code dùng WorksheetFunction là bài tập về nhà cho bạn.
2. Nếu code nhanh thế thì bạn cứ dùng thôi. Sao lại phải tìm kiếm cái gì nữa?
 
Upvote 0
Nếu bạn chắc chắn đúng yêu cầu là thế thì ...
-------------
Bạn xem tôi có nhầm không. Cũng có thể dùng thêm "đít thon". Tôi không dùng mà chọn cách khác.
Cách dùng WorksheetFunction coi như bài tập về nhà cho bạn.

Mã:
Sub SoSanh()
    Dim Arr1(), Arr2(), result() As Long
    Dim r1 As Long, r2 As Long, c1 As Long, c2 As Long, count As Long, c As Long
    Dim a As Double, b As Double, u12 As Long, u21 As Long, u22 As Long
    Arr1 = [B4:P6].Value
    Arr2 = [R4:AB9].Value
    u11 = UBound(Arr1, 1)
    u12 = UBound(Arr1, 2)
    u21 = UBound(Arr2, 1)
    u22 = UBound(Arr2, 2)
    ReDim result(1 To u11, 1 To u21)
On Error Resume Next
    For r1 = 1 To u11
        For r2 = 1 To u21
            count = 0
            For c1 = 1 To u12
                For c2 = 1 To u22
                    a = Arr1(r1, c1)
                    b = Arr2(r2, c2)
                    If Err.Number > 0 Then
                        Err.Number = 0
                    ElseIf a = b Then
                        For c = c1 + 1 To u12
                            If Arr1(r1, c) = a Then Arr1(r1, c) = 2147483647   '   Arr1(r1, c) = "*"
                        Next c
                        count = count + 1
                    End If
                Next c2
            Next c1
            result(r1, r2) = count
        Next r2
    Next r1
    Range("AK4").Resize(u11, u21) = result
End Sub

Tôi đưa a = Arr1(r1, c1) ra ngoài vòng For c2 = 1 To u22 để khỏi phải xác định nhiều lần

Sau khi sửa

Mã:
Sub SoSanh()
    Dim Arr1(), Arr2(), result() As Long
    Dim r1 As Long, r2 As Long, c1 As Long, c2 As Long, count As Long, c As Long
    Dim a As Double, b As Double, u12 As Long, u21 As Long, u22 As Long
    Arr1 = [B4:AK6].Value
    Arr2 = [AM4:BM9].Value
    u11 = UBound(Arr1, 1)
    u12 = UBound(Arr1, 2)
    u21 = UBound(Arr2, 1)
    u22 = UBound(Arr2, 2)
    ReDim result(1 To u11, 1 To u21)
On Error Resume Next
    For r1 = 1 To u11
        For r2 = 1 To u21
            count = 0
            For c1 = 1 To u12
                a = Arr1(r1, c1)
                If Err.Number > 0 Then
                        Err.Number = 0
                Else
                    For c2 = 1 To u22
                        b = Arr2(r2, c2)
                        If Err.Number > 0 Then
                            Err.Number = 0
                        ElseIf a = b Then
                            For c = c1 + 1 To u12
                                If Arr1(r1, c) = a Then Arr1(r1, c) = 2147483647   '   Arr2(r2, c2) = "*"
                            Next c
                            count = count + 1
                        End If
                    Next c2
                End If
            Next c1
            result(r1, r2) = count
        Next r2
    Next r1
    Range("B10").Resize(u11, u21) = result
End Sub
 
Upvote 0
Hii cái bài viết kia khi post lên mình đã sửa lại ngay rồi mà sao bạn vẫn còn lấy ra đc nhỉ( bài #19).
Cảm ơn bạn để mình thử đoạn code mới xem sao
 
Upvote 0
Hii cái bài viết kia khi post lên mình đã sửa lại ngay rồi mà sao bạn vẫn còn lấy ra đc nhỉ( bài #19).
Cảm ơn bạn để mình thử đoạn code mới xem sao

Có một điều tôi quên nói.
Bạn không nói rõ mà dữ liệu vừa SỐ vừa TEXT nên tôi tự quyết định là: 3 = "3" và 3 = "03"
Nếu coi 3 = "3" nhưng 3 <> "03" thì phải sửa lại code
 
Upvote 0
Có một điều tôi quên nói.
Bạn không nói rõ mà dữ liệu vừa SỐ vừa TEXT nên tôi tự quyết định là: 3 = "3" và 3 = "03"
Nếu coi 3 = "3" nhưng 3 <> "03" thì phải sửa lại code
Đúng rồi bạn ah, mình cần thể hiện là 03 nên mình chuyển thành dạng text, nếu để là 3 thì kiểu gì cũng lỗi khi so sánh. Còn các số khác có 2 chữ số trở lên thì để dạng số cũng được.
 
Upvote 0
Tôi đưa a = Arr1(r1, c1) ra ngoài vòng For c2 = 1 To u22 để khỏi phải xác định nhiều lần

Sau khi sửa

Mã:
Sub SoSanh()
    Dim Arr1(), Arr2(), result() As Long
    Dim r1 As Long, r2 As Long, c1 As Long, c2 As Long, count As Long, c As Long
    Dim a As Double, b As Double, u12 As Long, u21 As Long, u22 As Long
    Arr1 = [B4:AK6].Value
    Arr2 = [AM4:BM9].Value
    u11 = UBound(Arr1, 1)
    u12 = UBound(Arr1, 2)
    u21 = UBound(Arr2, 1)
    u22 = UBound(Arr2, 2)
    ReDim result(1 To u11, 1 To u21)
On Error Resume Next
    For r1 = 1 To u11
        For r2 = 1 To u21
            count = 0
            For c1 = 1 To u12
                a = Arr1(r1, c1)
                If Err.Number > 0 Then
                        Err.Number = 0
                Else
                    For c2 = 1 To u22
                        b = Arr2(r2, c2)
                        If Err.Number > 0 Then
                            Err.Number = 0
                        ElseIf a = b Then
                            For c = c1 + 1 To u12
                                If Arr1(r1, c) = a Then Arr1(r1, c) = 2147483647   '   Arr2(r2, c2) = "*"
                            Next c
                            count = count + 1
                        End If
                    Next c2
                End If
            Next c1
            result(r1, r2) = count
        Next r2
    Next r1
    Range("B10").Resize(u11, u21) = result
End Sub

Code của bạn về phần tính toán thì đúng rồi nhưng vẫn chạy lâu bạn ah, có cách nào để nó chạy nhanh hơn nữa không?
 
Upvote 0
Đúng rồi bạn ah, mình cần thể hiện là 03 nên mình chuyển thành dạng text, nếu để là 3 thì kiểu gì cũng lỗi khi so sánh. Còn các số khác có 2 chữ số trở lên thì để dạng số cũng được.

Tôi không hiểu.
Nếu ta coi là 3 = "3" và 3 = "03" thì chuyển hết thành 3. Tại sao lại bầy trò "03" để làm gì?
Nếu dữ liệu tất cả là số, tức chỉ có 0, 1, ..., 9 chứ không có "00", "01", ..., "09", thì code đơn giản hơn nhiều. Nếu dữ liệu tất cả là chuỗi thì code cũng đơn giản hơn.

Về 3 = "3" thì dễ rồi.
Nếu ta chấp nhận 3 = "03" thì chuyển hết dữ liệu về dạng số, tức không có "03" (do = 3)
Nếu ta chấp nhận 3 <> "03" thì chuyển hết dữ liệu về dạng chuỗi.
---------
Mà tôi có cảm giác là dữ liệu của bạn là nguyên (thậm chí là nguyên dương) nhưng bạn không bao giờ miêu tả dữ liệu của mình.

Thậm chí bạn nói là có mảng rất lớn nhưng không cung cấp để người khác có thể test code.

Người khác tự tạo dữ liệu hộ bạn, tự miêu tả dữ liệu hộ bạn, tự đặt yêu cầu hộ bạn, rồi viết code hộ bạn?

Tôi đã chót tham gia nên gửi bạn code cuối cùng. Các chú ý:

1. Tôi tự cho là dữ liệu là số hết.

2. Code không phục vụ các tình huống có lỗi do dữ liệu không đúng. Thực ra có thể phục vụ trường hợp lỗi nhưng như thế phải thêm code và hậu quả là bạn sẽ kêu lâu vì bạn luôn so sánh với code khác không phục vụ các tình huống lỗi. Vậy đã muốn so sánh thì phải công bằng.

3. Rất có thể dùng WorksheetFunction tối ưu hơn. Bạn phải chờ người có ý tưởng đó. Tính tôi không muốn lặp lại ý tưởng của người khác.

4. Được hay không thì tôi cũng chấm dứt ở đây.

Mã:
Sub SoSanh()
    Dim Arr1(), Arr2(), result() As Long
    Dim r1 As Long, r2 As Long, c1 As Long, c2 As Long, count As Long
    Dim a As Double, u11 As Long, u12 As Long, u21 As Long, u22 As Long, dic As Object, tmp()
    Arr1 = [B4:AK6].Value
    Arr2 = [AM4:BM9].Value
    u11 = UBound(Arr1, 1)
    u12 = UBound(Arr1, 2)
    u21 = UBound(Arr2, 1)
    u22 = UBound(Arr2, 2)
    ReDim result(1 To u11, 1 To u21)

    Set dic = CreateObject("Scripting.Dictionary")
    For r1 = 1 To u11
        dic.RemoveAll
        For c1 = 1 To u12
            a = Arr1(r1, c1)
            If Not dic.exists(a) Then dic.Add a, a
        Next k
        tmp = dic.keys
        
        For r2 = 1 To u21
            count = 0
            For c1 = 0 To UBound(tmp)
                a = tmp(c1)
                For c2 = 1 To u22
                    If a = Arr2(r2, c2) Then count = count + 1
                Next c2
            Next c1
            result(r1, r2) = count
        Next r2
    Next r1
    Range("B10").Resize(u11, u21) = result
    
    Set dic = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn, mình sẽ cố gắng đầu tư thời gian nghiên cứu môn này nhièu thêm nữa.
 
Upvote 0

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

Back
Top Bottom