我正在以编程方式填写一个受规制的表格模板,其中预定义了行(作为表格单元格): (使用纯文本内容控件作为占位符,但这与当前问题无关。)
因此,我必须手动将长文本分成多行(自动添加行或其他操作不是选项,因为分页符也是预定义的。)
现在,由于字符具有不同的宽度,我不能仅设置一些硬编码字符限制来突破(或者,我可以,并且这就是我现在正在做的,但是事实证明,这是效率低下且不可靠的) )。所以:
如何检查文本范围是否适合单行-如果不适合,则适合多少行?
我已经签出Range Members (Word),但看不到任何相关内容。
答案 0 :(得分:1)
唯一的方法是.Select
文本,它们操纵选择。 Selection
是唯一可以使用wdLine
作为边界的对象。 Word对象模型中的其他所有内容都无法使用自动换行符。
Sub GetFirstLineOfRange(RangeToCheck As Range, FirstLineRange As Range)
'Otherwise, Word doesn't always insert automatic line breaks
'and all the text will programmatically look like it's on a single line
If Not Application.Visible Or Not Application.ScreenUpdating Then
Application.ScreenRefresh
End If
Dim SelectionRange As Range
Set SelectionRange = Selection.Range
Set FirstLineRange = RangeToCheck
FirstLineRange.Select
Selection.Collapse Direction:=wdCollapseStart
Selection.EndOf Unit:=wdLine, Extend:=wdExtend
Set FirstLineRange = Selection.Range
If FirstLineRange.End > RangeToCheck.End Then
FirstLineRange.End = RangeToCheck.End
End If
SelectionRange.Select
End Sub
Function IsRangeOnOneLine(RangeToCheck As Range) As Boolean
Dim FirstLineRange As Range
GetFirstLineOfRange RangeToCheck, FirstLineRange
IsRangeOnOneLine = FirstLineRange.End >= RangeToCheck.End
End Function
子例程GetFirstLineOfRange
接受RangeToCheck
并将FirstLineRange
设置为给定范围内的第一行文本。
函数IsRangeOnOneLine
接受RangeToCheck
并返回True
(如果范围适合一行文本),否则返回False
。该函数的工作方式是获取给定范围内的第一行文本,并检查其是否包含该范围。
需要Selection
中的GetFirstLineOfRange
的操作,因为子例程要将范围的末尾移动到行的末尾,并且移动单位wdLine
仅可用与Selection
。该子例程保存并恢复当前的Selection
;如果不需要这样做,则可以删除临时变量SelectionRange
和关联的语句。
注意:
答案 1 :(得分:1)
无需滚动任何内容-无论如何都不可靠。尝试根据以下方法进行尝试:
With Selection
If .Characters.First.Information(wdVerticalPositionRelativeToPage) = _
.Characters.Last.Information(wdVerticalPositionRelativeToPage) Then
MsgBox .Text & vbCr & vbCr & "Spans one line or less."
Else
MsgBox .Text & vbCr & vbCr & "Spans more than one line."
End If
End With