Как цикл for проходит через элементы, если вы удаляете и добавляете один элемент в середине цикла? - PullRequest
0 голосов
/ 22 июня 2019

Я задавался вопросом об этом, на слове 2007 это не сработало, как я ожидал, а на слове 2016 это сработало. Дай мне объяснить:

У меня есть цикл

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) как объект и удалил его внутри цикла после вставки нового.

  • Но что, если я просто установлю тот, который вместо этого хочу удалить, невидимым? Вставленный будет обработан в цикле?

Я также подумал о том, чтобы создать коллекцию всех фигур, которые я хотел удалить, а затем зациклить внутри коллекции, чтобы удалить и добавить новые формы, чтобы убедиться, что он не будет зацикливаться на фигуре, вставленной в ее середину. .

Спасибо за любые идеи по этому вопросу

1 Ответ

0 голосов
/ 23 июня 2019

В дополнение к тому, что сказала Синди, ваш код будет более эффективным и будет легче следовать:

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
...