问题描述
因此,这可能比编码更像是一个数学问题,但希望您仍然可以提供帮助。基本上,我希望Excel计算逐渐变大的分数列表,例如1/265 + 1/264 + 1/263 + ..... 1 / n其中n是do while循环中的最终数字。
但是,每次我运行此宏时,我只会得到0反馈给我。我弄乱了所有数字,并意识到,如果我将分数从1/50开始,它将起作用,但是任何较小的分数,即使是1/51,无论它将产生0,都将变为零。看来,当小数变为小VBA时,只会将其识别为零并拒绝使用它。这是其他任何人都熟悉的东西吗?还是对系统的限制?
如果有人要测试它,我在下面列出了一些数字,可以用来代替r以及最终输出应该是什么(仅供参考,该公式绝对正确)。
r;答案(四舍五入):
46; 50
99; 124
156; 235
Sub DoWhile()
Dim i As Integer
i = 6
do while Cells(i,5).Value <> ""
Dim r As Variant
r = Cells(i,5).Value
Dim a As Integer
a = 265
Dim z As Integer
z = 0
Dim x As Integer
x = a
do while (x >= (a - r + 1))
z = z + (1 / x)
x = x - 1
Loop
Cells(i,6).Value = (z) * (a)
i = i + 1
Loop
End Sub
解决方法
您实际上并不需要VBA。
E6: Your "counter",eg `46`
Excel O365:
=SUM(1/SEQUENCE(E6,265,-1))*265
早期版本:
=SUMPRODUCT(1/ROW(INDEX($A:$A,265):INDEX($A:$A,265-E6+1)))*265
,
@FunThomas在评论中提到:
Integer
是 Integer ,这意味着它们不包含余数。z = z + (1 / x)
始终为零,因为当您没有余数时,1 / x
为零。更改为数据类型Double
我需要将Integer
更改为Double
,并且效果很好。