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

Liên hệ QC
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
 
Web KT
Back
Top Bottom