meacupa
Thành viên chính thức


- Tham gia
- 2/12/11
- Bài viết
- 77
- Được thích
- 3
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
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.
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ếtCode đã 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
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ấtHí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
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.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à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
"[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"
Code đã chạy được đúng với ý mình mong muốn
Lấy mảng B44 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-")
If [COLOR=#ff0000]Arr1(iR1, jC1) = Arr2(iR2, jC2)[/COLOR] Then
Dem = Dem + 1
End If
... 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![]()
"đã 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 B44 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 B66 = 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ò.
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 có thể sửa lại đoạn này giúp mình không?
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.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
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.
"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
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
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
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
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
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
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
22, 37, 52, 81, 11, 13, 03
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
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
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
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
Đú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.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
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
Đú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.
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