Ai tạo ra chương trình giải quyết bài toán này với tốc độ nhanh nhất

Liên hệ QC

huongnghean

Thành viên mới
Tham gia
2/2/12
Bài viết
15
Được thích
2
Tham gia diễn đàn đã lâu mà chưa có đóng góp gì, chủ yếu là coi và đọc bài. Hôm nay quyết định lập nick và đóng góp cho diễn đàn kể từ giờ phút này với những bài toán "hóc" (đối với mình).
Nào, chúng ta cùng thử sức, xem tư duy của ai tốt nhất.

Mời các bạn tham gia giải bài toán sau:
http://www.mediafire.com/?fp7gjw1mo1loj7l
Trong bài toán này ta có 3 tập hợp là A.B.C
Các tập hợp này chứa các phần tử A1,A2,... (nếu có kí hiệu số 1 tức là phần tử đó thuộc tập hợp đó).
VD: Tập hợp C chứa phần tử A26,A25,...
Làm thế nào để cho ra được kết quả như trong file: Tập hợp B là tập con của A,...

Khi data đủ lớn, tức là số phần tử không phải là 27 phần tử nữa, có thể là 10.000 phần tử, và số tập hợp có thể là 30 tập hợp thì chương trình của bạn chạy hết trong thời gian bao lâu?

* bài toán nâng cao:
ngoài việc tìm ra được đáp án tập con, nếu giải quyết được cả vấn đề tìm ra hai tập hợp bằng nhau, có nghĩa rằng bạn đã là người tư duy lập trình ở mức khá rồi.

Nào, hãy cùng thử sức! Have fun.
 
Lần chỉnh sửa cuối:
Rốt cuộc bài toán này đặt ra để phục vụ việc gì và ứng dụng để làm cái gì vậy các hạ? Hay chỉ để thách nhau cho vui vậy thôi?
Mà lão thấy, ngay cả diễn giải câu hỏi của các hạ nó "xà quần" làm sao ấy? Tư duy lập trình của các hạ cũng giống cách các hạ diễn giải trong file đó hả?
 
Lần chỉnh sửa cuối:
Upvote 0
Rốt cuộc bài toán này đặt ra để phục vụ việc gì và ứng dụng để làm cái gì vậy các hạ? Hay chỉ để thách nhau cho vui vậy thôi?
Mà lão thấy, ngay cả diễn giải câu hỏi của các hạ nó "xà quần" làm sao ấy? Tư duy lập trình của các hạ cũng giống cách các hạ diễn giải trong file đó hả?
Dạ, thưa anh, em xin trả lời từng vấn đề của anh.
1. Bài toán này đặt ra một là để đố nhau cho vui, hai là nó có ứng dụng chứ không phải chỉ để vui. Cụ thể thì em xin được nói sau,
Việc giải bài toán này không khó, nhưng tốc độ của chương trình mới là vấn đề, khi mà data đủ lớn như em đã nói ấy.
2. Anh coi có chỗ nào không hiểu, anh cứ nói, em sẽ giải thích. Em thấy cách diễn đạt của em là tương đối dễ hiểu rồi. Anh nói khó hiểu thì phải nói anh chưa hiểu chỗ nào để em còn giải thích chứ, hì.
3. Data được sắp xếp
Cột A, từ cell A2 trở xuống, ghi tên các phần tử.
Hàng 1, từ cell B1 sang bên phía bên phải, ghi tên các tập hợp

Tập hợp A chứa phần tử A10 thì tại cell giao nhau giữa cột chứa tên tập hợp A và hàng chứa tên phần tử A10 sẽ có giá trị 1.

Kết quả của chương trình, anh có thể cho hiển thị ở sheet khác tùy ý. Ở trong file trên, em ghi đáp án ngay bên cạnh data cho mọi người dễ hình dung mà thôi.

