Xin giúp về Listbox: thêm dữ liệu dần dần khi nhấn nút lệnh

Liên hệ QC

ducky2301

Thành viên chính thức
Tham gia
25/3/08
Bài viết
74
Được thích
15
Trong file em có 1 cột 5 dòng có dữ liệu là A, B ,C ,D ,E. Em tạo 1 Form gồm có 1 Listbox và 1 nút bấm. Em muốn khi bấm vào nút lần 1, thì listbox sẽ thêm A vào listbox, khi bấm nút lần 2 thì Listbox sẽ thêm B vào, tương tự cho các lần còn lại 3,4,5 là C,D,E.
Àh, còn em muốn 1 Label hiện ngẫu nhiên từ 0 -> 9 mỗi khi em bấm nút thì làm thế nào ???
Các Thầy giúp em với nha. %#^#$
 
Bạn cứ làm 1 file giả định như yêu cầu, mọi người dễ dàng giúp hơn
 
Upvote 0
Trong file em có 1 cột 5 dòng có dữ liệu là A, B ,C ,D ,E. Em tạo 1 Form gồm có 1 Listbox và 1 nút bấm. Em muốn khi bấm vào nút lần 1, thì listbox sẽ thêm A vào listbox, khi bấm nút lần 2 thì Listbox sẽ thêm B vào, tương tự cho các lần còn lại 3,4,5 là C,D,E.
Àh, còn em muốn 1 Label hiện ngẫu nhiên từ 0 -> 9 mỗi khi em bấm nút thì làm thế nào ???
Các Thầy giúp em với nha. %#^#$
Nghe có vẽ giống QUAY SỐ TRÚNG THƯỞNG quá nhỉ?
 
Upvote 0
Bạn tham khảo ví dụ sau
 

File đính kèm

Upvote 0
Mình gửi file hoàn chỉnh dựa trên file ListBox của bác Sealand
Bổ sung thêm phần ramdom number 0-9 khi CLick vào nút "thêm dòng"
Sử dụng: Int((max - min + 1) * Rnd + min)
tạo ngẫu nhiên từ 0-9: Int((10) * Rnd)
 

File đính kèm

Upvote 0
Nghe có vẽ giống QUAY SỐ TRÚNG THƯỞNG quá nhỉ?

Thầy nói đúng rồi, em định làm 1 Form đơn giản thôi, gồm có 1 listbox, 3 label, 1 nút Start và 1 nút Exit.
Em muốn khi em bấm nút Start thì 3 Label sẽ chạy ngẫu nhiên từ 0-9 sau 10s thì ngừng lại. Khi đó trong phần Listbox sẽ có 4 cột, gồm cột 1 tên Giải thưởng (list giải thì em nhập vào 1 cột trên sheet, nó sẽ tự động add vào mỗi khi bấm nút Start) và 3 cột còn lai là 3 số của 3 Label.
Thầy hướng dẫn em cách tạo Form đó với.
 
Upvote 0
Thầy nói đúng rồi, em định làm 1 Form đơn giản thôi, gồm có 1 listbox, 3 label, 1 nút Start và 1 nút Exit.
Em muốn khi em bấm nút Start thì 3 Label sẽ chạy ngẫu nhiên từ 0-9 sau 10s thì ngừng lại. Khi đó trong phần Listbox sẽ có 4 cột, gồm cột 1 tên Giải thưởng (list giải thì em nhập vào 1 cột trên sheet, nó sẽ tự động add vào mỗi khi bấm nút Start) và 3 cột còn lai là 3 số của 3 Label.
Thầy hướng dẫn em cách tạo Form đó với.
Sao vòng vèo thế? kkkkk
 
