Vấn đề sau khi Enter thì ngưng vòng lặp.

Liên hệ QC

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,720
Giới tính
Nam
Kính thưa các Anh Chị,
Làm sao sau khi đang chạy số trên Label1 (vòng lặp đang chạy), thì khi enter nó ngưng vòng lặp và cho ra liền kết quả của random, Sau đó Enter tiếp thì chạy vòng lặp cho quay số, Enter tiếp thì ngừng lại cho kết quả Random kế tiếp?

Nhờ các Anh Chị xem file và giúp đỡ mình.
Cám ơn các Anh Chị.
 
Lần chỉnh sửa cuối:
Không hiểu tại sao, khác với access, trong excel mình lại không thích cái trò Sendkeys này cho lắm!
Vì vậy trong trường hợp này mình thường cho vòng lặp chạy trong những khoảng thời gian mình nhập vô ngay trước đó;
Tất nhiên không gây nên sự hứng khởi trong trò chơi; nhưng cũng chọn được ngẫu số mà không một ai nghi ngờ mình gian lận!
Khì, khì,. . . .
 
Upvote 0
Kính thưa các Anh Chị,
Làm sao sau khi đang chạy số trên Label1 (vòng lặp đang chạy), thì khi enter nó ngưng vòng lặp và cho ra liền kết quả của random, Sau đó Enter tiếp thì chạy vòng lặp cho quay số, Enter tiếp thì ngừng lại cho kết quả Random kế tiếp?

Nhờ các Anh Chị xem file và giúp đỡ mình.
Cám ơn các Anh Chị.
Đã thử Onkey nhưng chẳng thấy có tác dụng gì!
Hình như khi vòng lập đang chạy, ta chỉ có việc chờ chứ chẳng thể làm được gì cả (trừ phi bấm Ctrl + Break)
 
Upvote 0
Upvote 0
Minh Thien thu dùng mảng thay cho sheet xem sao? Mình thấy nó gọn hơn, khỏi lo tàn tích, ngừng chạy thì mảng cũng tiêu luôn.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nhớ có lần Thầy NDU dùng dictionary để xóa phần tử vừa hiện kết quả trong cái mãng này, giờ mình làm mà không được!

Thầy NDU xem code rồi làm dùm em nha:
PHP:
Option Explicit
 
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private iCount As Long, Dic1, k As Long
Private Sub UserForm_Initialize()
  Set Dic1 = CreateObject("Scripting.Dictionary")
  iCount = 0: k = 0
End Sub
 
Private Sub CommandButton1_Click()
  Dim i As Long, iRnd As Long, Alert As String
  On Error Resume Next
  If k = 0 Then iCount = 1 * TextBox1.Value
  With TextBox1
    If .Value = "" Or .Value < 0 Or Not IsNumeric(.Value) Then Exit Sub
    If iCount = 0 Then
      MsgBox "Finish": Exit Sub
    End If
  End With
  If Dic1.Count = 0 Then
    For i = 1 To iCount
      Dic1.Add i, i
    Next
  End If
  For i = 1 To Dic1.Count * 3
    Randomize
    iRnd = Int((Dic1.Count) * Rnd()) + 1
    Label1.Caption = Dic1.Item(iRnd)
    Sleep i
    UserForm1.Repaint
  Next
  Dic1.Remove iRnd
  UpdateDic
End Sub
 
Private Sub UpdateDic()
  Dim i As Long, Dic2
  Dic2 = Join(Dic1.Items, " ")
  Dic2 = Split(WorksheetFunction.Trim(Dic2), " ")
  Set Dic1 = CreateObject("Scripting.Dictionary")
  For i = 0 To UBound(Dic2)
    Dic1.Add i + 1, Dic2(i)
  Next i
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
    If Lenh = "Chay" Then Exit Sub
  Next
  'Tai sao khi dung no khong xoa so random?
  '
  .Cells(iRnd, 1).Resize(, 1).Delete
  Call Dem
End Sub
1. Vấn đế 1: Không xoá ô có giá trị đã chọn:
Khi biến Lenh có giá trị "Chay" thì Exit Sub, thì những dòng lệnh tiếp theo đâu có thi hành nữa?

2. For i = 1 to 100:
Ít quá. chưa kịp enter gì đã hết 100, nó sẽ Call Dem lần 2, lần 3, ...., 1 lần call nó xoá 1 dòng. Nếu giật mình nhấn enter thì đã ô hô ai tai.

Giải quyết:

