【问题标题】:VBA Excel - Distributing numberVBA Excel - 分配号码
【发布时间】:2015-11-04 21:24:29
【问题描述】:

所以我想遍历一系列单元格并添加 1 直到工作总数(本例中为 500)耗尽,所以基本上它在每个单元格中添加 1 直到它加起来达到 500。但是每次我运行这个代码,实际金额不足(本例中为 473)。我知道这是非常基础的,但我有一个非常基础的大脑。是否与 for 循环完成 500 次有关,但与 for each 循环无关?这是一些非常糟糕的代码:

Sub dividerloop()

Dim rngAmount As Range
Dim c As Range
Dim worktotal As Range
Dim i As Long

Set rngAmount = Sheet1.Range("E4:E21")
Set worktotal = Sheet1.Range("G2")

'set loop from 1 to work total
'set loop between cells
For i = 1 To worktotal.Value
    If i < worktotal.Value Then
        For Each c In rngAmount
'add 1 to each cell and increment i by 1
            If i < worktotal.Value Then
                c.Value = c.Value + 1
                i = i + 1
            Else
                Exit For
            End If
        Next c
    Else
    End If
Next
End Sub

这是电子表格的图片:

谢谢大家!

【问题讨论】:

    标签: vba loops for-loop


    【解决方案1】:

    发生这种情况是因为您每次填充每个单元格时都会跳过 i 的一次迭代。看到 500 / 18 实际上是 27 楼,这就是您损失的工作总数。

    为避免此问题,对于每个单元格,您应该只为在第一个单元格之后分配的每个值增加 i。例如,您可以将内部 For Each 循环替换为:

    For r = 1 To rngAmount.Cells.Count
        Set c = rngAmount.Cells(r)
    
        If i < worktotal.Value Then
            c.Value = c.Value + 1
            If r > 1 Then i = i + 1
        Else
            Exit For
        End If
    Next r
    

    编辑:这是一个更简单、更易读的循环。它应该替换你的主循环。

    i = worktotal.Value
    
    While (i > 0)
        For Each c In rngAmount
            c.Value = c.Value + 1
    
            If i > 0 Then i = i - 1
            If i = 0 Then Exit For
        Next
    Wend
    

    【讨论】:

    • 感谢 DanL,第二个循环真的很好地解释了它,现在我明白了。现在正在运行,非常感谢您的帮助!
    • 太棒了!如果它解决了您的问题,请标记为答案:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 2017-10-31
    相关资源
    最近更新 更多