Excel 为什么我的循环没有遍历所有的值?
我正在尝试让Excel vba宏工作。我使用的代码如下所示: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
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循环的上限,它进行得很顺利。我会等待其他答案,但我想我明天可以接受你的答案。解释如下: