Cách lọc ngẫu nhiên các dữ liệu sang sheet mới

Liên hệ QC

truong bach chien

Thành viên mới
Tham gia
23/5/19
Bài viết
33
Được thích
4
Mình đã tham khảo việc lọc dữ liệu "https://www.giaiphapexcel.com/diendan/threads/lọc-dữ-liệu-theo-hai-điều-kiện-gắn-vào-listbox.17446/" hay "https://www.giaiphapexcel.com/diendan/threads/nhờ-sửa-dùm-code-lọc-dữ-liệu.17510/"
nhưng đều không xử lý theo cách lọc ngẫu nhiên, lấy ra các row theo yêu cầu.
Mong nhờ các Thầy/ Anh/Chị /Em giúp dùm cách lọc ngẫu nhiên các dữ liệu rồi chép sang sheet mới. (xem theo file đính kèm)
Xin cám ơn
 

File đính kèm

Mình đã tham khảo việc lọc dữ liệu "https://www.giaiphapexcel.com/diendan/threads/lọc-dữ-liệu-theo-hai-điều-kiện-gắn-vào-listbox.17446/" hay "https://www.giaiphapexcel.com/diendan/threads/nhờ-sửa-dùm-code-lọc-dữ-liệu.17510/"
nhưng đều không xử lý theo cách lọc ngẫu nhiên, lấy ra các row theo yêu cầu.
Mong nhờ các Thầy/ Anh/Chị /Em giúp dùm cách lọc ngẫu nhiên các dữ liệu rồi chép sang sheet mới. (xem theo file đính kèm)
Xin cám ơn
Thử code
Mã:
Sub Thuong()
  Dim ShName As String, Loai As String, PhanThuong As String
  Dim Sh As Worksheet, sArr(), tArr(), Arr, Res()
  Dim i As Long, sRow As Long, k As Long, n As Long, ik As Long, m As Long
 
  With Sheets("PT")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 7 Then Exit Sub
    ShName = .Range("F3").Value
    Loai = .Range("E4").Value
    PhanThuong = Mid(.Range("A3").Value, 1, Len(.Range("A3").Value) - 1) & " "
    n = .Range("F4").Value
    If ShName = "" Or Loai = "" Or n = 0 Then Exit Sub
    sArr = .Range("A3:D" & i).Value
  End With
 
  sRow = UBound(sArr)
  For i = 1 To sRow Step 5
    If sArr(i, 3) = Loai Then
      k = k + 1
      ReDim Preserve tArr(1 To k)
      tArr(k) = i
    End If
  Next i
  If n > k Then Exit Sub
 
  Arr = Ngaunhien(k, n)
  ReDim Res(1 To n * 5, 1 To 2)
  k = 0
  For i = 1 To n
    ik = tArr(Arr(i))
    For m = 0 To 4
      k = k + 1
      If m = 0 Then
        Res(k, 1) = PhanThuong & i
      Else
        Res(k, 1) = sArr(ik + m, 1)
      End If
      Res(k, 2) = sArr(ik + m, 2)
    Next m
  Next i
 
  For Each Sh In Worksheets
    If Sh.Name = ShName Then i = 0: Exit For
  Next
  If i > 0 Then
    Sheets.Add After:=Sheets(Sheets.Count)
    Sheets(Sheets.Count).Name = ShName
  End If
 
  With Sheets(ShName)
    .UsedRange.ClearContents
    .Range("A1").Resize(UBound(Res), UBound(Res, 2)) = Res
  End With
  Sheets(ShName).Select
End Sub

Function Ngaunhien(ByVal n As Long, ByVal k As Long)
  Dim Arr() As Long, Res() As Long, i As Long, tmp As Long
 
  If k > n Then k = n
  ReDim Arr(1 To n):  ReDim Res(1 To k)
  Randomize
  For i = 1 To k
    tmp = Int((n * Rnd) + 1)
    If Arr(tmp) = 0 Then Res(i) = tmp Else Res(i) = Arr(tmp)
    If Arr(k) = 0 Then Arr(tmp) = n Else Arr(tmp) = Arr(n)
    n = n - 1
  Next i
  Ngaunhien = Res
End Function
 

File đính kèm

Upvote 0


