Tìm nhóm số với số cột lớn nhất

Liên hệ QC
Bạn ơi, với code không lấy kết quả trùng ở bài #28, Hôm nay mình kiểm tra lại thêm lần nữa. Khi cho chạy với vòng lặp 250, lấy 30 kết quả đầu tiên thì mình thấy kết quả vẫn có giá trị trùng lặp: ví dụ dòng 2 giá trị 99 bị trùng 2 lần. Mong bạn xem giúp vì sao lại như vậy, mình gửi file minh hoạ cho bạn kiểm tra! Xin cảm ơn!
p/s: Ngoài ra khi mình muốn khai báo với vòng lặp lớn hơn 250 thì báo lỗi tràn ra: overflow!
bạn dùng code mới
Mã:
Sub Loc_Cot()
Dim Dic As Object, DicKQ As Object, tmp As String, Arr(), Sarr(), Darr(), Kq(), i As Integer, j As Integer, n As Integer
Dim C As Integer, k As Integer, dong As Integer, Dkq As Integer, jk As Integer, MinC As Integer, S As Integer, Lap As Integer
Set Dic = CreateObject("scripting.dictionary")
Set DicKQ = CreateObject("scripting.dictionary")
C = 100:     MinC = 150
k = Sheets("DULIEU").UsedRange.Rows.Count - 1
Dkq = 30 'khai báo Dkq, so dòng ket qua theo ý
Lap = 350  'khai báo Lap, càng lon chay càng lau và ít bo sot ket qua
Sarr = Sheets("DULIEU").Range("A2", Sheets("DULIEU").Cells(k + 2, C)).Value
ReDim Darr(1 To UBound(Sarr), 1 To UBound(Sarr, 2))
ReDim Arr(1 To 2, 1 To C + 1):  ReDim Kq(1 To Dkq, 1 To C + 1)
For j = 1 To C
  Dic.RemoveAll:  k = 0
  For i = 1 To UBound(Sarr)
    If Sarr(i, j) <> "" Then
      If Not Dic.exists(Sarr(i, j)) Then
        Dic.Add Sarr(i, j), ""
        k = k + 1
        Darr(k, j) = Sarr(i, j)
      End If
    Else
      Arr(2, j) = k:       Exit For
    End If
  Next i
Next j
For S = 1 To Lap
  For k = 1 To C
    For i = 1 To Arr(2, k)
        Dic.RemoveAll:      Dic.Add Darr(i, k), ""
        Arr(1, C + 1) = 0:  Arr(1, k) = Darr(i, k)
        Arr(1, C + 1) = Arr(1, C + 1) + 1
        For jk = 2 To C
            j = jk:            If jk = k Then j = 1
            Arr(1, j) = ""
            For n = 1 To Arr(2, j)
                If Not Dic.exists(Darr(n, j)) Then
                    Dic.Add Darr(n, j), ""
                    Arr(1, j) = Darr(n, j)
                    Arr(1, C + 1) = Arr(1, C + 1) + 1
                    Exit For
                End If
            Next n
        Next jk
        tmp = ""
        For j = 1 To C
          If Arr(1, j) = "" Then
            tmp = tmp & "z" & "_"
          Else
            tmp = tmp & "z" & Arr(1, j)
          End If
        Next j
        If Not DicKQ.exists(tmp) Then
          DicKQ.Add tmp, ""
        Else
          GoTo Tiep
        End If
        If dong < Dkq Then
            dong = dong + 1
            For j = 1 To C + 1
                Kq(dong, j) = Arr(1, j)
            Next j
            If MinC > Arr(1, C + 1) Then MinC = Arr(1, C + 1)
        Else
            If Arr(1, C + 1) > MinC Then
              For n = 1 To Dkq
                If Kq(n, C + 1) = MinC Then
                  For j = 1 To C + 1
                    Kq(n, j) = Arr(1, j)
                  Next j
                  Exit For
                End If
              Next n
              MinC = 150
              For n = 1 To Dkq
                If MinC > Kq(n, C + 1) Then MinC = Kq(n, C + 1)
              Next n
            End If
        End If
Tiep:
    Next i
  Next k
  Darr = NgauNhien(Darr, Arr, C)
Next S
Sheets("KETQUA").Range("A2:CW2000").ClearContents
Sheets("KETQUA").Range("A2").Resize(Dkq, C + 1) = Kq
Set Dic = Nothing:    Set DicKQ = Nothing
End Sub


Function NgauNhien(Darr(), Arr(), C)
Dim Dic As Object, tmp As Integer, Sarr(), i As Integer, j As Integer, k As Integer
Set Dic = CreateObject("scripting.dictionary")
ReDim Sarr(1 To UBound(Darr), 1 To UBound(Darr, 2))
For j = 1 To C
  Dic.RemoveAll:  k = 0
  Do
    tmp = Int((Arr(2, j) * Rnd) + 1)
    If Not Dic.exists(tmp) Then
      k = k + 1:  Dic.Add tmp, ""
      Sarr(k, j) = Darr(tmp, j)
    End If
  Loop Until k = Arr(2, j)
Next j
NgauNhien = Sarr
Set Dic = Nothing
End Function
 
quote_icon.png
Nguyên văn bởi winvista
Bạn áp dụng cái file các số nhiều này để làm gì vậy, có thể nói cho tôi và mọi người học hỏi ?

Sơn Mã cho câu trả lời?

Bạn áp dụng cái file các số nhiều này để làm gì vậy, có thể nói cho tôi và mọi người học hỏi ?
 
Cảm ơn bạn rất nhiều. Trong code trên khi mình cho chạy code thì mình tìm ra được những nhóm kết quả có 20-30 giá trị là đã thoả mãn rồi. Nếu mình muốn tìm ra những nhóm mà phải có 80-90 giá trị mới lấy thì mình làm như thế nào? Cảm ơn bạn nhiều!
bạn chạy code
Mã:
Dim C As Integer
Sub TimTrung1()
Dim Dic As Object, DicKQ As Object, tmp As String, Arr(), Darr(), Sarr(), Tmparr, Kq(), KqCot()
Dim i As Integer, j As Integer, k As Integer, Cot As Integer, Vong As Integer, S As Long, Dkq As Long, Lap As Long, n As Long
Set Dic = CreateObject("scripting.dictionary")
Set DicKQ = CreateObject("scripting.dictionary")
n = Sheets("DULIEU").UsedRange.Rows.Count - 1
Cot = Sheets("DULIEU").UsedRange.Columns.Count
C = 80      'khai báo so cot ket qua
Dkq = 1000  'khai báo so dòng ket qua
Lap = 5000  'khai báo so dòng Lap > Dkq, càng lon chay càng lau và ít bo sot ket qua
Darr = Sheets("DULIEU").Range("A2").Resize(n + 1, Cot).Value
ReDim Sarr(1 To n + 1, 1 To Cot)


For j = 1 To Cot
  For i = 1 To n
    If Darr(i, j) <> "" Then
      tmp = Val(Darr(i, j)) & "z" & j
      If Not Dic.exists(tmp) Then Dic.Add tmp, ""
    End If
  Next i
Next j


ReDim Kq(1 To Dkq, 1 To Cot + 1)
ReDim KqCot(1 To Dkq, 1 To C + 2)
n = 0
For S = 1 To Lap
  ReDim Sarr(1 To C)
  ReDim Arr(1 To 2, 1 To Cot + 1)
  Sarr = NN_C:   k = 0:    Vong = 0
  Do
    For i = 1 To C
      For j = 1 To Cot
        If Arr(2, j) = "" Then
          If Dic.exists(Sarr(i) & "z" & j) Then
            k = k + 1
            Arr(1, j) = Sarr(i)
            Arr(2, j) = j
            Exit For
          End If
        End If
      Next j
    Next i
    Vong = Vong + 1
    If Vong = Cot Then GoTo tiep
  Loop Until k = Cot
  
  If k = Cot Then
      tmp = SortArrToStr(Arr, "z", Cot)
      If Not DicKQ.exists(tmp) Then
        DicKQ.Add tmp, ""
        n = n + 1
        Kq(n, Cot + 1) = i
        For j = 1 To Cot
          Kq(n, j) = Arr(1, j)
        Next j
        Tmparr = Split(tmp, "z")
        KqCot(n, 1) = Tmparr(0)
        k = 1
        For j = 1 To Cot - 1
          If KqCot(n, k) <> Tmparr(j) Then
            k = k + 1
            KqCot(n, k) = Tmparr(j)
          End If
        Next j
        Kq(n, Cot + 1) = k
        KqCot(n, C + 1) = k
        KqCot(n, C + 2) = n + 1
      End If
    End If
  If n = Dkq Then Exit For
tiep:
Next S


Sheets("KETQUA").Range("A2").Resize(10000, Cot).ClearContents
Sheets("Sheet1").Range("A2").Resize(10000, C + 2).ClearContents
If n > 0 Then
  Sheets("KETQUA").Range("A2").Resize(n, Cot + 1) = Kq
  Sheets("Sheet1").Range("A2").Resize(n, C + 2) = KqCot
  Sheets("Sheet1").Activate
End If
Set Dic = Nothing:  Set DicKQ = Nothing
Erase Arr:    Erase Darr:   Erase Sarr:    Erase Kq:   Erase Tmparr:    Erase KqCot
End Sub


Function SortArrToStr(Tarr As Variant, Str As String, k As Integer) As String
  Dim ArrList As Object, Tmparr As Variant, j As Integer, tmp As String
  Set ArrList = CreateObject("System.Collections.ArrayList")
  For j = 1 To k
    tmp = Format(Tarr(1, j), "00")
    ArrList.Add tmp
  Next j
  ArrList.Sort
  Tmparr = ArrList.ToArray
  SortArrToStr = Join(Tmparr, Str)
  Set ArrList = Nothing:    Erase Tmparr
End Function
 
Function NN_C() As Variant
Dim Dic As Object, Tarr(), tmp As Byte, k As Byte
Set Dic = CreateObject("scripting.dictionary")
ReDim Tarr(1 To C)
  Do
    tmp = Int(100 * Rnd)
    If Not Dic.exists(tmp) Then
      k = k + 1:  Dic.Add tmp, ""
      Tarr(k) = tmp
    End If
  Loop Until k = C
NN_C = Tarr
Set Dic = Nothing:  Erase Tarr
End Function
 
bạn chạy code
Mã:
Dim C As Integer
Sub TimTrung1()
Dim Dic As Object, DicKQ As Object, tmp As String, Arr(), Darr(), Sarr(), Tmparr, Kq(), KqCot()
Dim i As Integer, j As Integer, k As Integer, Cot As Integer, Vong As Integer, S As Long, Dkq As Long, Lap As Long, n As Long
Set Dic = CreateObject("scripting.dictionary")
Set DicKQ = CreateObject("scripting.dictionary")
n = Sheets("DULIEU").UsedRange.Rows.Count - 1
Cot = Sheets("DULIEU").UsedRange.Columns.Count
C = 80      'khai báo so cot ket qua
Dkq = 1000  'khai báo so dòng ket qua
Lap = 5000  'khai báo so dòng Lap > Dkq, càng lon chay càng lau và ít bo sot ket qua
Darr = Sheets("DULIEU").Range("A2").Resize(n + 1, Cot).Value
ReDim Sarr(1 To n + 1, 1 To Cot)


