Word VBA添加行的选择长度

时间:2017-05-06 20:57:27

标签: word-vba

我想编写一个Word VBA宏,用于插入所选文本长度的垂直线。

@Component

但是该代码添加了" 40"的垂直行长度。 如何调整长度" 40"是所选文本的长度? 谢谢

1 个答案:

答案 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

此代码包含许多参数,这些参数不会通过其收到的参数进行变量,例如LockAnchorZOrder等。您可能希望更改这些参数以更好地满足您的要求。< / p>