ヘッダーからVBAでShapeを削除するとWordがクラッシュする

(免責事項:私は職業によってVBAプログラマーではない)

リボンのボタンに添付されている私はWord文書の会社のロゴを切り替えるコードがあります。 ロゴタイプAの1つのボタン、ロゴタイプBの2番目のボタン、ロゴなしの3番目のボタン(ロゴは紙にプレプリントされています)

最初に removeLogo でロゴを削除してから、 setLogoAt でリクエストされたロゴを追加します。

最初のボタンクリックは良好です(ロゴタイプAなど)。ロゴがドキュメントのヘッダーに追加されます。他のボタン(ロゴタイプBなど)をクリックすると、Wordがクラッシュする(おそらく現在のロゴを削除している)

私のコードで何が間違っているのですか?

Sub setLogoAt(left As Integer, path As String)
    Dim logoShape As Shape
    Dim anchorLocation As Range

    Dim headerShapes As Shapes
    Set logoShape = ActiveDocument.  'linebreks for readability
        .Sections(1)
        .Headers(wdHeaderFooterPrimary)
        .Shapes
        .AddPicture(FileName:=path, LinkToFile:=False,
                    SaveWithDocument:=True, left:=0, 
                    Top:=0, Width:=100, Height:=80)

    logoShape.name = "CompanyLogo"
    logoShape.RelativeHorizontalPosition = wdRelativeHorizontalPositionPage
    logoShape.RelativeVerticalPosition = wdRelativeVerticalPositionPage
    logoShape.Top = CentimetersToPoints(0.1)
    logoShape.left = CentimetersToPoints(left)

End Sub

Sub removeLogo()
    Dim headerShapes As Shapes
    Set headerShapes = ActiveDocument.Sections(1).Headers(wdHeaderFooterPrimary).Shapes
    Dim shapeToDelete As Shape

    If (headerShapes.Count > 0) Then
        If Not IsNull(headerShapes("CompanyLogo")) Then
            Set shapeToDelete = headerShapes("CompanyLogo")
        End If
    End If
    If Not (shapeToDelete Is Nothing) Then
      shapeToDelete.Delete
    End If

End Sub

編集

私は自分のコードを歩きました。 removeLogo の行 shapteToDelete.Delete に達するまでは問題ありません。ここでは、Wordは、たとえデバッグ中であってもハードにクラッシュします。私は Word 2007 を使用しています(それは要件です)

edit2 I cleared all macros, all normals.dot, all autoloading templates, then created a new document with the two routines above and this test method:

Sub test()
    setLogoAt 5, "C:\path\to\logo.jpg"
    removeLogo
    setLogoAt 6, "C:\path\to\logo.jpg"
End Sub

test を実行すると、 removeLogo shapeToDelete.Delete でクラッシュします。

Edit 3 I 'solved' the problem by first making the headers/footers view the active view in Word, then deleting the Shape and then returning to normal view. Very strange. It works but as a programmer I'm not happy.

1
すべてのあなたの努力をありがとう! Word 2007のインストールに本当に間違ったことがあるようです。テストしようとする他のインスタンスを見つけようとします。
追加された 著者 Dribbel,
あなたはここで興味深いものを持っています。私はあなたのテストコードを実行し、それは完全に最初の2回働いた後、3回目のWordをクラッシュし、それは次の14​​回完全に働いた。何かが続いていますが、一部のマシンではそれが繰り返せないようです。私はあなたに運がいい、すみません、私は貢献できないと願っています。
追加された 著者 Stewbob,
これらはどちらも、呼び出しの順序と回数にかかわらず、どちらもエラーなしで実行されます。彼らはうれしくロゴを追加したり削除したりします。あなたは明らかにこれらを呼び出す他のコードを持っています。おそらく、エラーがあるか、ボタンコード自体にあります。クラッシュする正確な箇所を特定するには、F8を使用してデバッグする必要があります。
追加された 著者 Doug Glancy,

3 答え

もう1つの潜在的な解決策は、形状を最初に選択してから選択を削除することです。

shapeToDelete.Select Selection.Delete

これが有効な場合は、画面の更新をオフにしたい場合があります。そうしないと、Wordがドキュメントを移動するときにフリッカーが発生します。

1
追加された

これは動作します:  私は2つのボックスしか隠すことができないので、これは一般的ではありません

Private Sub btnPrint_Click()
    Dim hdrShapes As Shapes
    Dim S As Shape
    Dim aTohide(2) As String
    Dim iNdx, i As Integer
    iNdx = 0

     ' Hide buttons and print
    Set hdrShapes = ActiveDocument.Sections(1).Headers(wdHeaderFooterPrimary).Shapes
    ' GET BUTTON NAMES (ACTUALLY TEXT BOXES
    For Each S In hdrShapes
        If S.Type = msoTextBox Then
            aTohide(iNdx) = S.Name
            iNdx = iNdx + 1
        End If
    Next
    ' now hide , use the arrays as the  for each statement crashes
    For i = 0 To 1
        hdrShapes(aTohide(i)).Visible = msoFalse
    Next
    ' print it
    With ActiveDocument
        .PrintOut
    End With
    ' and unhide the buttons
    For i = 0 To 1
        hdrShapes(aTohide(i)).Visible = msoTrue
    Next

    Set hdrShapes = Nothing
End Sub
1
追加された

私はこの問題を以前は経験していましたが、通常、オートメーションエラーが発生しました: "呼び出されたオブジェクトがクライアントから切断されました"。私はまだ解決策を見つけていない。

しかし、良い回避策は、形状を削除するのではなく隠すことです。

そう:

shapeToDelete.Visible = False

0
追加された