2

我正在尝试清理我办公室使用的一些 Word 宏。宏删除水印,保存 Word 文档并打印。

我遇到的问题是我编写的宏不会遍历所有文档。如果我有 5 个打开的文档,它只会 3 次。这让我疯狂。

这是有问题的代码。为什么不从 5 倒数到 1 呢?3点后停止。

    Sub Test()
     For Each doc In Documents
      MsgBox Documents.Count
      doc.Close SaveChanges:=wdDoNotSaveChanges
     Next doc
    End Sub
4

2 回答 2

3

您的文档在循环Documents期间关闭和移除时会消失。For Each

您想要遍历整个组,而不是从头开始。在删除项目时使用For Each会导致一些项目被过早地删除,这将始终导致问题,并且很难从代码的角度了解发生了什么。

为了解决这个问题,我通常会向后迭代,例如:

Sub Test()
    Set mydocs = Documents
    Debug.Print mydocs.Count

    For i = mydocs.Count To 1 Step -1
        Debug.Print Documents.Count
        mydocs(i).Close SaveChanges:=wdDoNotSaveChanges

    Next i

End Sub

从编程的角度来看,这样做的好处是更清楚正在发生的事情。

于 2013-09-10T17:33:05.690 回答
0

更简单的方法:

Sub CloseAll()
  Do Until Documents.Count = 0
    Debug.Print Documents.Count
    Documents(1).Close SaveChanges:=wdDoNotSaveChanges
  Loop
End Sub
于 2014-01-19T14:58:49.920 回答