Vòng lặp do ... until bị treo

Liên hệ QC

doantrungtuan

Thành viên mới
Tham gia
1/11/19
Bài viết
16
Được thích
0
Nhờ anh/ chị giúp mình dừng code này. Cần thêm lệnh gì và đặt ở đâu?
Chẳng hạn: mỗi khi random thì cho ra giá trị khác chứ không được trùng vs giá trị trước đó. Và nếu không tìm thấy thì thông báo và dừng vòng lặp do ..until
Mình không rành về code lắm, chỉ cố gắng được đến đây.
Anh/ chị có giải pháp nào tốt hơn không? Xin cám ơn nhiều!
 
Lần chỉnh sửa cuối:
Nhờ anh/ chị giúp mình File này. Khi chạy hay bị treo, Không biết có phải do dữ liệu trùng không? Khi giảm điều kiện KT xuống cũng bị treo (chẳng hạn chỉ kiểm tra ST2=ST4=ST6; ST3=ST5=ST7). Có khi chỉ chạy trên 1 sheet cũng bị treo (cứ chạy đươc 4 hoặc 6 lần là bị treo mặc dù không có trùng dữ liệu với các sheet khác, lúc này end sub đi chạy lại được).
Mình không rành về code lắm, chỉ cố gắng được đến đây.
Anh/ chị có giải pháp nào tốt hơn không? Xin cám ơn nhiều!
Mình không xem code nhưng mà nên chuyển dùng vòng lặp không xác định thay bằng cái khác đi.Mình dùng điện thoại bạn có thể copy code lên xem nào.
 
Mình không xem code nhưng mà nên chuyển dùng vòng lặp không xác định thay bằng cái khác đi.Mình dùng điện thoại bạn có thể copy code lên xem nào.
Sub XUATGT()
Application.ScreenUpdating = False

Static i, j, k, cc, lra, lrb, pt As Integer
Static GT As String
Static KT As Boolean

lra = Cells(Rows.Count, 1).End(xlUp).Row
lrb = WorksheetFunction.CountIf(Range("F9:F" & lra), "x")
pt = lra - Cells(6, 3) * 2
Columns("H:BB").Delete
Cells(1, 10) = lra
Cells(1, 11) = lrb
Cells(1, 12) = pt
'xuat giam thi 1 - lan 1