P/S Có lẽ anh không hiểu thế nào là tập con? Tập hợp X được gọi là tập con của Y khi mọi phần tử của X là phần tử của Y.
Tập hợp X bằng tập hợp Y khi mọi phần tử của X là phần tử của Y và ngược lại- rất toán học phải không nào!
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ, thưa anh, em xin trả lời từng vấn đề của anh.
1. Bài toán này đặt ra một là để đố nhau cho vui, hai là nó có ứng dụng chứ không phải chỉ để vui. Cụ thể thì em xin được nói sau,
Việc giải bài toán này không khó, nhưng tốc độ của chương trình mới là vấn đề, khi mà data đủ lớn như em đã nói ấy.
2. Anh coi có chỗ nào không hiểu, anh cứ nói, em sẽ giải thích. Em thấy cách diễn đạt của em là tương đối dễ hiểu rồi. Anh nói khó hiểu thì phải nói anh chưa hiểu chỗ nào để em còn giải thích chứ, hì.
3. Data được sắp xếp
Cột A, từ cell A2 trở xuống, ghi tên các phần tử.
Hàng 1, từ cell B1 sang bên phía bên phải, ghi tên các tập hợp

Tập hợp A chứa phần tử A10 thì tại cell giao nhau giữa cột chứa tên tập hợp A và hàng chứa tên phần tử A10 sẽ có giá trị 1.

Kết quả của chương trình, anh có thể cho hiển thị ở sheet khác tùy ý. Ở trong file trên, em ghi đáp án ngay bên cạnh data cho mọi người dễ hình dung mà thôi.

P/S Có lẽ anh không hiểu thế nào là tập con? Tập hợp X được gọi là tập con của Y khi mọi phần tử của X là phần tử của Y.
Tập hợp X bằng tập hợp Y khi mọi phần tử của X là phần tử của Y và ngược lại- rất toán học phải không nào!
Theo tôi nghĩ như sau:
1/ Cố định tập hợp (th) A và so sánh th B và C với A.
2/ Cụ thể: thA có all đối tượng và th B có 3 đối tượng A1, A2, A3 => th B $ th A ...
Chung quy lại là bt so sánh và tìm trùng giữa 2 cột. Dạng bài này NDU có những UDF rất tổng quát. Hy vọng được biết mục đích và ý nghĩa của thuật giải này ngoài sự học hỏi về thuật toán.
Cám ơn.
 
Upvote 0
Bài toán của huongnghean là bài toán có dữ liệu dạng tập hợp.
Ví dụ một bài toán cụ thể như sau
Gọi Omega là tập hợp toàn thể các sinh viên trong 1 trường
Toán_1 là tập hợp các sinh viên tham gia học môn toán, nhóm 1
Toán_2 là tập hợp các sinh viên tham gia học môn toán, nhóm 2
Lý_1 là tập hợp các sinh viên tham gia học môn lý, nhóm 1
Lý_2 là tập hợp các sinh viên tham gia học môn lý, nhóm 2
v.v...

Khi đó giao của tập Toán_1 với Toán_2 phải bằng rỗng

Nếu mô tả trên file Excel thì mỗi tập là dãy số 0 hoặc 1 liên kết với tập toàn thể (dựa vào tính tuần tự của tập toàn thể), số 1 biểu thị phần tử của tập toàn thể có trong tập đó, số 0 hoặc trống biểu thị phần tử của tập toàn thể không có.

Bằng phép toán trên Excel, ta thấy
Toán_1 giao với Toán_2 khác rỗng khi và chỉ khi tích vô hướng của chúng khác 0:
(giao nhau bằng rỗng thì tích vô hướng bằng 0)

Tập các sinh viên không học lớp Lý_1 là tập toàn thể trừ tập Lý_1 (xem cột G)

Lý_1 là tập con của Toán_1 khi tập hợp Lý_1 trừ tập hợp Toán_1 bằng rỗng.
hay ((tập toàn thể trừ tập Toán_1) giao với tập Ly_1 bằng rỗng)
và có thể dùng SUMPRODUCT

Tóm lại, bài toán tập hợp trên có thể ứng dụng khi lập thời khóa biểu tín chỉ.

Cần xác định tập rỗng vì: Nếu xếp Toán_1 học tiết 1 và muốn chọn lớp thứ 2 cũng học tiết 1 thì lớp thứ 2 phải giao với tập Toán_1 bằng rỗng

có giao với Toán
Nếu được xây dựng trên Excel thì nên trên 2007 vì số môn học (tính theo cột) có thể trên 256.
Và phép toán hay dùng nhất là SUMPRODUCT.
Ngoài ra, còn phải tính Hợp, giao, hiệu
 

File đính kèm

Upvote 0
Bài toán của huongnghean là bài toán có dữ liệu dạng tập hợp.Ví dụ một bài toán cụ thể như sauGọi Omega là tập hợp toàn thể các sinh viên trong 1 trườngToán_1 là tập hợp các sinh viên tham gia học môn toán, nhóm 1Toán_2 là tập hợp các sinh viên tham gia học môn toán, nhóm 2Lý_1 là tập hợp các sinh viên tham gia học môn lý, nhóm 1Lý_2 là tập hợp các sinh viên tham gia học môn lý, nhóm 2v.v...Khi đó giao của tập Toán_1 với Toán_2 phải bằng rỗngNếu mô tả trên file Excel thì mỗi tập là dãy số 0 hoặc 1 liên kết với tập toàn thể (dựa vào tính tuần tự của tập toàn thể), số 1 biểu thị phần tử của tập toàn thể có trong tập đó, số 0 hoặc trống biểu thị phần tử của tập toàn thể không có....
Nếu dữ liệu nhiều e rằng dùng sumproduct sẽ rất nặng.Tôi làm thử code sau
- Nguồn: Sh Data
- Kết quả: Sh Kq
Code chính là code tạoBC
PHP:
Dim endR&, endC&, iC&, tmpC&, iCol&, I&, s&
Dim iTrue As Boolean
Dim sArr, Arr01, Arr02, ArrKq(1 To 65000, 1 To 2)
Dim Dic As Object
Dim T As Double
Const fR = 2: Const fC = 2
Sub TaoArr()
With Sheets("Data")
  endR = .Cells(65000, 1).End(xlUp).Row
  endC = .Cells(1, 256).End(xlToLeft).Column
  sArr = .Range(.Cells(fR, 1), .Cells(endR, 1)).Value
End With
End Sub
Sub TaoDic(Arr, fArr)
Set Dic = CreateObject("Scripting.Dictionary")
For I = 1 To UBound(sArr)
  If Len(Arr01(I, 1)) > 0 Then
    Dic.Add sArr(I, 1), I
  End If
Next I
End Sub

Sub SoSanh()
iTrue = True
For I = 1 To UBound(Arr02)
  If Len(Arr02(I, 1)) > 0 Then
    If Not Dic.Exists(sArr(I, 1)) Then
      iTrue = False
      Exit Sub
    End If
  End If
Next I
End Sub
Sub TaoBC()
T = Timer
TaoArr
s = 0
For iC = fC To endC
  With Sheets("Data")
    Arr01 = .Range(.Cells(fR, iC), .Cells(endR, iC)).Value
  End With
  TaoDic sArr, Arr01
  iCol = iC
  For tmpC = fC To endC
    If tmpC <> iCol Then
      With Sheets("Data")
        Arr02 = .Range(.Cells(fR, tmpC), .Cells(endR, tmpC)).Value
      End With
      SoSanh
      If iTrue Then
        s = s + 1
        With Sheets("Data")
          ArrKq(s, 1) = .Cells(1, iCol)
          ArrKq(s, 2) = .Cells(1, tmpC)
        End With
      Else
        GoTo exit_for
      End If
    End If
exit_for:
  Next tmpC
  Set Dic = Nothing
Next iC
With Sheets("Kq")
  .[A2].Resize(1000, 2).ClearContents
  .[A2].Resize(s, 2) = ArrKq
  .[C1] = Timer - T
End With
Erase sArr, Arr01, Arr02, ArrKq
Set Dic = Nothing
End Sub
Cứ mỗi lần sửa bài, đổi sang khung lớn là các dòng lại dồn lại, chả biết sao.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Ý tưởng của huongnghean là lập trình, tối ưu thời gian. Thấy dữ liệu phù hợp với ý tưởng của tôi về tập hợp nên tôi nêu thêm để thấy ý nghĩa của bài toán.

Thực tế có các phần mềm lập TKB cho lớp tín chỉ. Song chương trình thế nào cũng không thỏa mãn người dùng, ví dụ muốn cho học thêm (bù do bận đi công tác) một buổi nào đó, chả ông giáo vụ nào muốn tìm buổi mà mọi sv của lớp đều không có giờ khác.

Vì thế tôi chỉ muốn tận dụng các hàm có sẵn, và có thể thêm 1 số hàm tối thiểu và xử lý thủ công.

Còn có cái khó nữa là chưa chắc đã có danh sách SV cùng các môn học và lịch học.

Tôi cũng chưa biết có thành công không, nhưng nêu lên để thấy ứng dụng của bài toán có số liệu dạng tập hợp.

Để có các tập hợp đó, từ danh sách SV đi kèm tên môn học đã đăng ký (quan hệ nhiều - nhiều), tạo Pivot có cột 1 là danh sách sv (duy nhất), các cột sau là tên môn học với dữ liệu của Pivot dùng chức năng COUNT (chỉ cho 1 hoặc trống, nếu cho 2 là sai khi SV đăng ký môn học), có SUM ở cuối cột (sĩ số)..., SUM ở cuối hàng cho thấy SV đã đăng ký mấy môn...

Viết đến đây thấy tản mạn quá. Song có vài vấn đề như tính hợp của 2 tập (kết quả là 1 tập), ví dụ đã có các lớp học para 1 (gồm tiết 1, 2), ta cần biết hợp của các lớp học para 1, sau đó mới chọn lớp học para 2 (gồm tiết 3, 4) với yêu cầu ưu tiên cho các sinh viên đã học tiết 1 (cho họ bớt đi lại). Hoặc là chọn lớp học para 3 (tiết 5, 6, buổi chiều) thì ưu tiên không chọn các sinh viên đã học Para 1 và 2 (đã học cả sáng rồi), tức là tìm giao của các sinh viên đã học Para 1 và 2.

vân vân.

Cũng có thể là viển vông. Thôi, cho học bù buổi tối hoặc chủ nhật.
Cảm ơn các bạn đã đọc bài
 
Lần chỉnh sửa cuối:
Upvote 0
Trước hết, mình xin cảm ơn haonlh, bạn đã nói hoàn toàn đúng ý nghĩa của bài toán này. Nó có một ứng dụng rất lớn trong việc lập thời gian biểu.
ThuNghi@: thực sự thì mình vẫn chưa hiểu hết các lệnh bạn đã sử dụng, nhưng thật tuyệt vời khi nó cho kết quả chính xác với thời gian đáng kinh ngạc.
Nếu mình đoán không lầm thì cell C1 ở sheet KQ là nơi ghi tốc độ chạy chương trình. Thực sự đáng ngạc nhiên.
Với 5070 phần tử, 24 tập hợp, thời gian hoành thành tìm kiếm là 2.735.
Mình nghĩ, có lẽ đây là chương trình tốt nhất. Thật sự cảm ơn bạn, chắc phải mất rất nhiều thời gian nữa, tôi mới có thể hiểu được hết những
gì bạn viết. Thực lòng ngưỡng mộ bạn.
 
Lần chỉnh sửa cuối:
Upvote 0
Tiếp nối chủ đề ai tạo ra chương trình nhanh nhất

Gắn liền với chủ đề vừa qua là bài toán của ngày hôm nay.
http://www.mediafire.com/?loz5rs73npjxqmf

Ở bài toán này sheet 1 là data:
Ta có 3 tập hợp được bố trí như trong file (sheet 1): tập hợp A, B,C
Chúng có các phần tử A1,A2,B1,C1,...