Upvote 0
Thầy nói đúng rồi, em định làm 1 Form đơn giản thôi, gồm có 1 listbox, 3 label, 1 nút Start và 1 nút Exit.
Em muốn khi em bấm nút Start thì 3 Label sẽ chạy ngẫu nhiên từ 0-9 sau 10s thì ngừng lại. Khi đó trong phần Listbox sẽ có 4 cột, gồm cột 1 tên Giải thưởng (list giải thì em nhập vào 1 cột trên sheet, nó sẽ tự động add vào mỗi khi bấm nút Start) và 3 cột còn lai là 3 số của 3 Label.
Thầy hướng dẫn em cách tạo Form đó với.
Điều đầu tiên bạn cần làm là đưa file có dữ liệu lên đây, kể cả Form mà bạn đã thiết kế sẳn, mất công làm xong không đúng ý phải sửa đi sửa lại mệt lắm
 
Upvote 0
@ HideBoy : Mục đích là em muốn hiểu rõ code từng phần nên mới hỏi từng phần mà :)
@ NDU96081631 : Thầy ơi, em làm Form rồi, Thầy tải về xem giúp em với :

1 : Nếu như em đổi giá trị i (For i = 1 To 100) thì sau khi số Hàng Đơn Vị chạy xong, Form sẽ bị đơ 1 hồi sau thì nó cho ra kết quả luôn, không thấy Hàng Chục và Hàng Trăm chạy.
2 : Ví dụ em chỉ có 350 Mã số trúng thưởng, em muốn Hàng Trăm chỉ chạy trong phạm vi 0->3, Hàng Chục chỉ chạy trong phạm vi 0->5 thôi thì làm sao ?
3 : cái này thì không biết được không, ví dụ như lần chạy 1, số 215 đã ra rồi, thì các lần sau, nếu ra số 215 nữa thì nó tự động quay số khác (nếu như làm cho nó không ra 215 luôn thì càng tốt).

Thầy hướng dẫn giúp em với nha, cám ơn Thầy nhiều %#^#$
 

File đính kèm

Upvote 0
Em đã giải quyết được vấn đề thứ 2 (giới hạn phạm vi Random) = Hàm Randbetween rồi : Label2.Caption = Application.WorksheetFunction.RandBetween(0, 5)

_ Còn vấn đề 1 (không tăng i lên hơn 50 được) và vấn đề số 3 (loại bỏ số đã quay ra).

Các Thầy giúp em với %#^#$
 

File đính kèm

Upvote 0
@ HideBoy : Mục đích là em muốn hiểu rõ code từng phần nên mới hỏi từng phần mà :)
@ NDU96081631 : Thầy ơi, em làm Form rồi, Thầy tải về xem giúp em với :

1 : Nếu như em đổi giá trị i (For i = 1 To 100) thì sau khi số Hàng Đơn Vị chạy xong, Form sẽ bị đơ 1 hồi sau thì nó cho ra kết quả luôn, không thấy Hàng Chục và Hàng Trăm chạy.
2 : Ví dụ em chỉ có 350 Mã số trúng thưởng, em muốn Hàng Trăm chỉ chạy trong phạm vi 0->3, Hàng Chục chỉ chạy trong phạm vi 0->5 thôi thì làm sao ?
3 : cái này thì không biết được không, ví dụ như lần chạy 1, số 215 đã ra rồi, thì các lần sau, nếu ra số 215 nữa thì nó tự động quay số khác (nếu như làm cho nó không ra 215 luôn thì càng tốt).

Thầy hướng dẫn giúp em với nha, cám ơn Thầy nhiều %#^#$
Câu 1: Thay UserForm1.Repaint thành DoEvents thử xem
Câu 2: Cái thằng Int((10) * Rnd) sẽ chạy từ 0 đến 9 ===> Int((4) * Rnd) sẽ chạy từ 0 đến 3... vân vân...
Câu 3: Câu này hơi khó 1 chút. Sẽ có 2 cách làm:
- Cách 1:
* Gán giá trị quay được (ráp 3 số hàng trăm, chục, đơn vị lại thành số 3 chữ số) xuống sheet tại 1 cột nào đó (cột tạm)
* Khi quay tiếp, ra được kết quả, lấy số 3 chữ số so với cột chứa dữ liệu tạm (có thể dùng hàm COUNTIF hoặc Find Method)
* Nếu thấy bị trùng thì cho quay tiếp, không trùng thì gán dữ liệu xuống sheet tại cột tạm, đồng thời cũng xuất kết quả ra ListBox luôn
* Cách này dễ hiểu nhưng code sẽ dài dòng
- Cách 2: Dùng Dictionary Object để khống chế dữ liệu trùng. Cách này hơi khó nhưng code đơn giản hơn. Tôi sẽ sửa code của bạn theo cách 2 này nhé
---------------------------------
PHP:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Dic as Object
PHP:
Private Sub UserForm_Initialize()
  Set Dic = CreateObject("Scripting.Dictionary")
