Проверьте, соответствует ли Range одной строке - PullRequest
0 голосов
/ 04 июля 2018

Я программно заполняю шаблон регулируемой формы, где строки предопределены (как ячейки таблицы):
(Использование элементов управления содержимым в виде текста в качестве заполнителей, но это не относится к текущему вопросу.)

predefined lines

Итак, мне приходится разбивать длинный текст на строки вручную (автоматическое добавление строк или что-то не так, потому что разрывы страниц также предопределены).

Теперь, так как символы имеют разную ширину, я не могу просто установить предел жестко закодированных символов для разрыва (точнее, я могу, и это то, что я делаю сейчас, но это оказалось неэффективным и ненадежным, как и ожидалось) ). Итак:

Как проверить, соответствует ли диапазон текста одной строке - а если нет, то какой его размер соответствует размеру?

Я выписал Члены диапазона (Word) , но не вижу ничего релевантного.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Нет необходимости что-либо прокручивать - что в любом случае ненадежно. Попробуйте что-нибудь на основе:

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
0 голосов
/ 04 июля 2018

Единственный способ - .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 и соответствующие операторы могут быть удалены.

Примечание:

...