For i = 9 To Cells(6, 3) + 8
Do
GT = WorksheetFunction.Index(Range("B9:B" & lra), Int(Rnd() * ((lrb + 1) - 1) + 1))
KT = GT = Sheet3.Cells(i, 10) Or GT = Sheet3.Cells(i, 11) Or GT = Sheet3.Cells(i, 16) Or GT = Sheet3.Cells(i, 17) _
Or GT = Sheet4.Cells(i, 10) Or GT = Sheet4.Cells(i, 11) Or GT = Sheet4.Cells(i, 16) Or GT = Sheet4.Cells(i, 17) _
Or GT = Sheet5.Cells(i, 10) Or GT = Sheet5.Cells(i, 11) Or GT = Sheet5.Cells(i, 16) Or GT = Sheet5.Cells(i, 17) _
Or GT = Sheet6.Cells(i, 10) Or GT = Sheet6.Cells(i, 11) Or GT = Sheet6.Cells(i, 16) Or GT = Sheet6.Cells(i, 17) _
Or GT = Sheet7.Cells(i, 10) Or GT = Sheet7.Cells(i, 11) Or GT = Sheet7.Cells(i, 16) Or GT = Sheet7.Cells(i, 17) _
Or GT = Sheet8.Cells(i, 10) Or GT = Sheet8.Cells(i, 11) Or GT = Sheet8.Cells(i, 16) Or GT = Sheet8.Cells(i, 17) _
Or GT = Sheet9.Cells(i, 10) Or GT = Sheet9.Cells(i, 11) Or GT = Sheet9.Cells(i, 16) Or GT = Sheet9.Cells(i, 17) _
Or GT = Sheet10.Cells(i, 10) Or GT = Sheet10.Cells(i, 11) Or GT = Sheet10.Cells(i, 16) Or GT = Sheet10.Cells(i, 17) _
Or GT = Sheet11.Cells(i, 10) Or GT = Sheet11.Cells(i, 11) Or GT = Sheet11.Cells(i, 16) Or GT = Sheet11.Cells(i, 17) _
Or GT = Sheet12.Cells(i, 10) Or GT = Sheet12.Cells(i, 11) Or GT = Sheet12.Cells(i, 16) Or GT = Sheet12.Cells(i, 17) _
Or GT = Sheet13.Cells(i, 10) Or GT = Sheet13.Cells(i, 11) Or GT = Sheet13.Cells(i, 16) Or GT = Sheet13.Cells(i, 17) _
Or GT = Sheet14.Cells(i, 10) Or GT = Sheet14.Cells(i, 11) Or GT = Sheet14.Cells(i, 16) Or GT = Sheet14.Cells(i, 17)
k = 0
For j = 9 To Cells(6, 3) + 8
If GT = Cells(j, 10) Then
k = k + 1
End If
Next j
Loop Until k = 0 And KT = False
If k = 0 Then
Cells(i, 10) = GT
End If
Next i
'xuat giam thi 2 - lan 1
For i = 9 To Cells(6, 3) + 8
Do
k = 0
GT = WorksheetFunction.Index(Range("B9:B" & lra), Int(Rnd() * ((lrb + 1) - 1) + 1))
KT = GT = Sheet3.Cells(i, 10) Or GT = Sheet3.Cells(i, 11) Or GT = Sheet3.Cells(i, 16) Or GT = Sheet3.Cells(i, 17) _
Or GT = Sheet4.Cells(i, 10) Or GT = Sheet4.Cells(i, 11) Or GT = Sheet4.Cells(i, 16) Or GT = Sheet4.Cells(i, 17) _
Or GT = Sheet5.Cells(i, 10) Or GT = Sheet5.Cells(i, 11) Or GT = Sheet5.Cells(i, 16) Or GT = Sheet5.Cells(i, 17) _
Or GT = Sheet6.Cells(i, 10) Or GT = Sheet6.Cells(i, 11) Or GT = Sheet6.Cells(i, 16) Or GT = Sheet6.Cells(i, 17) _
Or GT = Sheet7.Cells(i, 10) Or GT = Sheet7.Cells(i, 11) Or GT = Sheet7.Cells(i, 16) Or GT = Sheet7.Cells(i, 17) _
Or GT = Sheet8.Cells(i, 10) Or GT = Sheet8.Cells(i, 11) Or GT = Sheet8.Cells(i, 16) Or GT = Sheet8.Cells(i, 17) _
Or GT = Sheet9.Cells(i, 10) Or GT = Sheet9.Cells(i, 11) Or GT = Sheet9.Cells(i, 16) Or GT = Sheet9.Cells(i, 17) _
Or GT = Sheet10.Cells(i, 10) Or GT = Sheet10.Cells(i, 11) Or GT = Sheet10.Cells(i, 16) Or GT = Sheet10.Cells(i, 17) _
Or GT = Sheet11.Cells(i, 10) Or GT = Sheet11.Cells(i, 11) Or GT = Sheet11.Cells(i, 16) Or GT = Sheet11.Cells(i, 17) _
Or GT = Sheet12.Cells(i, 10) Or GT = Sheet12.Cells(i, 11) Or GT = Sheet12.Cells(i, 16) Or GT = Sheet12.Cells(i, 17) _
Or GT = Sheet13.Cells(i, 10) Or GT = Sheet13.Cells(i, 11) Or GT = Sheet13.Cells(i, 16) Or GT = Sheet13.Cells(i, 17) _
Or GT = Sheet14.Cells(i, 10) Or GT = Sheet14.Cells(i, 11) Or GT = Sheet14.Cells(i, 16) Or GT = Sheet14.Cells(i, 17)