End Sub
PHP:
Private Sub CommandButton1_Click()
  Dim i As Long, Dg As Long, Tmp As String
  Label1.Caption = ""
  Label2.Caption = ""
  Label3.Caption = ""
  Dg = Me.ListBox1.ListCount
  If Sheet1.Cells(Dg + 2, 1) = "" Then Exit Sub
  Do
    For i = 1 To 100
      Randomize
      Label3.Caption = Int(10 * Rnd)
      Sleep i
      DoEvents
    Next
    For i = 1 To 100
      Randomize
      Label2.Caption = Int(10 * Rnd)
      Sleep i
      DoEvents
    Next
    For i = 1 To 50
      Randomize
      Label1.Caption = Int(4 * Rnd)
      Sleep i
      DoEvents
    Next
    Tmp = Label1.Caption & Label2.Caption & Label3.Caption
  Loop Until Not Dic.Exists(Tmp)
  Dic.Add Tmp, ""
  If Sheet1.Cells(Dg + 2, 1) <> "" Then
    Me.ListBox1.AddItem Sheet1.Cells(Dg + 2, 1)
    ListBox1.List(ListBox1.ListCount - 1, 1) = Label1.Caption
    ListBox1.List(ListBox1.ListCount - 1, 2) = Label2.Caption
    ListBox1.List(ListBox1.ListCount - 1, 3) = Label3.Caption
  End If
End Sub
 

File đính kèm

Upvote 0
Câu 1: Thay UserForm1.Repaint thành DoEvents thử xem
Câu 2: Cái thằng Int((10) * Rnd) sẽ chạy từ 0 đến 9 ===> Int((4) * Rnd) sẽ chạy từ 0 đến 3... vân vân...
Câu 3: Câu này hơi khó 1 chút. Sẽ có 2 cách làm:
- Cách 1:
* Gán giá trị quay được (ráp 3 số hàng trăm, chục, đơn vị lại thành số 3 chữ số) xuống sheet tại 1 cột nào đó (cột tạm)
* Khi quay tiếp, ra được kết quả, lấy số 3 chữ số so với cột chứa dữ liệu tạm (có thể dùng hàm COUNTIF hoặc Find Method)
* Nếu thấy bị trùng thì cho quay tiếp, không trùng thì gán dữ liệu xuống sheet tại cột tạm, đồng thời cũng xuất kết quả ra ListBox luôn
* Cách này dễ hiểu nhưng code sẽ dài dòng
- Cách 2: Dùng Dictionary Object để khống chế dữ liệu trùng. Cách này hơi khó nhưng code đơn giản hơn. Tôi sẽ sửa code của bạn theo cách 2 này nhé
---------------------------------
PHP:
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Dic as Object
PHP:
Private Sub UserForm_Initialize()
  Set Dic = CreateObject("Scripting.Dictionary")
