Vòng lặp do ... until bị treo (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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 ạ.
 
Dim i, j, k, cc, lra, lrb, pt As Integer
Rất nhiều người thường hay mắc lỗi nhỏ nhưng kết quả lỗi không hề nhỏ về khai báo biến như thế này. Các biến trên khi đọc vào ta nghĩ nó là kiểu Integer, nhưng thực chất chỉ có biến pt mới là kiểu Integer, các biến còn lại là Variant.

1575967922694.png
 
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 ạ.
Tôi nhớ không lầm thì giá trị âm dùng để đặt hạt giống cho hàm.
a = Rnd(-2)
b = Rnd(-3)
c = Rnd(-2)
===> a = c, và a <> b

Vào cửa sổ immediate gõ cái này
? Rnd(-1) = Rnd(-1); Rnd(1) = Rnd(1)
Kết quả
True False
 
Tôi nhớ không lầm thì giá trị âm dùng để đặt hạt giống cho hàm.
a = Rnd(-2)
b = Rnd(-3)
c = Rnd(-2)
===> a = c, và a <> b

Vào cửa sổ immediate gõ cái này
? Rnd(-1) = Rnd(-1); Rnd(1) = Rnd(1)
Kết quả
True False
Đúng như bác nói luôn.

Mã:
    Debug.Print Rnd(-10)
    Debug.Print Rnd()
    Debug.Print Rnd()
    Debug.Print Rnd()
    Debug.Print Rnd()


Code trên chạy 10 lần thì đề cho kết quả giống nhau.

Mã:
 0.3276443
 0.9140207
 0.5095669
 0.8464025
 0.9029734

Mã:
    Randomize -10
    Debug.Print Rnd()
    Debug.Print Rnd()
    Debug.Print Rnd()
    Debug.Print Rnd()
    Debug.Print Rnd()

code này thì nó chạy chằng lần nào giống lần nào, có cái gì đó sai sai hay sao ý ạ.
Bài đã được tự động gộp:

Rất nhiều người thường hay mắc lỗi nhỏ nhưng kết quả lỗi không hề nhỏ về khai báo biến như thế này. Các biến trên khi đọc vào ta nghĩ nó là kiểu Integer, nhưng thực chất chỉ có biến pt mới là kiểu Integer, các biến còn lại là Variant.

View attachment 229751
Cái này sách viết rõ lém rồi, cơ mà vẫn sai, tóm lại đẳng cấp của chúng ta không thể hiện qua việc viết tắt. Dùng cái đầu đậu hũ để quan tâm những chuyện trăng sao thì hay hơn, chứ nhớ mấy cái viết tắt này mệt lemsmmmmmmmmmmm.
 
...
Mã:
    Randomize -10
    Debug.Print Rnd()
    Debug.Print Rnd()
    Debug.Print Rnd()
    Debug.Print Rnd()
    Debug.Print Rnd()

code này thì nó chạy chằng lần nào giống lần nào, có cái gì đó sai sai hay sao ý ạ.
.
Copied từ sách vở:
Dòng thứ ba trong Rules có nói rõ là không dùng được.
Và trong Tips and Gotchas dặn rằng nếu muốn thì gọi một Rnd(số âm) đặt trước lệnh Randomize [số]


1576049362155.png
 
Chưa gì chủ thớt đã xóa file khỏi bài viết, nên không biết trợ giúp bằng cách nào.

Buồn buồn nên rút gọn Code lại 1 chút xíu:

---------------
PHP:
Sub XUATGT()
  Application.ScreenUpdating = False
  Dim i&, j&, k&, cc&, lra&, lrb&, pt&
  Dim C&, M&, N&
  Dim GT As String, KT As Boolean
  lra = Cells(Rows.Count, 1).End(xlUp).Row
  lrb = WorksheetFunction.CountIf(Range("F9:F" & lra), "x")
  pt = lra - Cells(6, 3).Value2 * 2
  Columns("H:BB").Delete
  Cells(1, 10).Value = lra: Cells(1, 11).Value = lrb: Cells(1, 12).Value = pt
Matrix1: C = 10: GoSub Matrix
Matrix2: C = 11: GoSub Matrix
GoSub Check
Matrix3: C = 16: GoSub Matrix
Matrix4: C = 17: GoSub Matrix
GoSub Check
  'Call DINHDANG
  Application.ScreenUpdating = False
Exit Sub

Matrix:
  For i = 9 To Cells(6, 3) + 8
    Do
      GT = Range("B9")(Int(Rnd() * ((lrb + 1) - 1) + 1), 1).Value2
      KT = False
      For M = 3 To 14
        For N = 10 To 11
          KT = (GT = ThisWorkbook.Worksheets(M).Cells(i, N).Value2) _
          Or (GT = ThisWorkbook.Worksheets(M).Cells(i, N + 6).Value2)
          If KT Then Exit For
        Next N
        If KT Then Exit For
      Next M
      k = 0
      For j = 9 To Cells(6, 3) + 8
        If (C = 10 And GT = Cells(j, C)) _
        Or (C = 11 And (GT = Cells(j, 10).Value2 Or GT = Cells(j, 11).Value2)) _
        Or (C = 16 And (GT = Cells(j, 10).Value2 Or GT = Cells(j, 16).Value2)) _
        Or (C = 17 And GT = Cells(j, 16).Value2 Or GT = Cells(j, 17).Value2 Or GT = Cells(j, 11).Value2) _
        Then k = k + 1
      Next j
    Loop Until k = 0 And KT = False
    If k = 0 Then Cells(i, C).Value = GT
  Next i
Return
Check:
  For i = 9 To pt
    Do
      k = 0
      GT = Range("B9")(Int(Rnd() * (lra - 7 - 1)) + 1, 1).Value2
      For j = 9 To pt + 8
        KT = GT = Cells(j, C - 1).Value2 Or GT = Cells(j, C).Value2 Or GT = Cells(j, C + 1).Value2
        If KT = True Then k = k + 1
      Next j
    Loop Until k = 0 And KT = False
    If k = 0 Then Cells(i, C + 1).Value = GT
  Next i
Return
End Sub
 

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

Back
Top Bottom