For j = 9 To Cells(6, 3) + 8
If GT = Cells(j, 10) Or GT = Cells(j, 11) Then
k = k + 1
End If
Next j
Loop Until k = 0 And KT = False
If k = 0 Then
Cells(i, 11) = GT
End If
Next i
'xuat giam thi 3 - lan 1
For i = 9 To pt
Do
k = 0
GT = WorksheetFunction.Index(Range("B9:B" & lra), Int(Rnd() * (lra - 7 - 1)) + 1)
For j = 9 To pt + 8
KT = GT = Cells(j, 10) Or GT = Cells(j, 11) Or GT = Cells(j, 12)
If KT = True Then
k = k + 1
End If
Next j
Loop Until k = 0 And KT = False
If k = 0 Then
Cells(i, 12) = GT
End If
Next i
'xuat giam thi 1 - lan 2
For i = 9 To Cells(6, 3) + 8
Do
GT = WorksheetFunction.Index(Range("B9:B" & lra), Int(Rnd() * ((lrb + 1) - 1) + 1))
KT = GT = Sheet3.Cells(i, 10) Or GT = Sheet3.Cells(i, 11) Or GT = Sheet3.Cells(i, 16) Or GT = Sheet3.Cells(i, 17) _
Or GT = Sheet4.Cells(i, 10) Or GT = Sheet4.Cells(i, 11) Or GT = Sheet4.Cells(i, 16) Or GT = Sheet4.Cells(i, 17) _
Or GT = Sheet5.Cells(i, 10) Or GT = Sheet5.Cells(i, 11) Or GT = Sheet5.Cells(i, 16) Or GT = Sheet5.Cells(i, 17) _
Or GT = Sheet6.Cells(i, 10) Or GT = Sheet6.Cells(i, 11) Or GT = Sheet6.Cells(i, 16) Or GT = Sheet6.Cells(i, 17) _
Or GT = Sheet7.Cells(i, 10) Or GT = Sheet7.Cells(i, 11) Or GT = Sheet7.Cells(i, 16) Or GT = Sheet7.Cells(i, 17) _
Or GT = Sheet8.Cells(i, 10) Or GT = Sheet8.Cells(i, 11) Or GT = Sheet8.Cells(i, 16) Or GT = Sheet8.Cells(i, 17) _
Or GT = Sheet9.Cells(i, 10) Or GT = Sheet9.Cells(i, 11) Or GT = Sheet9.Cells(i, 16) Or GT = Sheet9.Cells(i, 17) _
Or GT = Sheet10.Cells(i, 10) Or GT = Sheet10.Cells(i, 11) Or GT = Sheet10.Cells(i, 16) Or GT = Sheet10.Cells(i, 17) _
Or GT = Sheet11.Cells(i, 10) Or GT = Sheet11.Cells(i, 11) Or GT = Sheet11.Cells(i, 16) Or GT = Sheet11.Cells(i, 17) _
Or GT = Sheet12.Cells(i, 10) Or GT = Sheet12.Cells(i, 11) Or GT = Sheet12.Cells(i, 16) Or GT = Sheet12.Cells(i, 17) _
Or GT = Sheet13.Cells(i, 10) Or GT = Sheet13.Cells(i, 11) Or GT = Sheet13.Cells(i, 16) Or GT = Sheet13.Cells(i, 17) _
Or GT = Sheet14.Cells(i, 10) Or GT = Sheet14.Cells(i, 11) Or GT = Sheet14.Cells(i, 16) Or GT = Sheet14.Cells(i, 17)
k = 0
For j = 9 To Cells(6, 3) + 8
If GT = Cells(j, 16) Or GT = Cells(j, 10) Then
k = k + 1
End If
Next j
Loop Until k = 0 And KT = False
If k = 0 Then
Cells(i, 16) = GT
End If
Next i
'xuat giam thi 2 - lan 2
For i = 9 To Cells(6, 3) + 8
Do
k = 0
GT = WorksheetFunction.Index(Range("B9:B" & lra), Int(Rnd() * ((lrb + 1) - 1) + 1))
KT = GT = Sheet3.Cells(i, 10) Or GT = Sheet3.Cells(i, 11) Or GT = Sheet3.Cells(i, 16) Or GT = Sheet3.Cells(i, 17) _
Or GT = Sheet4.Cells(i, 10) Or GT = Sheet4.Cells(i, 11) Or GT = Sheet4.Cells(i, 16) Or GT = Sheet4.Cells(i, 17) _
Or GT = Sheet5.Cells(i, 10) Or GT = Sheet5.Cells(i, 11) Or GT = Sheet5.Cells(i, 16) Or GT = Sheet5.Cells(i, 17) _
Or GT = Sheet6.Cells(i, 10) Or GT = Sheet6.Cells(i, 11) Or GT = Sheet6.Cells(i, 16) Or GT = Sheet6.Cells(i, 17) _
Or GT = Sheet7.Cells(i, 10) Or GT = Sheet7.Cells(i, 11) Or GT = Sheet7.Cells(i, 16) Or GT = Sheet7.Cells(i, 17) _
Or GT = Sheet8.Cells(i, 10) Or GT = Sheet8.Cells(i, 11) Or GT = Sheet8.Cells(i, 16) Or GT = Sheet8.Cells(i, 17) _
Or GT = Sheet9.Cells(i, 10) Or GT = Sheet9.Cells(i, 11) Or GT = Sheet9.Cells(i, 16) Or GT = Sheet9.Cells(i, 17) _
Or GT = Sheet10.Cells(i, 10) Or GT = Sheet10.Cells(i, 11) Or GT = Sheet10.Cells(i, 16) Or GT = Sheet10.Cells(i, 17) _
Or GT = Sheet11.Cells(i, 10) Or GT = Sheet11.Cells(i, 11) Or GT = Sheet11.Cells(i, 16) Or GT = Sheet11.Cells(i, 17) _
Or GT = Sheet12.Cells(i, 10) Or GT = Sheet12.Cells(i, 11) Or GT = Sheet12.Cells(i, 16) Or GT = Sheet12.Cells(i, 17) _
Or GT = Sheet13.Cells(i, 10) Or GT = Sheet13.Cells(i, 11) Or GT = Sheet13.Cells(i, 16) Or GT = Sheet13.Cells(i, 17) _
Or GT = Sheet14.Cells(i, 10) Or GT = Sheet14.Cells(i, 11) Or GT = Sheet14.Cells(i, 16) Or GT = Sheet14.Cells(i, 17)

For j = 9 To Cells(6, 3) + 8
If GT = Cells(j, 16) Or GT = Cells(j, 17) Or GT = Cells(j, 11) Then
k = k + 1
End If
Next j

Loop Until k = 0 And KT = False
If k = 0 Then
Cells(i, 17) = GT
End If
Next i
'xuat giam thi 3 - lan 2
For i = 9 To pt
Do
k = 0
GT = WorksheetFunction.Index(Range("B9:B" & lra), Int(Rnd() * ((lra - 7) - 1) + 1))
For j = 9 To pt + 8
If GT = Cells(j, 16) Or GT = Cells(j, 17) Or GT = Cells(j, 18) Then
k = k + 1
End If
Next j
Loop Until k = 0
If k = 0 Then
Cells(i, 18) = GT
End If
Next i
Call DINHDANG
Application.ScreenUpdating = False

End Sub
 
Nhồm vô câu lệnh này thấy mà kinh dị:
KT = GT = Sheet3.Cells(i, 10) Or GT = Sheet3.Cells(i, 11) Or GT = Sheet3.Cells(i, 16) Or GT = Sheet3.Cells(i, 17) _
Or GT = Sheet4.Cells(i, 10) Or GT = Sheet4.Cells(i, 11) Or GT = Sheet4.Cells(i, 16) Or GT = Sheet4.Cells(i, 17) _
Or GT = Sheet5.Cells(i, 10) Or GT = Sheet5.Cells(i, 11) Or GT = Sheet5.Cells(i, 16) Or GT = Sheet5.Cells(i, 17) _
Or GT = Sheet6.Cells(i, 10) Or GT = Sheet6.Cells(i, 11) Or GT = Sheet6.Cells(i, 16) Or GT = Sheet6.Cells(i, 17) _
Or GT = Sheet7.Cells(i, 10) Or GT = Sheet7.Cells(i, 11) Or GT = Sheet7.Cells(i, 16) Or GT = Sheet7.Cells(i, 17) _
Or GT = Sheet8.Cells(i, 10) Or GT = Sheet8.Cells(i, 11) Or GT = Sheet8.Cells(i, 16) Or GT = Sheet8.Cells(i, 17) _
Or GT = Sheet9.Cells(i, 10) Or GT = Sheet9.Cells(i, 11) Or GT = Sheet9.Cells(i, 16) Or GT = Sheet9.Cells(i, 17) _
Or GT = Sheet10.Cells(i, 10) Or GT = Sheet10.Cells(i, 11) Or GT = Sheet10.Cells(i, 16) Or GT = Sheet10.Cells(i, 17) _
Or GT = Sheet11.Cells(i, 10) Or GT = Sheet11.Cells(i, 11) Or GT = Sheet11.Cells(i, 16) Or GT = Sheet11.Cells(i, 17) _
Or GT = Sheet12.Cells(i, 10) Or GT = Sheet12.Cells(i, 11) Or GT = Sheet12.Cells(i, 16) Or GT = Sheet12.Cells(i, 17) _
Or GT = Sheet13.Cells(i, 10) Or GT = Sheet13.Cells(i, 11) Or GT = Sheet13.Cells(i, 16) Or GT = Sheet13.Cells(i, 17) _
Or GT = Sheet14.Cells(i, 10) Or GT = Sheet14.Cells(i, 11) Or GT = Sheet14.Cells(i, 16) Or GT = Sheet14.Cells(i, 17)

Mà nó có tác dụng gì vậy bạn chủ bài đăng?
 
Giá trị GT là lấy tên ngẫu nhiên trong danh sách cho trước. Rồi đem KT (=GT) đem so sánh với với các giá trị ở ô trong sheet khác cùng dòng. Chỉ cần phát hiện trùng với bất kì 1 dòng nào trong các cột đó thì lặp lại tìm giá trị GT khác.
Mình nghĩ nó bị trùng và không thoát được vòng lặp. ( cái này chắc chịu thua)
Nhưng có khi chỉ chạy trên 1 sheet và các sheet khác không có dữ liệu để so sánh. Mà cũng bị treo khi chạy đảo GT. Mà nó treo ở lần thứ 4 thì lần sau chạy lại cũng là lần thứ 4 lại treo
 
Bạn thử sửa lại đoạn này:

Static thành Dim

Dim i, j, k, cc, lra, lrb, pt As Integer
Dim GT As String
Dim KT As Boolean
 
Để kiểm tra vòng lặp bị treo bạn có thể khai báo 1 biến đếm, biến này tăng 1 ở ngay đầu vòng lặp. Đặt con trỏ ở lệnh nằm dưới lệnh Loop rồi bấm F9 để đặt breakpoint ở đó. Trong cửa sổ watch, bạn thêm giá trị cần theo dõi là biến đếm ở trên, chọn Break khi biến này đạt giá trị nào đó (1 triệu chẳng hạn). Khi vòng lặp chạy quá nhiều thì code sẽ dừng.
 
Để kiểm tra vòng lặp bị treo bạn có thể khai báo 1 biến đếm, biến này tăng 1 ở ngay đầu vòng lặp. Đặt con trỏ ở lệnh nằm dưới lệnh Loop rồi bấm F9 để đặt breakpoint ở đó. Trong cửa sổ watch, bạn thêm giá trị cần theo dõi là biến đếm ở trên, chọn Break khi biến này đạt giá trị nào đó (1 triệu chẳng hạn). Khi vòng lặp chạy quá nhiều thì code sẽ dừng.
Cám ơn bạn mình sẽ thử
 
Nhờ anh/ chị giúp mình File này. Khi chạy hay bị treo, Không biết có phải do dữ liệu trùng không? Khi giảm điều kiện KT xuống cũng bị treo (chẳng hạn chỉ kiểm tra ST2=ST4=ST6; ST3=ST5=ST7). Có khi chỉ chạy trên 1 sheet cũng bị treo (cứ chạy đươc 4 hoặc 6 lần là bị treo mặc dù không có trùng dữ liệu với các sheet khác, lúc này end sub đi chạy lại được).
Mình không rành về code lắm, chỉ cố gắng được đến đây.
Anh/ chị có giải pháp nào tốt hơn không? Xin cám ơn nhiều!
Phân công coi thi không trùng dể bị chạy mãi không dừng, nếu dừng ngang thì không ra được kết quả
Mô tả dữ liệu ban đầu, yêu cầu xử lý kết quả để các bạn trên diễn đàn viết lại toàn bộ sẽ nhanh hơn sửa code
 
Phân công coi thi không trùng dể bị chạy mãi không dừng, nếu dừng ngang thì không ra được kết quả
Mô tả dữ liệu ban đầu, yêu cầu xử lý kết quả để các bạn trên diễn đàn viết lại toàn bộ sẽ nhanh hơn sửa code
Em nhìn cái code dài lê thê.Bạn này chắc cũng chịu khó viết code.Để đọc hiểu cái code này chắc viết cái code mới có vẻ nhanh hơn anh à.
 
Đập đi xây mới thôi.
Anh / xem file excel dùm. Nếu cần viết code lại thì sẽ viết như thế nào?
Yêu cầu:
1. Giữ nguyên sheet "PhanCong" và sheet "DanhSach"
2. Lọc và phân ra các sheet ST2 ST3 .... dựa trên sheet DANHSACH và mục chấm chung trong sheet PHANCONG
3. Danh sách giám thị không được trùng nhau giữa các sheet st2 ct2 st3 ct3 ....
 
Anh / xem file excel dùm. Nếu cần viết code lại thì sẽ viết như thế nào?
Yêu cầu:
1. Giữ nguyên sheet "PhanCong" và sheet "DanhSach"
2. Lọc và phân ra các sheet ST2 ST3 .... dựa trên sheet DANHSACH và mục chấm chung trong sheet PHANCONG
3. Danh sách giám thị không được trùng nhau giữa các sheet st2 ct2 st3 ct3 ....
Bạn nhờ thì cứ nhờ mọi người. Gọi tên tôi nhưng chắc gì tôi có hứng, có thời gian. Mà quan trọng là chưa chắc tôi biết làm.
 
Đại khái thì mấu chốt code này có một cái trị Rnd().
Mà ở đây dùng Rnd() lại không có Randomize cho nên chỉ là giả random. Cho nên mỗi lần mở lên chạy sẽ ra in hệt nhau. Mỗi lần chạy có khác nhau không thì tuy theo có đóng Project chưa.

Còn lại thì bố tôi cũng chẳng biết. Code không có chú thích thì ai biết do thuật toán sai hay code đi sai thuật toán.

Gợi ý: So sánh 1 giá trị nhiều lần thì có hai cách
1. dùng hàm Array nhét đám cần so sánh vào một mảng rồi dùng hàm Match mà dò.
2. dùng Select Case.
 
Lần chỉnh sửa cuối:
Đại khái thì mấu chốt code này có một cái trị Rnd().
Mà ở đây dùng Rnd() lại không có Randomize cho nên chỉ là giả random. Cho nên mỗi lần mở lên chạy sẽ ra in hệt nhau. Mỗi lần chạy có khác nhau không thì tuy theo có đóng Project chưa.
Phải rồi đó bạn. Mặc dù không có dữ liệu trùng. Nhưng cứ treo thì mở sub lại vẫn treo. Khắc phục như thế nào vậy bạn
 
Chào bạn mình ko biết code gi đau,nhưng nếu bạn có hoặc code chuong trinh phan cong giam thi canh thi hoc kỳ thì cho mình xin nhé , cảm ơn bạn
 
Chào bạn mình ko biết code gi đau,nhưng nếu bạn có hoặc code chuong trinh phan cong giam thi canh thi hoc kỳ thì cho mình xin nhé , cảm ơn bạn
Mình không biết yêu cầu khi phân công của bạn như thế nào? Bạn tìm trên mạng có phần mềm PCGT 1.6 của tác giả Hoàng cường xem có giúp được gì không.
Còn fle của mình theo điều kiện tổ và có gv chấm chung
 
Mà ở đây dùng Rnd() lại không có Randomize cho nên chỉ là giả random
Cháu đọc trên goolge thấy bảo là hàm rnd nếu đưa tham số nhận giá trị âm vào thì nó có chức năng giống hàm randomize, mà đến khi chạy thử để test thì nó lại khác nhau, thế là sao hả bác?, có khi nào không cần dùng hàm randomize mà vẫn ngẫu nhiên thật sự không ạ.
 
Web KT
Back
Top Bottom