Lọc theo điều kiện, lấy ngẫu nhiên

  • Thread starter Thread starter topgun
  • Ngày gửi Ngày gửi
Liên hệ QC
Mình ngẫm câu nói đó trước khi viết hỏi các bác rùi, hi vọng bác giúp mình file lần cuối mình vừa gửi. Cảm ơn!
 
Lần chỉnh sửa cuối:
Các huynh thông cảm nhé, mình gửi file này lần cuối (có giải thích lại theo mình thì khá rõ).Mong các huynh cố gắng giúp mình.
Lần sau vào diễn đàn chắc sẽ k bị ăn mắng nhiều thế này nữa, hi vọng thế!
Đây file của bạn đây! Bạn xem đúng chưa?
(Mượn mấy cái name của anh Ndu)
 

File đính kèm

/-(ãy xem VBA làm điều đó như thế nào!

Trước hết, khâu chuẩn bị cần fải điền số dòng vào các ô của cột 'D' ứng với cột 'E' có số liệu;

Bấm tổ hợp fím tắt mình đã gán để chạy macro

Khà, khà,. . . Ưu điểm hơn cách trên lền kề là nạp vô 'E' những trị ngẫu nhiên (Hình như điều này chủ topic đang mong!?!)

PHP:
Option Explicit
 Dim StrC As String:                         Dim rBD As Long
 Const Chu As String = _
   "0001020304050607080910111213141516171819202122232425262728293031.."
 Const DD As Byte = 70

Sub TimKiem()
 Dim sCll As String:                         Dim jJ As Byte, rKT As Long
 Dim Cls As Range, Rg0 As Range, Clls As Range
  
 [d1].Value = "STT":                         Columns("D:F").Select
 Selection.Sort Key1:=[E2], Order1:=xlAscending, Key2:=[D2], _
   Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1
 [e9].End(xlDown).Offset(1).Value = "@GPE@"
 [F1].CurrentRegion.Offset(1, 2).Resize(, 3).ClearContents
 For Each Cls In Range([E2], [E65500].End(xlUp))
   If sCll <> Cls.Value Then
      sCll = Cls.Value
      If Cls.Row = 2 Then
         rBD = Cls.Row
      Else
         rKT = Cls.Row:                      DinhChuoi Cls.Offset(-1).Value
         Set Rg0 = Cells(rBD, "E").Resize(rKT - rBD)
         jJ = 0
         For Each Clls In Rg0.Offset(, 1)
            jJ = jJ + 1:
            If jJ < Len(StrC) / 2 Then
               Clls.Value = Mid(StrC, 2 * jJ - 1, 2)
            Else
               Clls.Value = "Nothing"
            End If
         Next Clls
         rBD = rKT:                          rKT = 0
      End If
   End If
 Next Cls
 Columns("E:E").Find("@GPE@").Value = ""
End Sub

Mã:
[B]Sub DinhChuoi(SCell As String)[/B]
 Dim Rng As Range, sRng As Range, jJ As Byte, MyAdd As String
 Const Hh As String = "@@"
 
 Set Rng = Range([A1], [A65500].End(xlUp)):  StrC = Chu
 Set sRng = Rng.Find(SCell, , xlFormulas, xlWhole)
 If Not sRng Is Nothing Then
   MyAdd = sRng.Address
   Do
      jJ = 2 * sRng.Offset(, 1).Value + 1
      If jJ = 1 Then
         StrC = Hh & Mid(StrC, 3, DD)
      Else
         StrC = Left(StrC, jJ - 1) & Hh & Mid(StrC, jJ + 2, DD)
      End If
      Set sRng = Rng.FindNext(sRng)
   Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
 End If
 StrC = Replace(StrC, Hh, ""):               Cells(rBD, "h").Value = StrC
 DaoChuoi StrC:                              Cells(rBD + 2, "h").Value = StrC
[B]End Sub[/B]


Mã:
[B]Sub DaoChuoi(StrC As String)[/B]
 Dim jJ As Byte, Vtr As Byte, Num As Byte
 
 Num = Len(StrC) - 2
 For jJ = 1 To 99
   Randomize:                                Vtr = 1 + 2 * Int(Num * Rnd)
   If Vtr > 9 Then
      StrC = Mid(StrC, Vtr, DD) & Mid(StrC, 3, Vtr - 3) & Left(StrC, 2)
   Else
      StrC = Mid(StrC, Vtr, DD) & Left(StrC, Vtr - 1)
   End If
 Next jJ
 StrC = Replace(StrC, "..", "") & ".."
[B]End Sub[/B]

Nhân tiên đây, khi đã có kết quả, mình dự định tổ chức cuộc thi viết câu hỏi cho topic này;

Giải thưởng sẽ là xị 'Bàu đá' chính hiệu con nai vàng!
(Nhận giải tại TP HCM)
 

File đính kèm

Lần chỉnh sửa cuối:
Cảm ơn các bác đã góp ý. vd: như trong file mình gửi, mình nghĩ nó rõ đấy chứ. như trong giải pháp các huynh giúp thì chỉ tìm dc 31 giá trị ở cột E mà thôi,mình muốn tìm các giá trị như file mình điền ấy. Huynh nào cho mình số fone, mình alo hỏi cho rõ luôn. nick của mình tuanvtbk41.

Phải công nhận các mem của GPE cực kỳ nhiệt tình và thông minh; Thế nhưng những người rất thông minh của diễn đàn đàn đã phải vắt óc ra mà vẫn không hiểu được ý và mục tiêu vấn đề cần đạt được của bạn topgun mong muốn.

Quả thực, cách diễn giải vấn đề của bạn này là quá... kém...

Bạn topgun nên nhớ: Viết cho người khác đọc (và hiểu), chứ không phải viết cho mình đọc!
 
Lần chỉnh sửa cuối:
Chào các bác, nhờ các bác sửa giúp em thêm 1 chút nữa. Nếu giá trị cần tìm ở cột E mà không có trong cột A thì nó sẽ tự động lấy giá trị bất kỳ trong dải 0-31. Em ví dụ 2 thằng SAV0123, KHA0112 bôi vàng ở dưới. Cám ơn các bác nhiều!
 

File đính kèm

Lần chỉnh sửa cuối:
Chào các bác, nhờ các bác sửa giúp em thêm 1 chút nữa. Nếu giá trị cần tìm ở cột E mà không có trong cột A thì nó sẽ tự động lấy giá trị bất kỳ trong dải 0-31. Em ví dụ 2 thằng SAV0123, KHA0112 bôi vàng ở dưới. Cám ơn các bác nhiều!
Nếu muốn vậy thì bạn chỉ thay công thức là: F2=IF(E2="","",IF(ISNA(Pos),RANDBETWEEN(0,31),IF(COUNT(Pos)>=COUNTIF($E$2:$E2,$E2),SMALL(Pos,COUNTIF($E$2:$E2,$E2)),"hết giá trị trong giải 0-31")))
là được thôi
 
Lần chỉnh sửa cuối:
Nếu muốn vậy thì bạn chỉ thay công thức là: F2=IF(E2="","",IF(ISNA(Pos),RANDBETWEEN(0,31),IF(COUNT(Pos)>=COUNTIF($E$2:$E2,$E2),SMALL(Pos,COUNTIF($E$2:$E2,$E2)),"hết giá trị trong giải 0-31")))
là được thôi

Bác ơi, ví dụ này thì thấy hàm đó vẫn chưa đúng, nhờ bác giúp sửa lại (giá trị phải duy nhất trong dải 0-31)
 

File đính kèm

Lần chỉnh sửa cuối:
Bác ơi, ví dụ này thì thấy hàm đó vẫn chưa đúng, nhờ bác giúp sửa lại (giá trị phải duy nhất trong dải 0-31)
Nếu vậy thì lấy lần lượt từ 0~31 nhé!
E2=IF(E2="","",IF(AND(ISNA(Pos),COUNTIF($E$2:E2,E2)<=32),COUNTIF($E$2:E2,E2)-1,IF(COUNT(Pos)>=COUNTIF($E2:$E$99,$E2),SMALL(Pos,COUNTIF($E2:$E$99,$E2)),"hết giá trị trong giải 0-31")))
 
Web KT

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

Back
Top Bottom