Rất cám ơn anh HieuCD
Nâng cấp yêu cầu
Mã:
Sub Thuong()
  Dim ShName As String, Loai As String, PhanThuong As String, LoaiPT As String
  Dim Sh As Worksheet, sArr(), dArr(), tArr(), Arr, Arr2, Res()
  Dim i&, r&, j&, sRow&, sRow2&, sCol&, K&, N&, ik&, m&, Q&, s&
 
  With Sheets("PT")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 7 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = .Range("A3:D" & i).Value
    sRow2 = UBound(sArr)
    
    i = .Range("E" & Rows.Count).End(xlUp).Row
    If i < 4 Then MsgBox ("Khong co Loai phan thuong"): Exit Sub
    dArr = .Range("E3:K" & i).Value
    sRow = UBound(dArr):  sCol = UBound(dArr, 2)
    
    ShName = .Range("F3").Value
    If ShName = "" Then MsgBox ("Ten Sheet Chua Khai Bao"): Exit Sub
    PhanThuong = Mid(.Range("A3").Value, 1, Len(.Range("A3").Value) - 1) & " "
  End With
 
  Q = 0
  For r = 2 To sRow
    Q = Q + dArr(r, 2)
  Next r
  If Q = 0 Then MsgBox ("Khong co Loai phan thuong duoc chon"): Exit Sub
  ReDim Res(1 To Q * 5, 1 To 2) 'Mang Ket Qua
 
  For r = 2 To sRow
    Loai = dArr(r, 1)
    Q = dArr(r, 2)
    If Len(Loai) > 0 And Q > 0 Then
      For j = 3 To sCol
        K = dArr(r, j)
        If K > 0 Then '**
          LoaiPT = dArr(1, j)
          ReDim tArr(1 To 1)
          Call Create_tArr(tArr, sArr, Loai, LoaiPT) 'Mang PT theo "Loai" va "LoaiPT"
          If Len(tArr(1)) > 0 Then N = UBound(tArr) Else N = 0
          If N >= K Then
            Arr = Ngaunhien(N, K)
            For i = 1 To K
              ik = tArr(Arr(i))
              Arr2 = Ngaunhien(4, 4) 'Tron Ket Qua A,B,C,D
              For m = 0 To 4
                s = s + 1
                If m = 0 Then
                  stt = stt + 1
                  Res(s, 1) = PhanThuong & stt
                  Res(s, 2) = sArr(ik + m, 2)
                Else
                  Res(s, 1) = sArr(ik + m, 1)
                  Res(s, 2) = sArr(ik + Arr2(m), 2)
                End If
                
              Next m
            Next i
          End If
        End If '**
      Next j
    End If
  Next r
 
  For Each Sh In Worksheets 'Kiem tra Sheet Ket Qua
    If Sh.Name = ShName Then i = 0: Exit For
  Next
  If i > 0 Then
    Sheets.Add After:=Sheets(Sheets.Count)
    Sheets(Sheets.Count).Name = ShName
  End If
 
  With Sheets(ShName)
    .UsedRange.ClearContents
    If s = 0 Then MsgBox ("Khong co Loai phan thuong duoc chon"): Exit Sub
    .Range("A1").Resize(UBound(Res), UBound(Res, 2)) = Res
  End With
  Sheets(ShName).Select
End Sub

Private Sub Create_tArr(ByRef tArr, ByRef sArr, ByRef Loai, ByRef LoaiPT)
      Dim i&, N&, sR&
  sR = UBound(sArr)
  For i = 1 To sR Step 5
    If sArr(i, 3) = Loai And sArr(i, 4) = LoaiPT Then
      N = N + 1
      ReDim Preserve tArr(1 To N)
      tArr(N) = i
    End If
  Next i
End Sub

Private Function Ngaunhien(ByVal N&, ByVal K&)
      Dim Arr() As Long, Res() As Long, i&, tmp&
  If K > N Then K = N
  ReDim Arr(1 To N):  ReDim Res(1 To K)
  Randomize
  For i = 1 To K
    tmp = Int((N * Rnd) + 1)
    If Arr(tmp) = 0 Then Res(i) = tmp Else Res(i) = Arr(tmp)
    If Arr(K) = 0 Then Arr(tmp) = N Else Arr(tmp) = Arr(N)
    N = N - 1
  Next i
  Ngaunhien = Res
End Function
 

File đính kèm

Upvote 0
Nâng cấp yêu cầu
Mã:
Sub Thuong()
  Dim ShName As String, Loai As String, PhanThuong As String, LoaiPT As String
  Dim Sh As Worksheet, sArr(), dArr(), tArr(), Arr, Arr2, Res()
  Dim i&, r&, j&, sRow&, sRow2&, sCol&, K&, N&, ik&, m&, Q&, s&
...
  With Sheets("PT")
   ..............
    End If
  Next r
...........
  For Each Sh In Worksheets 'Kiem tra Sheet Ket Qua
  ........
  Ngaunhien = Res
End Function
Quả tuyệt
Câu lệnh đã tạo được sheet472 với việc lọc được các câu ngẫu nhiên từ sheetPT

Nhờ anh giúp thêm điều sau
1.Kiểm tra lại thì thấy bị thiếu:
- Số câu Phần thưởng yêu cầu là 10 (3 câu Phần thưởngC1+ 2 câu Phần thưởngC2 + 3 câu Phần thưởng C3 + 2 câu Phần thưởng C4) nhưng chỉ có 8 câu: - Câu loại C3, thiếu 1 - Câu loại C4 thiếu 1
....> Mong muốn a giúp cho hiện đủ số câu Phần thưởng
- Trong 3 câu Phần thưởng C1 thì: 1 câu Phần thưởng Loại PT1 + 1 câu Phần thưởng Loại PT2 + 1 câu Phần thưởng Loại PT5 . Đã hiển thị đủ trong sheet472, nhưng bị cố định các câu Phần thưởng này (xóa sheet472 đi, rồi bấm nút RUN, thì 3 câu này vẫn không đổi trong sheet472 mới lập này).
........> Mong anh giúp cho : mỗi lần bấm nút So sánh, thì các câu phải trộn mới ngẫu nhiên và phương án chọn lựa cũng trộn mới ngẫu nhiên.
2.Nhập thêm các câu Phần thưởng vào (100 Phần thưởng) thì phần thêm này không tác dụng khi bấm nút RUN.
......> Mong a giúp cho khi thêm số câu Phần thưởng vào thì vẫn chạy được RUN.
Xin cám ơn anh nhiều.
 
Upvote 0
Quả tuyệt
Câu lệnh đã tạo được sheet472 với việc lọc được các câu ngẫu nhiên từ sheetPT

Nhờ anh giúp thêm điều sau
"1.Kiểm tra lại thì thấy bị thiếu:
- Số câu Phần thưởng yêu cầu là 10 (3 câu Phần thưởngC1+ 2 câu Phần thưởngC2 + 3 câu Phần thưởng C3 + 2 câu Phần thưởng C4) nhưng chỉ có 8 câu"
: Do dữ liệu thiếu loại tương ứng nên bỏ qua yêu cầu loại nầy
"- Trong 3 câu Phần thưởng C1 thì: 1 câu Phần thưởng Loại PT1 + 1 câu Phần thưởng Loại PT2 + 1 câu Phần thưởng Loại PT5 . Đã hiển thị đủ trong sheet472, nhưng bị cố định các câu Phần thưởng này :" Dữ liệu chỉ có 1 câu tương ứng với loại đang xét nên luôn chọn câu nầy
"2.Nhập thêm các câu Phần thưởng vào (100 Phần thưởng) thì phần thêm này không tác dụng khi bấm nút RUN." : Gởi file bạn thêm dữ liệu như thế nào để mình kiểm tra lại
 
Upvote 0

File đính kèm