Data được sắp xếp bắt đầu từ dòng 2 trở xuống, các tập hợp khác nhau được xếp cách nhau đúng 1 dòng.
Mục đích của chương trình là kết quả được nêu ở trong sheet 2.

Rõ ràng bài toán này không khó, cái khó là tạo ra chương trình nhanh nhất để áp vào data lớn :)

Mình rất hi vọng lại được coi một chương trình đẹp như vừa rồi bạn thunghi đã làm được :)
 
Upvote 0
Gắn liền với chủ đề vừa qua là bài toán của ngày hôm nay.
http://www.mediafire.com/?loz5rs73npjxqmf

Ở bài toán này sheet 1 là data:
Ta có 3 tập hợp được bố trí như trong file (sheet 1): tập hợp A, B,C
Chúng có các phần tử A1,A2,B1,C1,...

Data được sắp xếp bắt đầu từ dòng 2 trở xuống, các tập hợp khác nhau được xếp cách nhau đúng 1 dòng.
Mục đích của chương trình là kết quả được nêu ở trong sheet 2.

Rõ ràng bài toán này không khó, cái khó là tạo ra chương trình nhanh nhất để áp vào data lớn :)

Mình rất hi vọng lại được coi một chương trình đẹp như vừa rồi bạn thunghi đã làm được :)
Đúng ra bài này làm bằng PivotTable là tối ưu nhất
Nếu viết bằng code thì dạng bài này cũng đã có trên diễn đàn rồi. Giờ làm lại nhé
PHP:
Sub Transfer(ByVal Src1 As Range, ByVal Src2 As Range, ByVal Target As Range)
  Dim Arr(), sArray1, sArray2, Dic1, Dic2, tmp1, tmp2
  Dim i As Long, lR As Long, lC As Long, n As Long, m As Long
  Set Dic1 = CreateObject("Scripting.Dictionary")
  Set Dic2 = CreateObject("Scripting.Dictionary")
  sArray1 = Src1.Value
  sArray2 = Src2.Value
  ReDim Arr(1 To UBound(sArray1, 1), 1 To 255)
  lR = 1: lC = 1
  For i = 1 To UBound(sArray1)
    If sArray1(i, 1) <> "" And sArray2(i, 1) <> "" Then
      tmp1 = sArray1(i, 1): tmp2 = sArray2(i, 1)
      If Not Dic1.Exists(tmp1) Then
        lR = lR + 1
        Dic1.Add tmp1, lR
        Arr(lR, 1) = tmp1
      End If
      n = Dic1.Item(tmp1)
      If Not Dic2.Exists(tmp2) Then
        lC = lC + 1
        Dic2.Add tmp2, lC
        Arr(1, lC) = tmp2
      End If
      m = Dic2.Item(tmp2)
      Arr(n, m) = Arr(n, m) + 1
    End If
  Next i
  Target.Resize(lR, lC).Value = Arr
End Sub
PHP:
Sub Main()
  Dim Src1 As Range, Src2 As Range, Target As Range, TG As Double
  TG = Timer
  Sheet2.Cells.ClearContents
  Set Src1 = Sheet1.Range("A2:A65000")
  Set Src2 = Sheet1.Range("B2:B65000")
  Set Target = Sheet2.Range("A1")
  Transfer Src1, Src2, Target
  MsgBox Timer - TG
End Sub
Thử nghiệm 60000 dòng dữ liệu ra kết quả trong 1.5 giây
 

File đính kèm

Upvote 0
Anh cho em hỏi
PHP:
UBound(sArray1)
có phải là số phần tử trong mảng không
 
Upvote 0
Anh cho em hỏi
PHP:
UBound(sArray1)
có phải là số phần tử trong mảng không
Không phải là số phần tử mà là chỉ số thứ tự của phần tử cuối cùng
Ví dụ:
- Với mảng đánh số thứ tự đầu tiên là 0 và số phần tử trong mảng là 3 thì chỉ số thứ tự của phần tử cuối cùng sẽ là 2 (0, 1, 2)
- Với mảng đánh số thứ tự đầu tiên là 1 và số phần tử trong mảng là 3 thì chỉ số thứ tự của phần tử cuối cùng sẽ là 3 (1, 2, 3)
 
