Excel 为什么我的循环没有遍历所有的值?

Excel 为什么我的循环没有遍历所有的值?,excel,vba,for-loop,Excel,Vba,For Loop,我正在尝试让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 " &a

我正在尝试让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步),对于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
bar=1
toto=1
foo=1
nb=1

While(bar这是由于浮点错误。我会避免使用
步骤0.2
,而是在循环内用
0.2
乘以
foo
bar
toto
,而在循环时只使用整数:

Dim foo As Long,bar As Long,toto As Long,nb As Long
nb=1
对于bar=1到5
对于toto=1至20
对于foo=1到10
单元格(注意,1).Value=CStr(“bar”&bar*0.2&“toto”&toto*0.2&“foo”&foo*0.2)
nb=nb+1
下一个
下一个
下一个

还请注意,在中,
Dim foo、bar、toto As Double
只声明
toto
Double
bar
变量
s.

您错误地声明了变量。您需要在每个声明中声明
As
语句。您这样做的方式使得
foo
ode>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
的上限上添加一些斜率,您还可以强制使用
舍入的有效数字

这一项的工作方式与您预期的相同:

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

答案是浮点错误。我们不能保证步进
0.2
将精确到4。更改为数据类型
Single
我看到了错误。它报告如下:
bar 1 toto 3.800001 foo 1.8
,这使得它溢出4到4.00000001并结束。这也可以用
Round
来修复。当数学是计算机擅长的一件事。为什么VBA会如此草率?我根本不会称之为“草率”。浮点错误比VBA更广泛。看起来它确实是一个浮点错误。我尝试添加一个小值(1E-7)到了我的每个for循环的上限,它进行得很顺利。我会等待其他答案,但我想我明天可以接受你的答案。解释如下: