줄의 시작을 정확히 결정한 방법을 사용하십시오. 끝은 Selection
+1의 마지막 문자 인 Information(wdHorizontalPositionRelativeToPage)
입니다. 여기에 전체 코드가 나와 있습니다.
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을 나타냄). 그런 다음 선행하는 문자에 동일한 규칙을 적용하여 선택에서 문자를 제거했습니다. 이것이 충분하거나 너무 많은 경우 자체 테스트를 실행하십시오. 128 자 이상의 공격적인 캐릭터가 많이 있습니다.
코드는 마지막 문자의 크기를 취해 높이를 수직 위치에 추가합니다. 선택한 텍스트 아래에 선을 배치하는 것입니다. 텍스트와 라인 사이에 약간의 공간을두기 위해 2 포인트를 더했습니다.
Word는 이전에 공간을 기록합니다. 선택 사항에 여러 단락이 포함될 수 있습니다. 내 코드는 마지막 문자가 멤버 인 단락 만 봅니다. Word는 단락의 형식에 SpaceBefore
이 있으면 줄 간격을 약 3 줄으로 줄이는 것처럼 보입니다.이 크기는 공간의 크기와 거의 관계가 없습니다. 그러나 공간이 3pt보다 작 으면 줄은 상대적으로 적게 낮아질 것입니다. 이 시험은이 코드를 이끌어 냈습니다.
ParaSpace = 2 - Rng.Paragraphs(1).SpaceBefore
If ParaSpace < -3 Then ParaSpace = -3
줄을 더 정확하게 배치하려면이 코드를 수정하는 것이 좋습니다. 수직 위치는 선택 + FondtSize + ParaSpacing의 위치로 구성됩니다.
위의 코드는 모두 실제 행을 만드는 다른 하위에 공급되는 매개 변수를 만듭니다. 매개 변수에는 선 너비가 포함되고 Activedocument를 대상으로 설정하고 행에 이름을 지정하십시오. 동일한 이름을 반복해서 지정할 수도 있습니다. Word는 additon에서 자체 이름을 사용하며 고유합니다. 여기에 선을 삽입하는 코드가 있습니다. 당신은 더 나은 이러한 변경하실 수 있습니다 등
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
을 (당신은 그것을 Private
을하는 것이 좋습니다) 요구 사항을 충족하십시오.
좋아요. bpos = Int (Selection.Information (wdHorizontalPositionRelativeToPage)) 및 Set aLine = ActiveDocument.Shapes.AddLine (26, apos + bpos, 26, bpos)과 같은 것입니다. 내가 뭘 놓치고 있니? – danjedi
'bpos'를'Selection'의 첫 번째 문자로 설정하는 반면 마지막 문자 다음에 설정해야합니다. 그래서, 'n = Selection.Range.End + 1'' Set Rng = Range (n, n)과'bpos = Int (Rng.Information (wdHorizontalPositionRelativeToPage))' – Variatus
"bpos "선택한 범위의 끝에. 런타임 오류가 발생했습니다 "Set Rng = Range (n, n) – danjedi