【发布时间】: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 来定义我的确切位置想要相对于页面的图片。
-
是的,锚点是形状的一个属性,但只是因为它指的是形状锚定到的段落。它是一个单独的对象,具有自己的属性,但与形状有关系。信息是范围的属性,并且是只读的,因此不能用于设置任何内容。此外,由于图片的换行格式不是“内联”,因此它的位置可能与段落的位置不同,这就是您获得不同值的原因。
-
把它想象成树上的苹果。两个不同但相关的对象,每个对象都有自己的属性。如果您可以绘制它们的位置,它们也可能会有所不同。