1. Vấn đề 1: Hoặc đưa dòng lệnh xoá lên trên dòng Exit Sub, hoặc sửa Exit Sub thành Exit For, hoặc sửa Exit Sub thành GoTo
2. Vấn đề 2: Dùng Do . . . Loop thay cho For, không cần call Dem nhiều lần.

Thí dụ:

PHP:
Dim Lenh As String
Lenh = "Dung"
With Range([A1], [A65536].End(xlUp))
  Do
    Randomize
    iRnd = Int((.Rows.Count) * Rnd()) + 1
    Label1.Caption = .Cells(iRnd, 1)
    Sleep 10
    UserForm1.Repaint
    DoEvents
    Lenh = CommandButton1.Caption
    If Lenh = "Chay" Then GoTo Ends
  Loop

Ends:
  .Cells(iRnd, 1).Resize(, 1).Delete
End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn bài của Bạn, mình đã làm được rồi, tuy nhiên, khi ngừng lại, làm sao xóa đi số trong sheet vừa cho kết quả?
Xin xem file
Tại đồng chí Exit Sub thì lấy gì mà xóa
Phải Goto đến nơi nào đó mà xử
Ví dụ:
PHP:
Sub dem()
  Dim i As Long, iRnd As Long, Lenh As String
  With Range([A1], [A65536].End(xlUp))
    For i = 1 To 100
      Randomize
      iRnd = Int((.Rows.Count) * Rnd()) + 1
      Label1.Caption = .Cells(iRnd, 1)
      Sleep i
      UserForm1.Repaint
      DoEvents
      If CommandButton1.Caption = "Chay" Then GoTo St1
    Next
    .Cells(iRnd, 1).Delete
    Call dem
St1:
    .Cells(iRnd, 1).Delete
  End With
End Sub
----------------------
2. For i = 1 to 100:
Ít quá. chưa kịp enter gì đã hết 100, nó sẽ Call Dem lần 2, lần 3, ...., 1 lần call nó xoá 1 dòng. Nếu giật mình nhấn enter thì đã ô hô ai tai.
Không ít đâu sư phụ à *thậm chí rất lâu nữa là đằng khác) vì có hàm Sleep làm chậm quá trình rồi
 
Lần chỉnh sửa cuối:
Upvote 0
Code của ndu vẫn chưa giải quyết vấn đề 2 nêu trên. Giật mình Enter thì đã ô hô ai tai
Không ít đâu sư phụ à *thậm chí rất lâu nữa là đằng khác) vì có hàm Sleep làm chậm quá trình rồi

Mình thử trên cái máy con rùa của mình tại Cty, chớpp mắt 1 cái tiêu 1 dòng đấy.
Nếu xài thực tế thì MC chỉ kịp nói 1 câu "thưa các đồng chí" là đã xong phim.

Nếu thay bằng Do . . . Loop, thì MC có ca đủ 6 câu vọng cổ rồi mới enter cũng chẳng sao.
 
Lần chỉnh sửa cuối:
Upvote 0
Nói thêm về Sì líp:
Sleep (i) với i tính bắng milisecond, i = 1 to 100 thì tổng cộng là 5.050 milisecond = 5,05 giây xoá 1 phát. Ẹc, ẹc
 
Upvote 0
Code của ndu vẫn chưa giải quyết vấn đề 2 nêu trên. Giật mình Enter thì đã ô hô ai tai


Mình thử trên cái máy con rùa của mình tại Cty, chớpp mắt 1 cái tiêu 1 dòng đấy.
Nếu xài thực tế thì MC chỉ kịp nói 1 câu "thưa các đồng chí" là đã xong phim.

Nếu thay bằng Do . . . Loop, thì MC có ca đủ 6 câu vọng cổ rồi mới enter cũng chẳng sao.
Vì trong code của minhthien có đoạn Sleep i ---> Mà i chạy từ 1 đến 100 nên tổng thời gian sẽ là:
1 + 2 + .... + 99 + 100 = 5050 <===> trên 5 giây đấy sư phụ à!
Tức là 5 giây cho 1 lần xóa dữ liệu! Không nhanh lắm đâu! ---> Dù sao thì thời gian này ta có thể tùy chỉnh được (theo em không quan trọng lắm)
 
Upvote 0
Sau khi được các THẦY hướng dẫn, mình làm cái chương trình Rút thăm trúng thưởng (từ File của Thầy AnhTuan1066 mình cải tiến chút). Tặng các Thành viên trong lúc trà dư tửu hậu.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom