【问题标题】:VBA: Second loop overwriting first loopVBA:第二个循环覆盖第一个循环
【发布时间】:2013-12-31 16:01:03
【问题描述】:

关于 Excel 中的 VBA 的快速且我认为相对简单的问题。我正在编写我的第一个嵌套循环,并且遇到了第二个增量覆盖第一个增量的问题。代码如下:

Sub RandNumRang()
Dim i As Integer, Row As Integer, Col As Integer
Dim j As Integer
Dim LastRow As Long
Dim NoRows As Integer
Dim MinNum As Double, MaxNum As Double
Dim NumFormula As String
Col = 1 'Write random numbers on Column A
'Get the range and number of random values needed
For j = 3 To 4
    NoRows = ActiveSheet.Range("G" & j).Value 'No of random values needed
    MinNum = ActiveSheet.Range("E" & j).Value 'Min Range
    MaxNum = ActiveSheet.Range("F" & j).Value 'Max Range
    NumFormula = "=RANDBETWEEN(" & MinNum & "," & MaxNum & ")" 'Generate between Range
    i = 0
    For Row = 2 To NoRows + 1
    i = i + 1
        ActiveSheet.Cells(Row, Col).Value = i 'ID
        ActiveSheet.Cells(Row, Col + 1).Formula = NumFormula 'Random Value
        ActiveSheet.Cells(Row, Col + 2).FormulaR1C1 = "=TIME(0,0,RC[-1])" 'Convert to time
    Next Row
Next j
End Sub

我正在尝试生成一组随机时间间隔。除了我的值被覆盖之外,代码完全符合我的要求。 j 循环最终将有超过 2 个增量,但无论如何此代码都会有相同的覆盖问题。我很确定这与我指定有关

For Row=2 To NoRows + 1 

作为嵌套循环的起点,但这是我第一次运行 VBA 脚本,我想我会伸出援手,因为我尝试的每个修复都失败了。提前致谢,如果您需要更多详细信息,请告诉我。

另外,我附上了一张工作表的截图供参考:

【问题讨论】:

  • 在你的例子中,你是说你想要基于 min = 1 和 max = 40 的 30 个随机时间,然后基于 min = 41 和 max = 80 的另外 25 个随机时间?所以你应该在 A 列中有 55 个ID 值?
  • 正确。请注意,目前前 25 个“ID”的值介于 41-80 之间,而后 5 个的值介于 1-40 之间。这是发生覆盖的地方。

标签: loops excel vba


【解决方案1】:

据我所知,它的表现符合预期。你设置:

 Col = 1

这对于两个循环保持不变。那么你有:

For Row = 2 To NoRows + 1

所以在你的第二个循环中,你总是要从第 2 行第 1 列开始,所以它总是会被覆盖。

您要么需要在第二次迭代中将 Col 设置为 4(或 5),要么跟踪您在行中的位置并追加到末尾,

【讨论】:

  • 我想追加到末尾,因为最终输出中的迭代次数将大于 2。我选择 2 次迭代作为示例来测试它。在第一次迭代后,我试图通过在 A 列中查找第一个空单元格来执行此操作,但我没有运气。你能提供这个语法吗?
  • 太快了!感谢您对此进行调查。
【解决方案2】:

这适用于您的示例:

Sub RandNumRang()
Dim Row As Integer, Col As Integer
Dim j As Integer
Dim LastRow As Long
Dim NoRows As Integer
Dim MinNum As Double, MaxNum As Double
Dim NumFormula As String
Col = 1
Row = 2

For j = 3 To 4
    NoRows = Range("G" & j).Value
    MinNum = Range("E" & j).Value
    MaxNum = Range("F" & j).Value
    NumFormula = "=RANDBETWEEN(" & MinNum & "," & MaxNum & ")"

    For Row = Row To (Row + NoRows - 1)
        Cells(Row, Col).Value = Row - 1
        Cells(Row, Col + 1).Formula = NumFormula 'Random Value
        Cells(Row, Col + 2).FormulaR1C1 = "=TIME(0,0,RC[-1])" 'Convert to time
    Next Row
Next j
End Sub

【讨论】:

  • 完美!我很感激。
猜你喜欢
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 2017-06-22
  • 2013-08-04
  • 2021-05-26
  • 1970-01-01
  • 2014-08-28
  • 1970-01-01
相关资源
最近更新 更多