For j = 1 To Cot
  For i = 1 To n
    If Darr(i, j) <> "" Then
      tmp = Val(Darr(i, j)) & "z" & j
      If Not Dic.exists(tmp) Then Dic.Add tmp, ""
    End If
  Next i
Next j


[SIZE=3][COLOR=#ffd700]ReDim Kq(1 To Dkq, 1 To Cot + 1)[/COLOR][/SIZE][COLOR=#ffd700][/COLOR]
ReDim KqCot(1 To Dkq, 1 To C + 2)
n = 0
For S = 1 To Lap
  ReDim Sarr(1 To C)
  ReDim Arr(1 To 2, 1 To Cot + 1)
  Sarr = NN_C:   k = 0:    Vong = 0
  Do
    For i = 1 To C
      For j = 1 To Cot
        If Arr(2, j) = "" Then
          If Dic.exists(Sarr(i) & "z" & j) Then
            k = k + 1
            Arr(1, j) = Sarr(i)
            Arr(2, j) = j
            Exit For
          End If
        End If
      Next j
    Next i
    Vong = Vong + 1
    If Vong = Cot Then GoTo tiep
  Loop Until k = Cot
  
  If k = Cot Then
      tmp = SortArrToStr(Arr, "z", Cot)
      If Not DicKQ.exists(tmp) Then
        DicKQ.Add tmp, ""
        n = n + 1
        Kq(n, Cot + 1) = i
        For j = 1 To Cot
          Kq(n, j) = Arr(1, j)
        Next j
        Tmparr = Split(tmp, "z")
        KqCot(n, 1) = Tmparr(0)
        k = 1
        For j = 1 To Cot - 1
          If KqCot(n, k) <> Tmparr(j) Then
            k = k + 1
            KqCot(n, k) = Tmparr(j)
          End If
        Next j
        Kq(n, Cot + 1) = k
        KqCot(n, C + 1) = k
        KqCot(n, C + 2) = n + 1
      End If
    End If
  If n = Dkq Then Exit For
tiep:
Next S


Sheets("KETQUA").Range("A2").Resize(10000, Cot).ClearContents
Sheets("Sheet1").Range("A2").Resize(10000, C + 2).ClearContents
If n > 0 Then
  Sheets("KETQUA").Range("A2").Resize(n, Cot + 1) = Kq
  Sheets("Sheet1").Range("A2").Resize(n, C + 2) = KqCot
  Sheets("Sheet1").Activate
End If
Set Dic = Nothing:  Set DicKQ = Nothing
Erase Arr:    Erase Darr:   Erase Sarr:    Erase Kq:   Erase Tmparr:    Erase KqCot
End Sub


Function SortArrToStr(Tarr As Variant, Str As String, k As Integer) As String
  Dim ArrList As Object, Tmparr As Variant, j As Integer, tmp As String
  Set ArrList = CreateObject("System.Collections.ArrayList")
  For j = 1 To k
    tmp = Format(Tarr(1, j), "00")
    ArrList.Add tmp
  Next j
  ArrList.Sort
  Tmparr = ArrList.ToArray
  SortArrToStr = Join(Tmparr, Str)
  Set ArrList = Nothing:    Erase Tmparr
End Function
 
Function NN_C() As Variant
Dim Dic As Object, Tarr(), tmp As Byte, k As Byte
Set Dic = CreateObject("scripting.dictionary")
ReDim Tarr(1 To C)
  Do
    tmp = Int(100 * Rnd)
    If Not Dic.exists(tmp) Then
      k = k + 1:  Dic.Add tmp, ""
      Tarr(k) = tmp
    End If
  Loop Until k = C
NN_C = Tarr
Set Dic = Nothing:  Erase Tarr
End Function
Bạn ơi, khi mình cập nhật thêm dữ liệu ở sheet(DULIEU) lên 2500 cột dữ liệu thì mình thấy báo lỗi OUT OFF MEMORY và báo lỗi code chỗ tô vàng! Bạn giúp mình điều chỉnh code chỗ nào để có thể sử dụng số liệu lên 2500 cột được không? Xin chân thành cảm ơn bạn!
 
Bạn ơi, khi mình cập nhật thêm dữ liệu ở sheet(DULIEU) lên 2500 cột dữ liệu thì mình thấy báo lỗi OUT OFF MEMORY và báo lỗi code chỗ tô vàng! Bạn giúp mình điều chỉnh code chỗ nào để có thể sử dụng số liệu lên 2500 cột được không? Xin chân thành cảm ơn bạn!
bạn thử giảm số dòng kết quả lại xem sao
nếu không được thì có nhiều cách:
- chia dữ liệu ra từng phần để xử lý
- dùng công cụ lập trình khác mạnh hơn
- trang bị siêu máy tính
các cách nầy chỉ dành cho dân chuyên nghiệp, không có mình trong đó
 
Mình mới đọc bài đăng của bạn & xin vài í như sau:

Có tăng lên 2500 cột chăng nữa, nhưng ta chỉ chọn lấy 100 cột có nhiều số nhất mà thôi!

Để vậy: Trong từng cột ta cần xử lí xóa các số trùng trong nó trước đi đã.

Sau đó là chọn lấy 100 cột;

Từ 100 cột ta lại áp dụng macro bài trên của chàng HieuXD xem sao(?)

Nếu 100 cột đã chọn chưa thỏa, thì ta lại nâng dần số cột lên, theo chuỗi nào đó, như 110, 120, . . . .

Chúc vui & thành công!

Nếu đem cái này áp dụng chơi sổ số & trúng thì mời bọn này với nha!
 
Chúc vui & thành công!
Nếu đem cái này áp dụng chơi sổ số & trúng thì mời bọn này với nha!
khà khà, chắc hơn 99,999% là không được mời rồi
dùng toán thống kê để thắng bạc chỉ là các truyền thuyết được thổi phồng của giới truyền thông và của các thầy dạy toán xác suất thống kê, nhằm kích thích sự thích thú và đam mê trong việc học và nghiên cứu môn học khó nuốt của những học trò ngây thơ. có những người có trong tay hàng trăm, hàng nghìn nhà toán học và tin học hàng đầu thế giới nhưng không bao giờ nghiên cứu cách đánh thắng bạc thắng sổ số, vì họ biết chắc chắn sẽ thất bại
sổ số là trò chơi may rủi và ngẫu nhiên, phần thắng luôn thuộc về người đề ra luật chơi, người mua vé số biết sẽ thua, nhưng lại được niềm hy vọng với giá không mắc lắm.
dùng toán thống kê để tính số có khả năng trúng, tìm đủ cách nhưng sai cứ kế tiếp sai, đành bám vào hy vọng, có ngày nào đó nằm mơ thấy trúng số
 
Có tăng lên 2500 cột chăng nữa, nhưng ta chỉ chọn lấy 100 cột có nhiều số nhất mà thôi!

Để vậy: Trong từng cột ta cần xử lí xóa các số trùng trong nó trước đi đã.

Sau đó là chọn lấy 100 cột;

Từ 100 cột ta lại áp dụng macro bài trên của chàng HieuXD xem sao(?)

Nếu 100 cột đã chọn chưa thỏa, thì ta lại nâng dần số cột lên, theo chuỗi nào đó, như 110, 120, . . . .

Chúc vui & thành công!

Nếu đem cái này áp dụng chơi sổ số & trúng thì mời bọn này với nha!
Vâng, ý này của bạn hay quá! Mong bạn giúp đỡ. Xin cảm ơn ạ!
 
Dạo này phong trào lotto phát triển vậy, không biết ai nhờ excel, gpe trúng chưa nhỉ?, trúng thì trích 10% thì cả diễn đàn nhậu to
 
Có tăng lên 2500 cột chăng nữa, nhưng ta chỉ chọn lấy 100 cột có nhiều số nhất mà thôi!

Để vậy: Trong từng cột ta cần xử lí xóa các số trùng trong nó trước đi đã.

Sau đó là chọn lấy 100 cột;

Từ 100 cột ta lại áp dụng macro bài trên của chàng HieuXD xem sao(?)

Nếu 100 cột đã chọn chưa thỏa, thì ta lại nâng dần số cột lên, theo chuỗi nào đó, như 110, 120, . . . .

Chúc vui & thành công!

Nếu đem cái này áp dụng chơi sổ số & trúng thì mời bọn này với nha!
Mình tìm trên diễn đàn bài xoá dữ liệu trùng trong từng cột nhưng không có. Bạn và GPE có thể giúp làm thế nào xử lí xoá các số trùng trong từng cột được? Xin cảm ơn!
 
& đây, xin mời:

PHP:
Option Explicit
Sub TaoDanhSachDuyNhatTheoCot()

Dim Dict As Object, Arr() As String, tArr As Variant
Dim iRow As Long, W As Long, Rws As Long, Col As Integer, J As Integer

With Sheets("DuLieu")
  Rws = .[B2].CurrentRegion.Rows.Count
  Col = .[B2].CurrentRegion.Columns.Count
  For J = 1 To Col
    Set Dict = CreateObject("Scripting.Dictionary")
    tArr = .Cells(2, J).Resize(Rws).Value
    ReDim Arr(1 To Rws + 2, 1 To 1)
    W = 2
    For iRow = 1 To UBound(tArr, 1)
        If Not IsEmpty(tArr(iRow, 1)) And Not Dict.exists(tArr(iRow, 1)) Then
            W = W + 1
            Dict.Add tArr(iRow, 1), W
            Arr(W, 1) = Right("0" & CStr(tArr(iRow, 1)), 2)
        Else
        End If
    Next iRow
    If W Then
        Arr(1, 1) = W
'Chép Lên Trang Tính Khác:'
        Sheets("GPE").Cells(1, J).Resize(W + 1, 1).Value = Arr
        Erase Arr()
    End If
 Next J
End With
End Sub
 
PHP:
Option Explicit
Sub TaoDanhSachDuyNhatTheoCot()

Dim Dict As Object, Arr() As String, tArr As Variant
Dim iRow As Long, W As Long, Rws As Long, Col As Integer, J As Integer

With Sheets("DuLieu")
  Rws = .[B2].CurrentRegion.Rows.Count
  Col = .[B2].CurrentRegion.Columns.Count
  For J = 1 To Col
    Set Dict = CreateObject("Scripting.Dictionary")
    tArr = .Cells(2, J).Resize(Rws).Value
    ReDim Arr(1 To Rws + 2, 1 To 1)
    W = 2
    For iRow = 1 To UBound(tArr, 1)
        If Not IsEmpty(tArr(iRow, 1)) And Not Dict.exists(tArr(iRow, 1)) Then
            W = W + 1
            Dict.Add tArr(iRow, 1), W
            Arr(W, 1) = Right("0" & CStr(tArr(iRow, 1)), 2)
        Else
        End If
    Next iRow
    If W Then
        Arr(1, 1) = W
'Chép Lên Trang Tính Khác:'
        Sheets("GPE").Cells(1, J).Resize(W + 1, 1).Value = Arr
        Erase Arr()
    End If
 Next J
End With
End Sub
Thấy Set Dict trong vòng lặp j hình như có gì đó không ổn thì phải.

Chúc năm mới phát tài!
 
Dễ vậy có đáng gì mà gọi là chia sẻ bạn.
Viết hơn 2000 bài như bạn chắc có lẽ cũng đã biết
Anh SA_DQ (>4000 bài viết) mà viết như vậy chắc có lý do.

Mình không biết dễ vậy là như nào. Nếu được, bạn có thể làm cho mọi người tham khảo không?
 
Web KT

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

Back
Top Bottom