Upvote 0
Tiếp theo

Hai bài trước anh Ndu và bạn thunghi đã cho em thấy được sức mạnh của Dictionary. Quả thực đây là vấn đề em chưa biết, em đã ngồi cả sáng đọc bài về dictionary của anh kyo và thấy rất hay. Cảm ơn diễn đàn nhiều lắm.

Lần này em mang tới một bài toán về nhóm.
http://www.mediafire.com/?gkp1nsqh888v8hn

A,B,C,D,... là các tập hợp.
Ở bên trái là các phần tử. Kí hiệu 1 có nghĩa là tập hợp đó chứa phần tử ở hàng tương ứng. Tuy nhiên vì để cho đỡ rối mắt, em xoá phần dữ liệu tên các phần tử đi rồi, hi vọng sẽ không làm khó mọi người. Hi.

Chương trình có nhiệm vụ kết nối các tập hợp có quan hệ với nhau.
VD: Tập hợp A và B có quan hệ với nhau vì chúng đều chứa chung 1 phần tử. ( Ở hàng 2, tập A và B đều có giá trị 1 phải không ạ)
Tập B và C có quan hệ với nhau (ở hàng 3, tập B và C đều có giá trị 1 phải không ạ)....

Như vậy tổng hợp các tập hợp có mối quan hệ với nhau ta được kết quả ở sheet 2.

Tuy nhiên đây chưa phải kết quả cuối cùng mà em mong muốn.
Nếu ta để ý thì thấy A và B quan hệ với nhau. sau đó lại thấy B và C quan hệ với nhau => nếu có thể chương trình hãy gộp chúng lại thành một nhóm lớn: A,B,C có quan hệ với nhau.

Tương tự ta có nhóm lớn D,E,F,Q có quan hệ với nhau.
Mọi người hãy mở sheet 3 ra để xem kết quả cuối cùng.

Và đây chính là mục đích của chương trình, tạo ra kết quả như sheet 3.

Em sử dụng rất nhiều câu lệnh for và if, sợ rằng khi dữ liệu đủ lớn thì...

Mong được mọi người chỉ giáo. :)
 
Upvote 0
Tiếp theo


Lần này em mang tới một bài toán về nhóm.
http://www.mediafire.com/?gkp1nsqh888v8hn

A,B,C,D,... là các tập hợp.
Ở bên trái là các phần tử. Kí hiệu 1 có nghĩa là tập hợp đó chứa phần tử ở hàng tương ứng. Tuy nhiên vì để cho đỡ rối mắt, em xoá phần dữ liệu tên các phần tử đi rồi, hi vọng sẽ không làm khó mọi người. Hi.

Chương trình có nhiệm vụ kết nối các tập hợp có quan hệ với nhau.
VD: Tập hợp A và B có quan hệ với nhau vì chúng đều chứa chung 1 phần tử. ( Ở hàng 2, tập A và B đều có giá trị 1 phải không ạ)
Tập B và C có quan hệ với nhau (ở hàng 3, tập B và C đều có giá trị 1 phải không ạ)....

Như vậy tổng hợp các tập hợp có mối quan hệ với nhau ta được kết quả ở sheet 2.

Tuy nhiên đây chưa phải kết quả cuối cùng mà em mong muốn.
Nếu ta để ý thì thấy A và B quan hệ với nhau. sau đó lại thấy B và C quan hệ với nhau => nếu có thể chương trình hãy gộp chúng lại thành một nhóm lớn: A,B,C có quan hệ với nhau.

Tương tự ta có nhóm lớn D,E,F,Q có quan hệ với nhau.
Mọi người hãy mở sheet 3 ra để xem kết quả cuối cùng.

Và đây chính là mục đích của chương trình, tạo ra kết quả như sheet 3.

Em sử dụng rất nhiều câu lệnh for và if, sợ rằng khi dữ liệu đủ lớn thì...

