【问题标题】:Conditional inside for loop affects loop variable incrementfor循环内的条件影响循环变量增量
【发布时间】:2021-02-16 00:46:25
【问题描述】:

问题:
在计算数字系列中的数字时,如何检测何时达到定义为单独索引数组的里程碑,如下所示:

Dim sects As Variant
sects = Array(0, 3, 9, 14, 26, 29)

Dim i, N As Integer
N = 30
For i = sects(0) To N
    Dim m As Integer
    m = 1
    For m = 1 To sects.Count
        MsgBox ("i, m = " + CStr(i) + "," + CStr(m))
        If i > sects(m) Then
            MsgBox ("i > sects(m) = " + CStr(i) + "," + CStr(sects(m)) + ", " + CStr(m))
        End If
    Next m
Next i

期望:
对于每个i,看到第一个消息框在第二个之前弹出几次。
内部循环应该循环直到m 命中sects.Count

观察:
使用上面的代码,内循环总是以 m 等于 1 结束。
内部循环只运行一次然后“中断”。请注意,不会调用显式中断(退出)。

解决方法:
删除 If 条件。
我尝试添加一个Else 子句来手动增加m,但行为没有变化。

问题:
我想我对 VBA 的循环和条件的工作方式有误解。
查阅教程后,我无法弄清楚。

【问题讨论】:

  • 该代码是如何运行的?我在 For 行上收到 424 错误。 VBA 数组没有 Count 属性 AFAIK。
  • @SJR 这很奇怪。我在 macOS 上的 PowerPoint 2016 中运行它
  • OK 可能有助于添加这些标签。
  • @SJR 我认为你是对的。问题是sects.Count。我一定用过它,因为其他一些对象有一个 Count 属性。但是运行代码时没有引发编译器错误!
  • >> 代码运行时没有编译器问题。 Option Explicit 添加到您的代码模块(实际上是每个 代码模块)的顶部;然后重新编译。它会突出显示很多错误

标签: vba loops conditional-statements


【解决方案1】:

不确定您要做什么,但这似乎更像您所追求的:

Dim sects As Variant, i As Integer, N As Integer, m As Integer

sects = Array(0, 3, 9, 14, 26, 29)
N = 30
For i = 1 To N
  For m = 0 To UBound(sects)
    MsgBox "i, m = " & i & ", " & m
    If i > sects(m) Then
      MsgBox "i > sects(m) = " & i & ", " & sects(m) & ", " & m
    End If
  Next m
Next i

【讨论】:

    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 2017-03-22
    • 2018-12-25
    • 2016-12-14
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2019-06-25
    相关资源
    最近更新 更多