Изображение формы переходит в неожиданное положение, даже с правильными значениями .top и .left - Word VBA - PullRequest
2 голосов
/ 20 июня 2019

Проблема в том, что я создаю новое изображение формы, чтобы заменить предыдущее.Однако даже если новые свойства формы Top и Left точно такие же, как на предыдущем изображении, новая фигура смещается.Это происходит в форме заголовка.Я считаю, что есть какое-то скрытое свойство, которое я не могу найти на часах VBA.

Я добавляю код следующим образом (упрощенная версия):

For i = ActiveDocument.Sections(1).Headers(1).Shapes.count To 1 Step -1

'shape to delete:
    set shp2del = ActiveDocument.Sections(1).Headers(1).Shapes(i)
'shape to add
Set shp2 = ActiveDocument.Sections(1).Headers(1).Shapes.AddPicture(replace_path, False, True, shp2del.Left, shp2del.Top, shp2del.width, shp2del.height)

shp2del.delete

next i

Ивуаля, он создает объект shp2, удаляет shp2del .. с небольшой проблемой, в некоторых документах он не остается в позиции.

Я пробовал много вещей, переопределяя shp2.top и shp2.left после созданияискал свойства относительного положения, свойства объекта привязки по сравнению с формой для удаления и новой формой, и все казалось одинаковым, если только я (скорее всего) не пропустил свойство.

Я также пыталсясоздайте макрос и посмотрите код, который изменит новую форму в положение, но, к сожалению, при создании слова макроса не очень хорошо обрабатывать картинки ..

Единственный совет, который я нашел, был этот, ночтобы изменить это программно, я не знаю, как.

old shape on left, new shape on right Обновление:

После ответа от m4o_tim варианты, которые отображает слово, более соответствуютВ итоговом документе все еще остаются неверные расстояния

old shape on left, new one on right

Мне также любопытно, что якорь замка и разрешает перекрытие, но это наверняка скрытов shp2.anchor, и я попробую это.

Что касается абсолютной позиции, я не смог найти свойство, которое мог бы установить.Спасибо за помощь, m4o_tim, есть кто-нибудь еще, кто может помочь?

Обновление 2: Наконец-то все работает, в основном нужно переопределить верхнюю и левую позиции после настроек

                        With newshp
                        .WrapFormat.Type = oldshp.WrapFormat.Type
                        .RelativeHorizontalPosition = oldshp.RelativeHorizontalPosition
                        .LeftRelative = oldshp.LeftRelative
                        .RelativeVerticalPosition = oldshp.RelativeVerticalPosition
                        .TopRelative = oldshp.TopRelative
                        .Top = oldshp.Top
                        .Left = oldshp.Left
                        .LockAnchor = oldshp.LockAnchor
                        End With

После этого он работал отлично.Спасибо m4o_tim

Обновление 3: я понял, что это, к счастью, сработало только в одном разделе.Причиной для этого является позиция привязки.

Если я сравню shp2del.Anchor.Information (wdVerticalPositionRelativeToPage) с shp2.Anchor.Information (wdVerticalPositionRelativeToPage)

Я получу разные значения.Я открою новый вопрос по этому поводу.Спасибо всем.

1 Ответ

2 голосов
/ 21 июня 2019

При добавлении новой фигуры вы не указали относительную позицию, поэтому Word применяет ее по умолчанию относительно столбца и абзаца.

Когда вы сталкиваетесь с вещами в объектной модели, с которыми вы не знакомы, попробуйте использовать Object Browser и интерактивную справочную документацию.

Ваш код должен выглядеть примерно так:

Редактировать: Включена настройка привязки из старого изображения

'shape to add
Set shp2 = ActiveDocument.Sections(1).Headers(1).Shapes.AddPicture(replace_path, False, True, , , shp2del.width, shp2del.height, shp2del.Anchor)
With shp2
    .WrapFormat.Type = shp2del.WrapFormat.Type
    .RelativeHorizontalPosition = shp2del.RelativeHorizontalPosition
    .Left = shp2del.Left
    .RelativeVerticalPosition = shp2del.RelativeVerticalPosition
    .Top = shp2del.Top
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...