Upvote 0
Cám ơn anh HIEUCD
mình đính kèm theo file up
Nhờ anh giúp (có ghi trong file - anh xem dùm)
Xin cám ơn
Dữ liệu số không giống file trước, tiêu đề tự làm
Mã:
Sub Thuong()
  Dim ShName As String, Loai As String, PhanThuong As String, LoaiPT As String
  Dim Sh As Worksheet, sArr(), dArr(), tArr(), Arr, Arr2, Res()
  Dim i&, r&, j&, sRow&, sRow2&, sCol&, K&, N&, ik&, m&, Q&, s&

  With Sheets("PT")
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i < 7 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = .Range("A3:D" & i).Value
    sRow2 = UBound(sArr)
   
    i = .Range("E" & Rows.Count).End(xlUp).Row
    If i < 4 Then MsgBox ("Khong co Loai phan thuong"): Exit Sub
    dArr = .Range("E3:K" & i).Value
    sRow = UBound(dArr):  sCol = UBound(dArr, 2)
   
    ShName = .Range("F3").Value
    If ShName = "" Then MsgBox ("Ten Sheet Chua Khai Bao"): Exit Sub
    PhanThuong = Mid(.Range("A3").Value, 1, Len(.Range("A3").Value) - 1) & " "
  End With

  Q = 0
  For r = 2 To sRow
    Q = Q + dArr(r, 2)
  Next r
  If Q = 0 Then MsgBox ("Khong co Loai phan thuong duoc chon"): Exit Sub
  ReDim Res(1 To Q * 5, 1 To 3) 'Mang Ket Qua

  For r = 2 To sRow
    Loai = dArr(r, 1)
    Q = dArr(r, 2)
    If Len(Loai) > 0 And Q > 0 Then
      For j = 3 To sCol
        K = dArr(r, j)
        If K > 0 Then '**
          LoaiPT = dArr(1, j)
          ReDim tArr(1 To 1)
          Call Create_tArr(tArr, sArr, Loai, LoaiPT) 'Mang PT theo "Loai" va "LoaiPT"
          If Len(tArr(1)) > 0 Then N = UBound(tArr) Else N = 0
          If N >= K Then
            Arr = Ngaunhien(N, K)
            For i = 1 To K
              ik = tArr(Arr(i))
              Arr2 = Ngaunhien(4, 4) 'Tron Ket Qua A,B,C,D
              For m = 0 To 4
                s = s + 1
                If m = 0 Then
                  stt = stt + 1
                  Res(s, 1) = stt
                  Res(s, 2) = PhanThuong & stt
                  Res(s, 3) = sArr(ik + m, 2)
                Else
                  Res(s, 2) = sArr(ik + m, 1)
                  Res(s, 3) = sArr(ik + Arr2(m), 2)
                End If
              Next m
            Next i
          End If
        End If '**
      Next j
    End If
  Next r

  For Each Sh In Worksheets 'Kiem tra Sheet Ket Qua
    If Sh.Name = ShName Then i = 0: Exit For
  Next
  If i > 0 Then
    Sheets.Add After:=Sheets(Sheets.Count)
    Sheets(Sheets.Count).Name = ShName
  End If

  With Sheets(ShName)
    .UsedRange.ClearContents
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i > 2 Then Range("A3:C" & i).ClearContents
    If s = 0 Then MsgBox ("Khong co Loai phan thuong duoc chon"): Exit Sub
    .Range("A3").Resize(UBound(Res), UBound(Res, 2)) = Res
  End With
  Sheets(ShName).Select
End Sub

Private Sub Create_tArr(ByRef tArr, ByRef sArr, ByRef Loai, ByRef LoaiPT)
      Dim i&, N&, sR&
  sR = UBound(sArr)
  For i = 1 To sR Step 5
    If sArr(i, 3) = Loai And CStr(sArr(i, 4)) = LoaiPT Then
      N = N + 1
      ReDim Preserve tArr(1 To N)
      tArr(N) = i
    End If
  Next i
End Sub

Private Function Ngaunhien(ByVal N&, ByVal K&)
      Dim Arr() As Long, Res() As Long, i&, tmp&
  If K > N Then K = N
  ReDim Arr(1 To N):  ReDim Res(1 To K)
  Randomize
  For i = 1 To K
    tmp = Int((N * Rnd) + 1)
    If Arr(tmp) = 0 Then Res(i) = tmp Else Res(i) = Arr(tmp)
    If Arr(N) = 0 Then Arr(tmp) = N Else Arr(tmp) = Arr(N)
    N = N - 1
  Next i
  Ngaunhien = Res
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Dữ liệu số không giống file trước, tiêu đề tự làm
Mã:
Sub Thuong()
  Dim ShName As String, Loai As String, PhanThuong As String, LoaiPT As String
  Dim Sh As Worksheet, sArr(), dArr(), tArr(), Arr, Arr2, Res()

End Function
Cám ơn sự nhiệt tình của anh
Dù mình có tiếp thu được hay chưa được -mình vẫn cám ơn anh nhiều
Nếu có thể được + nếu anh có ở SG/Tân phú = mình muốn offline với anh + được không?
Một lần nữa cám ơn anh nhiều
 
Upvote 0
Cám ơn sự nhiệt tình của anh
Dù mình có tiếp thu được hay chưa được -mình vẫn cám ơn anh nhiều
Nếu có thể được + nếu anh có ở SG/Tân phú = mình muốn offline với anh + được không?
Một lần nữa cám ơn anh nhiều
Hiện nay mình ở rất rất xa Sài Gòn, cần gì cứ gởi file lên diễn đàn hoặc nhắn tin riêng trên diễn đàn
 
Upvote 0
Cám ơn anh Hiếu
Mình đã sử dụng phần code a viết và đã hoàn thiện được đã làm xong tiêu đề rồi
Thanks
 
Upvote 0
Web KT

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

Back
Top Bottom