[英]Why is my loop not going through all values?
我正在嘗試讓 Excel vba 宏工作。 我正在使用的代碼如下:
Dim foo, bar, toto As Double
Dim nb As Integer
nb = 1
For bar = 1 To 1 Step 0.2
For toto = 1 To 4 Step 0.2
For foo = 1 To 2 Step 0.2
Cells(nb, 1).Value = CStr("bar " & bar & " toto " & toto & " foo " & foo)
nb = nb + 1
Next foo
Next toto
Next bar
End Sub
我希望看到案例 toto=4 打印出來。 我得到的最終結果是:
bar 1 toto 1 foo 1
bar 1 toto 1 foo 1.2
bar 1 toto 1 foo 1.4
[....]
bar 1 toto 3.8 foo 1.6
bar 1 toto 3.8 foo 1.8
bar 1 toto 3.8 foo 2
變量 foo 按預期從 1 變為 2,並且每次遞增 0.2。 另一方面,變量 toto 從 1 變為 3.8,而不是上升到 4。
如何更改我的代碼以使 toto 達到 4? 我嘗試將我的 for 循環的上限值更改為 (max + 1 step),並且對於 toto 它有效,但對於 foo 和 bar 它們是一個“額外”循環。
我試圖將代碼更改為基於一段時間的方法,但也沒有成功。
bar = 1
toto = 1
foo = 1
nb = 1
While (bar <= 1)
toto = 1
While (toto <= 4)
foo = 1
While (foo <= 2)
Cells(nb, 4).Value = CStr("bar " & bar & " toto " & toto & " foo " & foo)
nb = nb + 1
foo = foo + 0.2
Wend
toto = toto + 0.2
Wend
bar = bar + 0.2
Wend
這是由於浮點錯誤。 我會避免使用Step 0.2
而是在循環內將foo
、 bar
和toto
乘以0.2
,而在循環時只使用整數:
Dim foo As Long, bar As Long, toto As Long, nb As Long
nb = 1
For bar = 1 To 5
For toto = 1 To 20
For foo = 1 To 10
Cells(nb, 1).Value = CStr("bar " & bar * 0.2 & " toto " & toto * 0.2 & " foo " & foo * 0.2)
nb = nb + 1
Next
Next
Next
另請注意,在vba中, Dim foo, bar, toto As Double
僅將toto
聲明為Double
。 foo
和bar
是Variant
s。
您錯誤地聲明了變量。 每個聲明都需要As
聲明。 你這樣做的方式使得foo
和bar
類型為Variant
,這可能是 VBA 當時想要的任何東西。 最好每行有一個聲明。 如果我們讓鞋面稍微大於 4,比如 4.01,那么它就可以工作。 我不確定為什么。
Dim foo As Double
Dim bar As Double
Dim toto As Double
Dim nb As Integer
nb = 1
For bar = 1 To 1 Step 0.2
For toto = 1 To 4.01 Step 0.2
For foo = 1 To 2 Step 0.2
Cells(nb, 1).Value = CStr("bar " & bar & " toto " & toto & " foo " & foo)
nb = nb + 1
Next foo
Next toto
Next bar
如果您不喜歡在toto
的上限上添加一些斜率,您也可以使用Round
強制有效數字。
這個按您期望的方式工作:
Sub test()
Dim foo As Single
Dim bar As Single
Dim toto As Single
Dim nb As Integer
nb = 1
For bar = 1 To 1 Step 0.2
For toto = 1 To 4 Step 0.2
toto = Round(toto, 1)
For foo = 1 To 2 Step 0.2
Debug.Print CStr("bar " & bar & " toto " & toto & " foo " & foo)
nb = nb + 1
Next foo
Next toto
Next bar
End Sub
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.