(отказ от ответственности: я не программист 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 и затем вернувшись к обычному представлению. Очень странно. Это работает, но как программист, я не счастлив.