簡體   English   中英

為什么我的循環沒有遍歷所有值?

[英]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而是在循環內將foobartoto乘以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

另請注意,在中, Dim foo, bar, toto As Double僅將toto聲明為Double foobarVariant s。

您錯誤地聲明了變量。 每個聲明都需要As聲明。 你這樣做的方式使得foobar類型為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM