Выравнивание изображения нижнего колонтитула в VBA - PullRequest
1 голос
/ 06 октября 2019

Я пытаюсь поставить подпись в нижнем колонтитуле текстового документа, но не могу выровнять его в правом нижнем углу нижнего колонтитула.

Кроме того, в моем нижнем колонтитуле есть строка текста (т.е. моя компания Inc), и подпись должна быть точно над текстом, как на скриншоте:

enter image description here

Любая помощь, пожалуйста?

Мой код, который работает за исключением позиционирования:


Sub Macro1()

Dim SHP as String


FIRMADOC = "C:\Users\user\Pictures\1.png"


    If ActiveWindow.View.SplitSpecial <> wdPaneNone Then
        ActiveWindow.Panes(2).Close
    End If

    If ActiveWindow.ActivePane.View.Type = wdNormalView Or ActiveWindow. _
        ActivePane.View.Type = wdOutlineView Then
        ActiveWindow.ActivePane.View.Type = wdPrintView
    End If


ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter

    Set SHP = Selection.InlineShapes.AddPicture(FileName:=FIRMADOC, LinkToFile:=False, SaveWithDocument:=True)
        With SHP
            'AJUSTA A "ENFRENTE DEL TEXTO"
            .ConvertToShape
            ' MANTIENE EL RATIO
            .LockAspectRatio = msoTrue
            'AJUSTA A ANCHO 1 inch
            .Width = InchesToPoints(1)
    '        .Alignment = ' need this code for bottom-right, PLEASE

        End With
   ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
End sub

1 Ответ

0 голосов
/ 07 октября 2019

Поскольку Shape объекты «плавают» на странице, их можно легко позиционировать. Они также могут быть легко (и случайно) перемещены. Shape объекты также могут быть сложны для использования кода. Итак, полезное практическое правило, которое я использую: если работает InlineShape, используйте его, а не Shape.

Ниже представлены три возможности;два для InlineShapes и один для Shape.

* InlineShape можно расположить по правому краю страницы, используя два разных метода (в зависимости от того, находится ли он один в абзаце).

  1. Выровнять по правому краю абзац, содержащий InlineShape. Это уместно, когда у абзаца нет другого содержания. Извлечение только кода из вопроса для обработки этого:
Dim SHP as InlineShape

Set SHP = Selection.InlineShapes.AddPicture(FileName:=FIRMADOC, _
                    LinkToFile:=False, SaveWithDocument:=True)
SHP.Range.ParagraphFormat.Alignment = wdAlignParagraphRight
Если у абзаца есть другое содержимое слева, то будет работать выравнивание по правому краю TAB с символом TAB, предшествующим InlineShape. A Нижний колонтитул по умолчанию имеет две позиции табуляции: одна выровнена по центру, вторая выровнена по правому краю.

Для этого я собираюсь изменить весь код в вопроседля того, чтобы оптимизировать работу в нижнем колонтитуле. (Тот же подход применяется к заголовку BTW). Макро-рекордер создает код, который имитирует действия пользователя, поэтому он фактически открывает нижний колонтитул (или заголовок), используя такие вещи, как ActiveWindow и Selection. Это довольно сложно точно контролировать;работа с реальными объектами Word более надежна.

Думайте о Range объекте как о невидимом выделении. Вся область нижнего колонтитула назначается диапазону (rng). Поскольку в нижнем колонтитуле уже есть содержимое (текст «Company Inc»), необходимо «свернуть» Range. (Думайте об этом, как о нажатии стрелки влево, чтобы новый контент не заменял выделение.)

Затем к нему добавляются два символа табуляции (rng.Text = vbTab & vbTab) и добавляется подпись.

Sub Macro1()
  Dim FIRMADOC as String
  Dim SHP as InlineShape
  Dim rng as Word.Range

  FIRMADOC = "C:\Users\user\Pictures\1.png"

  Set rng = ActiveDocument.Sections(1).Footers(wdHeaderFooterPrimary).Range 
  rng.Collapse wdCollapseStart 
  rng.Text = vbTab & vbTab 'position at second, right-aligned tab in the footer)  
  Set SHP = rng.InlineShapes.AddPicture(FileName:=FIRMADOC, LinkToFile:=False, SaveWithDocument:=True, Range:=rng)
  With SHP
    ' MANTIENE EL RATIO
    .LockAspectRatio = msoTrue
    'AJUSTA A ANCHO 1 inch
    .Width = InchesToPoints(1)
  End With
End sub
Если необходимо использовать объект Shape, то требуется сочетание свойств Left и RelativeHorizontalPosition. Члены перечислений wdShapePosition и WdRelativeHorizontalPosition задают эти специальные настройки.

Обратите внимание, что может также потребоваться включить свойство Top, чтобы получить правильную вертикальную позицию Shapeк тексту "Company, Inc".

Sub Macro1()
  Dim FIRMADOC as String
  Dim SHP as InlineShape
  Dim rng as Word.Range

  FIRMADOC = "C:\Users\user\Pictures\1.png"

  Set rng = ActiveDocument.Sections(1).Footers(wdHeaderFooterPrimary).Range  
  rng.Collapse wdCollapseStart
  Set SHP = rng.InlineShapes.AddPicture(FileName:=FIRMADOC, LinkToFile:=False, SaveWithDocument:=True, Range:=rng)
  Set SHP = SHP.ConvertToShape
  With SHP
    ' MANTIENE EL RATIO
    .LockAspectRatio = msoTrue
    'AJUSTA A ANCHO 1 inch
    .Width = InchesToPoints(1)
    .Left = wdShapeRight '-999996
    .RelativeHorizontalPosition = wdRelativeHorizontalPositionMargin '0
  End With
End sub
...