End Sub
PHP:
Private Sub CommandButton1_Click()
  Dim i As Long, Dg As Long, Tmp As String
  Label1.Caption = ""
  Label2.Caption = ""
  Label3.Caption = ""
  Dg = Me.ListBox1.ListCount
  If Sheet1.Cells(Dg + 2, 1) = "" Then Exit Sub
  Do
    For i = 1 To 100
      Randomize
      Label3.Caption = Int(10 * Rnd)
      Sleep i
      DoEvents
    Next
    For i = 1 To 100
      Randomize
      Label2.Caption = Int(10 * Rnd)
      Sleep i
      DoEvents
    Next
    For i = 1 To 50
      Randomize
      Label1.Caption = Int(4 * Rnd)
      Sleep i
      DoEvents
    Next
    Tmp = Label1.Caption & Label2.Caption & Label3.Caption
  Loop Until Not Dic.Exists(Tmp)
  Dic.Add Tmp, ""
  If Sheet1.Cells(Dg + 2, 1) <> "" Then
    Me.ListBox1.AddItem Sheet1.Cells(Dg + 2, 1)
    ListBox1.List(ListBox1.ListCount - 1, 1) = Label1.Caption
    ListBox1.List(ListBox1.ListCount - 1, 2) = Label2.Caption
    ListBox1.List(ListBox1.ListCount - 1, 3) = Label3.Caption
  End If
End Sub

Thầy NDU hay quá, nhưng nếu có thể làm cho cả 3 số cùng chạy, rồi dừng lần lượt hàng đơn vị, hàng chục, hàng trăm thì quá hay luôn!
 
Upvote 0
nếu có thể làm cho cả 3 số cùng chạy, rồi dừng lần lượt hàng đơn vị, hàng chục, hàng trăm thì quá hay luôn!
Tách 3 số chạy riêng mới mệt chứ gộp chung có khó khăn gì chứ ---> Gộp 3 vòng lập lại thành 1
Nói chung mấy trò chơi này thuật toán mới quan trọng, còn màu mè thêm vào thì... cứ nghĩ sao viết vậy đi
 
Upvote 0
Em cám ơn Thầy NDU nhiều, cái DoEvents đúng là khắc phục tình trạng bị đơ.

Tách 3 số chạy riêng mới mệt chứ gộp chung có khó khăn gì chứ ---> Gộp 3 vòng lập lại thành 1
Nói chung mấy trò chơi này thuật toán mới quan trọng, còn màu mè thêm vào thì... cứ nghĩ sao viết vậy đi

_ Thầy ơi nếu gộp cả 3 vòng lặp lại thành 1 thì cả 3 số đều cùng chạy và cùng ngừng, còn ý của minhthien là muốn 3 số cùng chạy nhưng sẽ lần lượt ngừng lại (em cũng muốn vậy nữa --=0)
_ Còn 1 vấn đề nữa, nhưng ăn gian 1 chút cho vui, ví dụ em muốn 3 số đó quay cho đã nhưng kết quả cuối cùng hiện ra là theo ý em, ví dụ em muốn lần 1 ra số 213, lần 2 ra số 132 v.v... Thì mình phải viết code sao vậy thầy -\\/..
 
Upvote 0
Em cám ơn Thầy NDU nhiều, cái DoEvents đúng là khắc phục tình trạng bị đơ.
_ Còn 1 vấn đề nữa, nhưng ăn gian 1 chút cho vui, ví dụ em muốn 3 số đó quay cho đã nhưng kết quả cuối cùng hiện ra là theo ý em, ví dụ em muốn lần 1 ra số 213, lần 2 ra số 132 v.v... Thì mình phải viết code sao vậy thầy -\\/..

Trời, muốn Sếp hay vợ Sếp trúng thưởng đây!!!! (Lấy điểm hả hihihi)
 
Upvote 0
_ Thầy ơi nếu gộp cả 3 vòng lặp lại thành 1 thì cả 3 số đều cùng chạy và cùng ngừng, còn ý của minhthien là muốn 3 số cùng chạy nhưng sẽ lần lượt ngừng lại (em cũng muốn vậy nữa )
Cái này bạn... tự nghiên cứu đi cho nó lên tay nghề

