Word вылетает при удалении Shape с VBA из заголовка - PullRequest
1 голос
/ 06 февраля 2012

(отказ от ответственности: я не программист VBA по роду занятий)

Прикрепленный к кнопкам на ленте, у меня есть код для переключения логотипа компании в документе Word. Одна кнопка для логотипа типа A, вторая кнопка для логотипа типа B и третья для отсутствия логотипа (логотип предварительно отпечатан на бумаге)

Сначала я удаляю логотип с помощью removeLogo, а затем добавляю запрошенный логотип с setLogoAt.

Первый щелчок кнопки в порядке (например, для логотипа типа A), логотип добавляется в заголовок документа. Когда я нажимаю другую кнопку (например, для логотипа типа B), происходит сбой Word (возможно, при удалении текущего логотипа)

Что не так с моим кодом (или менее вероятно: с 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

редактировать

Я прошел через мой код. Все хорошо, пока я не достигну линии shapteToDelete.Delete в removeLogo. Здесь Word сильно падает, даже при отладке. Я использую Word 2007 (и это требование)

edit2 Я очистил все макросы, все normals.dot, все шаблоны автозагрузки, затем создал новый документ с двумя вышеуказанными процедурами и этим методом теста:

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

Когда я запускаю test, он падает в removeLogo в shapeToDelete.Delete.

Редактировать 3 Я «решил» проблему, сначала заставив верхние и нижние колонтитулы просматривать активное представление в Word, затем удалив Shape и затем вернувшись к обычному представлению. Очень странно. Это работает, но как программист, я не счастлив.

Ответы [ 3 ]

1 голос
/ 22 февраля 2012

Другое потенциальное решение - сначала попытаться выбрать фигуру, а затем удалить выделение:

shapeToDelete.Select Selection.Delete

Возможно, вы захотите отключить обновление экрана, если это работаетиначе вы будете мигать, когда Word перемещается по документу.

0 голосов
/ 23 января 2013

Это работает: У меня есть только 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
0 голосов
/ 22 февраля 2012

Я сталкивался с этой проблемой раньше и обычно с ошибкой автоматизации: «вызванный объект отключился от своих клиентов». Я еще не нашел решение.

Однако хороший обходной путь - это скрыть фигуру, а не удалить ее.

Итак:

shapeToDelete.Visible = False

...