0

Word 2013 を使用していくつかのオブジェクトを生成し、新しい世代の前にそれらを削除しています。ただし、そのような場合に Word がクラッシュすることがあり、すべての VBA コードが削除されます。生成されたオブジェクトを追加するためのコードは次のとおりです。

For i = 1 To nodes
   Set arrShapes(j) = docNew.Shapes.AddShape(MsoAutoShapeType.msoShapeDiamond, arrRawPoints(i, 1) - 2, arrRawPoints(i, 2) - 2, 4, 4)
   arrShapes(j).title = "A" + Str(j) + "d"
   arrShapes(j).Fill.ForeColor.RGB = RGB(255, 0, 0)
   j = j + 1
Next i

削除コードは次のとおりです。

For Each sp In arrShapes
  If Not (sp Is Nothing or IsEmpty(sp)) Then
    tl = Left(sp.title, 1)
    If tl = "A" Then
        tl = Mid(sp.title, 2, Len(sp.title) - 2)
        nr = Int(tl)
        sp.Delete
        Set arrShapes(nr) = Nothing
    End If
  End If
Next sp

クラッシュすることもありますが、このルーチンを50回以上呼び出すと問題なく動作します。ユーザーがそのような生成されたオブジェクトを手動で削除すると、クラッシュが発生します。理由を見つけるために、For Each ループ内の 1 行目にブレークポイントを設定しましたが、毎回 Word がクラッシュします。この概念の何が問題になっていますか?

4

1 に答える 1

0

解決策は非常に明白だと思います-削除するときは、最後のアイテムから最初のアイテムにループする必要があるため、別の種類のループに切り替える必要があります。(2 番目の) コードは次のようになります。

For i=arrShapes.Count to 1 step -1
   'you dont need if statement here
   tl = Left(arrShapes.Item(i).Title, 1)
   if tl = "A" then
    tl = Mid(arrShapes.Item(i).Title, 2, Len(arrShapes.Item(i).Title) - 2)
    'rather dont' need it any more: nr = Int(tl)
    arrShapes.Item(i).Delete
    'rather dont' need it any more: Set arrShapes(nr) = Nothing
   end if
Next i

未検証!コードのすべてが明確であるとは限らないため、多少の調整が必要になる場合があります。

于 2013-12-04T12:12:08.877 に答える