_ Còn 1 vấn đề nữa, nhưng ăn gian 1 chút cho vui, ví dụ em muốn 3 số đó quay cho đã nhưng kết quả cuối cùng hiện ra là theo ý em, ví dụ em muốn lần 1 ra số 213, lần 2 ra số 132 v.v... Thì mình phải viết code sao vậy thầy
Để hiện giá trị ngẫu nhiên thì khó chứ hiện đúng ý mình thì quá dễ ---> Vòng lập quét thế nào mặc kệ, ta cứ xuất kết quả định trước. Ví dụ:
PHP:
Do
    For i = 1 To 100
      Randomize
      Label3.Caption = Int(10 * Rnd)
      Sleep i
      DoEvents
    Next
    If Dic.Count = 2 And Not Dic.Exists("213") Then Label3.Caption = 3
    For i = 1 To 100
      Randomize
      Label2.Caption = Int(10 * Rnd)
      Sleep i
      DoEvents
    Next
    If Dic.Count = 2 And Not Dic.Exists("213") Then Label2.Caption = 1
    For i = 1 To 50
      Randomize
      Label1.Caption = Int(4 * Rnd)
      Sleep i
      DoEvents
    Next
    If Dic.Count = 2 And Not Dic.Exists("213") Then Label1.Caption = 2
    Tmp = Label1.Caption & Label2.Caption & Label3.Caption
  Loop Until Not Dic.Exists(Tmp)
Tuy nhiên, viết chương trình chưa giỏi mà đã có tính "dối trá" trong này thì e rằng khách hàng sẽ bỏ bạn mà đi thôi (xin lỗi nếu đụng chạm)
 
Upvote 0
Í zaaaaaaaaa... Bạn này chơi ăn gian he ??? Nếu là cty mình thì các số thẻ của cấp quản lý bậc trung trở lên là không được chơi đâu ( ( từ Supervisor trở lên ). Nên chơi công bằng thế mới vui, nếu chơi ăn gian... lỡ ai đó khám phá được cái file này thì bạn làm sao ăn nói với mọi người đây.

Nice day !!!
 
Upvote 0
Tuy nhiên, viết chương trình chưa giỏi mà đã có tính "dối trá" trong này thì e rằng khách hàng sẽ bỏ bạn mà đi thôi (xin lỗi nếu đụng chạm)

_ Theo cách của Thầy thì em muốn số 123 ra ở lần quay nào thì em chỉ việc chỉnh lại số ở dòng này phải không thầy Dic.Count = 2 . Có phải cài này là đếm số dòng đã có trong Dic không Thầy ?
_ Cái file Quay Số Trúng Thưởng này là em dùng để học và nghiên cứu chứ không phải dùng để cho Quay Số thât đâu, nên không có chuyên ăn gian đâu Thầy ơi --=0
_ Vì em chưa bao giờ học VB nên tất cả những bài em hỏi trên diễn đàn mình, đều là em muốn tìm hiểu và phục vụ nhu cầu cá nhân thôi , chứ đâu có làm gì đâu.-\\/.
_ Nhờ các Thầy và các Bạn hướng dẫn từ bữa giờ nên bây giờ em có thể tự làm 1 file Excel có Form nhập liệu, kiểm tra và chỉnh sửa dữ liệu đã nhập, hiểu được cách dùng VB giúp cho Excel tiện dụng hơn v.v... @$@!^%
_ Và đang trong quá trình nghiền ngẫm tài liệu của mọi người up lên đây -+*/, không biết bao giờ mới viết được 1 File hoàn chỉnh đây....!$@!!
 
Lần chỉnh sửa cuối:
Upvote 0
Í zaaaaaaaaa... Bạn này chơi ăn gian he ??? Nếu là cty mình thì các số thẻ của cấp quản lý bậc trung trở lên là không được chơi đâu ( ( từ Supervisor trở lên ). Nên chơi công bằng thế mới vui, nếu chơi ăn gian... lỡ ai đó khám phá được cái file này thì bạn làm sao ăn nói với mọi người đây.

Nice day !!!

_ Yên tâm, file này chỉ để ở nhà chơi 1 mình thui, không có đem đi bất kỳ chỗ nào quay số, nên không sợ ảnh hưởng công việc đâu --=0
 
Upvote 0
Web KT

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

Back
Top Bottom