Mong được mọi người chỉ giáo. :)
Thấy cục xương mà tưởng cục sườn. Híc, khó nuốt quá. Tưng tưng, buồn quá làm đại chứ chưa ok lắm
Chọn sheet3 xem kết quả ( không đồng ý cũng chịu, chỉ làm được tới đó)
Thân
 

File đính kèm

Upvote 0
re

Cảm ơn bác.
đúng là chưa ổn lắm, đặc viết với data lớn, số phần tử nhiều, trải dài từ cell I1 sang bên phải.
(115 phần tử) và với số dòng lên tới 612 dòng thì code này bất lực.
 
Upvote 0
Cảm ơn bác.
đúng là chưa ổn lắm, đặc viết với data lớn, số phần tử nhiều, trải dài từ cell I1 sang bên phải.
(115 phần tử) và với số dòng lên tới 612 dòng thì code này bất lực.
Vậy bi giờ mình "chơi" nó bằng em "Đít - to" nhé ( bài kia mình chỉ sử dụng mảng thôi, chắc do cách giải không hợp lý)
Bạn chép code này, đứng ở sheet1 chạy code nhé, kết quả ở cột H sheet3
Mã:
Public Sub Tohop_Ditto()
    Dim Vung, Ws, I, J, K, d, iCuoi, Ten, kK, M, Dem, Gom, Tach, A, B, Kq(), ByeBye(), aA, SoNhom
    Set Ws = Sheets("sheet1")
    Set d = CreateObject("scripting.dictionary")
    iCuoi = Ws.Range("I1:IU50000").SpecialCells(xlCellTypeLastCell).Row
    Vung = Range([I1], [I1].End(xlToRight)).Resize(iCuoi)
        For I = 2 To UBound(Vung, 1)
            For J = 1 To UBound(Vung, 2)
                If Vung(I, J) = 1 Then
                    Ten = Vung(1, J):  Gom = Gom & Ten & " "
                    If d.exists(Ten) Then Dem = Dem + 1: kK = d.Item(Ten)
                End If
        Next J
            Tach = Split(Gom, " ")
                If Dem = 0 And Gom <> "" Then
                    M = M + 1
                        For K = LBound(Tach) To UBound(Tach) - 1
                            d.Add Tach(K), M
                        Next K
                Else
                        For K = LBound(Tach) To UBound(Tach) - 1
                            If Not d.exists(Tach(K)) Then d.Add Tach(K), kK
                        Next K
                End If
        Gom = "": Dem = 0
        Next I
            A = d.keys: B = d.items: ReDim Kq(1 To d.Count, 1 To 2)
            For I = 0 To d.Count - 1
                Kq(I + 1, 2) = A(I)
                Kq(I + 1, 1) = B(I)
                SoNhom = IIf(SoNhom > B(I), SoNhom, B(I))
            Next I
                ReDim ByeBye(1 To UBound(Kq), 1 To 2)
                    For I = 1 To UBound(Kq)
                        ByeBye(Kq(I, 1), 1) = "Nhóm " & Kq(I, 1)
                        ByeBye(Kq(I, 1), 2) = ByeBye(Kq(I, 1), 2) & " " & Kq(I, 2)
                    Next I
    Sheets("Sheet3").[H1].Resize(UBound(ByeBye), 2) = ByeBye
End Sub
Bạn kiểm tra giúp mình hoặc có khi đưa cái tổ hợp "tổ bà chảng" của bạn lên đây, nhìn thấy bài mới dễ làm và dễ kiểm tra
Thân
 
Lần chỉnh sửa cuối:
Upvote 0
Hjc. Em thật ngưỡng mộ anh. Thật không thể đỡ được. Chạy quá nhanh mà em chưa kịp đinh thần đã xong rồi anh ạ. Thực sự hâm mộ anh.
PHP:
UBound(Vung, 1)
UBound(Vung, 2)
LBound(Tach)
Có nghĩa là gì vậy anh? em chưa biết mấy lệnh này, hu hu
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom