Nhờ giải thích giá trị của biến chạy

Liên hệ QC

anhdepjai

Thành viên thường trực
Tham gia
16/6/10
Bài viết
382
Được thích
91
Gửi mọi người, hôm nay em vô tình kiểm tra mới thấy lạ. Tại sao vòng lặp chạy biến i từ 1 đến 5. nhưng khi kết quả cuối cùng thì biến chạy lại bằng 6
Mọi người giải thích cho em với nhé. Em cảm ơn
Sub Test()
dim i as long
For i = 1 To 5
Next
MsgBox i
End Sub
 
Vậy theo bạn i bằng bao nhiêu mới không thấy lạ.
 
Upvote 0
Gửi mọi người, hôm nay em vô tình kiểm tra mới thấy lạ. Tại sao vòng lặp chạy biến i từ 1 đến 5. nhưng khi kết quả cuối cùng thì biến chạy lại bằng 6
Mọi người giải thích cho em với nhé. Em cảm ơn
Sub Test()
dim i as long
For i = 1 To 5
Next
MsgBox i
End Sub
Thì đúng nó chạy với step 1 mà.Bạn thử chạy với Step 2 xem nào.Với vòng lặp For next này nó chạy với giá trị trong khoảng đó thôi.Khi nào số i vượt ngoài khoảng thì nó sẽ kết thúc vòng lặp.
 
Upvote 0
... Tại sao vòng lặp chạy biến i từ 1 đến 5.
Tại vì bạn ngỡ là bạn bảo i sẽ từ 1 đến 5 và không chạy nữa sau khi đã xong 5.
Trên thực tế VBA nó hiểu là "bao giờ i vượt quá 5 thì không chạy nữa". Và do đó nó không chạy nữa vào lúc i = 6

Điều này RẤT QUAN TRỌNG trong việc quản lý vòng lặp.

Nói cách khác:

For i = 1 To 5
...

Next i

Tương đương với
i = 1
Do While i <= 5
...

i = i + 1
Loop


Sau khi dứt vòng lặp thì i phải lớn hơn 5
 
Upvote 0
Tôi nghĩ là bạn có một phát hiện thú vị và sẽ tránh đi một rủi ro về sau này còn muốn tìm nguyên do thì tôi nghĩ chỉ có ai viết trình biên dịch VBA mới có trả lời chính xác được không chỉ là võ đoán (có khi đoán tào lao). Tôi cũng xin chia sẻ 1 tình huống cũng khó hiểu sau:
PHP:
Sub V()
    Dim i, j
    For j = 1 To 5
        i = i + 1
    Next
    Debug.Print i
End Sub

Sub T()
    Dim j
    For j = 1 To 5
        Dim i
        i = i + 1
    Next
    Debug.Print i
End Sub
Theo các ngôn ngữ khác mà tôi biết, lỗi phạm vi (tam vuc) sẽ xảy ra ở Sub T, nhưng kỳ lạ là trong VBA thì chả phát sinh lỗi nào cả. Tôi dù cũng không chuyên nhưng mà cũng có thể đưa ra 1 cái võ đoán nào đó (chẳng hạn mọi biến đều được khai báo trước tiên dù chúng nằm sau nhiều dòng lệnh khác) và tôi kiểm nghiệm võ đoán bằng 1 sub sau:
PHP:
Sub bb()
    GoTo sông'cố tình nhảy (bỏ) qua lệnh Dim i xem nó xảy ra chuyện giề'
    Dim i As Byte
    i = 1
sông:
    Debug.Print i 'ai dè i được khai báo trước rồi nên chả có lỗi liếc gì cả'
End Sub
Nhưng đó cũng chỉ là... võ đoán chứ chả có sự đảm bảo nào. May mắn là ta sẽ có sự phòng bị cho những lỗi logic (lỗi mà hổng báo lỗi) còn lý do thực sự thì chả có ai trả lời chính xác được trừ Microsoft.
 
Upvote 0
Web KT

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

Back
Top Bottom