【问题标题】:Shape picture goes to unexpected position, even with correct .top and .left values - Word VBA即使使用正确的 .top 和 .left 值,形状图片也会出现意外位置 - Word VBA
【发布时间】:2019-11-03 16:10:43
【问题描述】:

问题是,我正在创建一个新的形状图片来替换以前的图片。 然而,即使新的形状属性 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, 寻找相对位置属性、锚对象属性,与要删除的形状和新形状相比,一切似乎都是一样的,除非我(很可能)缺少一个属性。

我还尝试创建一个宏并查看将新形状更改为位置的代码,但不幸的是,在创建宏字时不能很好地处理图片..

我发现的唯一提示是这个,但要以编程方式更改它,我不知道如何。

更新:

m4o_tim 给出答案后,word 显示的选项更准确,但最终文档上的距离仍然不正确

我也对 lock anchor 感到好奇并允许重叠,但这肯定隐藏在 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)

我会得到不同的值。我将对此提出一个新问题。谢谢大家。

【问题讨论】:

  • Anchor 属性是一个 Range,用于标识形状锚定到的标题中的段落。 Information 属性提供有关该范围而不是形状的信息。请参阅下面我的答案中的编辑代码以设置锚点。
  • 但是锚不是形状的属性吗?如果是那个锚的属性,也是形状的属性,对吗?还有,我相信range是前一个元素所有属性的总和,比如Anchor.Range,就是Anchor所有属性的集合。我错了吗?
  • 不管我在发布后仅 10 分钟就尝试了 shp2del.anchor,它按预期工作:) 但我很不明白为什么不能使用 anchor.information 来定义我的确切位置想要相对于页面的图片。
  • 是的,锚点是形状的一个属性,但只是因为它指的是形状锚定到的段落。它是一个单独的对象,具有自己的属性,但与形状有关系。信息是范围的属性,并且是只读的,因此不能用于设置任何内容。此外,由于图片的换行格式不是“内联”,因此它的位置可能与段落的位置不同,这就是您获得不同值的原因。
  • 把它想象成树上的苹果。两个不同但相关的对象,每个对象都有自己的属性。如果您可以绘制它们的位置,它们也可能会有所不同。

标签: vba image ms-word


【解决方案1】:

添加新形状时,您没有指定相对位置,因此 Word 应用其默认值,相对于列和段落。

当您在对象模型中遇到不熟悉的事物时,请尝试使用对象浏览器和在线帮助文​​档。

你的代码应该是这样的:

编辑:包括从旧图像设置锚点

'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

【讨论】:

  • 谢谢,它几乎成功了,但我认为这涉及到一些缩放。设置的距离不同。我会用新发现更新问题。
猜你喜欢
  • 2021-06-06
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 2016-12-26
  • 2022-01-15
相关资源
最近更新 更多