Word VBA 刪除所有圖形

codemee - Sep 18 - - Dev Community

因為工作的需要, 所以問了 Claude 如何使用 VBA 刪除文件內所有的圖形, 於是得到了這樣的解法:

Sub 移除繪圖物件()
    Dim shp As shape

    For Each shp In ActiveDocument.Shapes
        shp.Delete
    Next shp

    MsgBox "所有圖形物件已被刪除。", vbInformation
End Sub
Enter fullscreen mode Exit fullscreen mode

實際運作的確可以刪除所有的圖形, 只是有個想問題, 我得重複執行好幾次才能刪掉所有的圖形, 再次詢問 Clause, 它以為我是沒有刪除 InlineShapes 集合的圖形。改問 Microsoft Copilot 後, 提醒了我, 因為這個集合是動態的, 上述解法會導致集合內的項目數量變化, 原本要取出的下一個項目的索引值變了, 例如本來在索引位置 2 的項目, 因為索引位置 1 的項目被刪除了, 現在變成索引 1, 如果還是取索引項目 2 的項目, 就會是最開始索引項目 3 的項目, 遺漏了本來要取出的項目:

index  1  2  3
     |20| 7|45|
      -- -- --

刪除 20 後:

index  1  2  3
     | 7|45|
      -- -- --
Enter fullscreen mode Exit fullscreen mode

應該要直接以倒序的方法使用索引取值的方式刪除才不會有問題:

Sub 移除繪圖物件()
    For i = ActiveDocument.Shapes.Count To 1 Step -1
        ActiveDocument.Shapes(i).Delete
    Next i

    MsgBox "所有圖形物件已被刪除。", vbInformation
End Sub
Enter fullscreen mode Exit fullscreen mode
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terabox Video Player