【问题标题】:How does a for cycle loops trough items, if you delete and add one item mid-loop?如果您在循环中删除并添加一个项目,for 循环如何循环遍历项目?
【发布时间】:2019-11-05 03:52:38
【问题描述】:

我想知道这个问题,在 2007 年这并没有像我预期的那样工作,而在 2016 年它确实如此。让我解释一下:

我有一个 for 循环

For i = ActiveDocument.Sections(1).Headers(1).Shapes.count To 1 Step -1

 if  ActiveDocument.Sections(1).Headers(1).Shapes(i) matches condition, then

ActiveDocument.Sections(1).Headers(1).Shapes(i).delete
set newshape = ActiveDocument.Sections(1).Headers(1).Shapes.Addpicture(new picture, bla, bla, bla..)

end if
next i

在这种情况下,循环是否会遇到新添加的形状,并循环通过它?还是会忽略它?

为了解决这个问题,我很难将 ActiveDocument.Sections(1).Headers(1).Shapes(i) 设置为对象,并在插入新对象后在循环内将其删除。

  • 但是如果我只是将要删除的那一项设置为不可见呢?插入的会在循环中处理吗?

我还考虑过将所有我想删除的形状集合在一起,然后在集合中循环以删除和添加新形状,以确保他不会循环插入中间的形状.

感谢您对此问题的任何见解

【问题讨论】:

  • 为什么不自己试试呢?如果遇到要解决的问题,请提出问题...
  • 我试过了,word 2007 和 word 2016 得到了不同的结果。
  • 反向循环不会遇到新添加的形状,但是如果您进入正向循环(因为新添加的形状将获得最高阶的索引),则可能会遇到一些最高阶的新形状环形。在 2007 年进行了实验,发现工作正常(仅在反向循环中)。在前向循环中,一些新添加的形状被替换,而旧形状保持不变。由于反向循环工作正常,似乎没有必要让它不可见。正如 Cindy Meister 所说,您可以自己尝试(可能没有条件)。
  • 请检查您是否在 2007 年从事前向循环工作。

标签: vba loops ms-word


【解决方案1】:

除了 Cindy 所说的之外,您的代码将更高效且更易于遵循:

With ActiveDocument.Sections(1).Headers(1)
  For i = .Shapes.Count To 1 Step -1
    If .Shapes(i) matches condition Then
      .Shapes(i).Delete
      Set newshape = .Shapes.AddPicture(new picture, bla, bla, bla)
    End If
  Next i
End With

【讨论】:

  • 设置“With”与问题无关。该代码适用于 word 2016,但我不确定我是否对被替换的图片感到幸运,因为在 word 2007 中它会跳过其中的一些。此外,不回答只是设置隐身。
  • 正如我一开始所说的:除了Cindy所说的
猜你喜欢
  • 2021-12-25
相关资源
最近更新 更多