我想编写一个Word VBA宏,用于插入所选文本长度的垂直线。
@Component
但是该代码添加了" 40"的垂直行长度。 如何调整长度" 40"是所选文本的长度? 谢谢
答案 0 :(得分:1)
使用与确定线条开头的方法完全相同的方法。结尾位于Information(wdHorizontalPositionRelativeToPage)
+ 1中最后一个字符的Selection
处。这是完整的代码。
Private Sub LineUnderSelection()
' 08 May 2017
Dim Rng As Range
Dim FontHeight As Single, ParaSpace As Single
Dim LineStart As Single, LineEnd As Single
With Selection
With .Range
Do While Asc(.Text) < 48
' remove excluded characters at start
.MoveEnd wdCharacter, 1
Loop
Do While Asc(Right(.Text, 1)) < 48
' remove excluded characters at end
.MoveEnd wdCharacter, -1
Loop
LineStart = .Information(wdHorizontalPositionRelativeToPage)
Set Rng = Selection.Range
Rng.SetRange .End, .End
FontHeight = Int(Rng.Font.Size)
ParaSpace = 2 - Rng.Paragraphs(1).SpaceBefore
If ParaSpace < -3 Then ParaSpace = -3
LineEnd = Rng.Information(wdHorizontalPositionRelativeToPage)
SetLine ActiveDocument, "Underscore", LineStart, LineEnd - LineStart, _
.Information(wdVerticalPositionRelativeToPage) _
+ FontHeight + ParaSpace, 1.5, vbRed
End With
End With
End Sub
如你所见,我发现不需要额外的角色。 Word会自动将该行延伸到字符的末尾。在找到这个的过程中,我还发现Word不喜欢强调返回。因此,代码会排除ASCII码小于48的所有字符(表示字符1)。然后我将相同的规则应用于前导字符,同样从选择中删除它们。如果这个测试足够或太多,请运行您自己的测试。有很多字符带代码&gt; 128这可能是令人反感的。
代码采用最后一个字符的大小,并将其高度添加到垂直位置。这是将行放在所选文本下面而不是它上面。我添加了2个点,以便在文本和行之间保留一点空间。
Word之前记录了空间。您的选择可能包含几个段落。我的代码只查看最后一个字符所属的段落。如果段落的格式中有SpaceBefore
,Word似乎会将该行放置约3个点,几乎与该空间的大小无关。但是如果空间小于3pt,则线路将相应地降低。这次考试导致了这段代码。
ParaSpace = 2 - Rng.Paragraphs(1).SpaceBefore
If ParaSpace < -3 Then ParaSpace = -3
您可能希望修改此代码以更精确地放置线条。您将看到垂直位置由选择+ FondtSize + ParaSpacing的位置组成。
以上所有代码都会创建参数,这些参数被输入到创建实际行的另一个子节点。观察参数包括线宽并将Activedocument设置为目标并为该行指定名称。可以重复使用相同的名称。 Word将在additon中使用自己的名称,它们是唯一的。这是插入行的代码。 (您可能更愿意将其Private
)
Function SetLine(Story As Object, _
Lname As String, _
Lleft As Single, _
Llength As Single, _
Ltop As Single, _
Lwidth As Single, _
Lcol As Long) As Shape
' 20 Aug 2016
Dim Fun As Shape
Set Fun = Story.Shapes.AddLine(Lleft, Ltop, Lleft + Llength, Ltop)
With Fun
.Title = Lname
.Name = Lname
.LockAspectRatio = msoTrue
With .Line
.Weight = Lwidth
.ForeColor = Lcol
End With
.RelativeHorizontalPosition = wdRelativeHorizontalPositionPage
.RelativeVerticalPosition = wdRelativeVerticalPositionPage
.Visible = msoTrue
.WrapFormat.AllowOverlap = msoTrue
.LayoutInCell = msoFalse
.ZOrder msoSendBehindText
.LockAnchor = msoTrue
End With
Set SetLine = Fun
End Function
此代码包含许多参数,这些参数不会通过其收到的参数进行变量,例如LockAnchor
,ZOrder
等。您可能希望更改这些参数以更好地满足您的要求。< / p>