none
Макрос для разбивки строк RRS feed

  • Вопрос

  • Никогда не писал макросы, так что сделать что-то рабочее на основе чужого кода не получается Sad

     

    Итак, исходные данные:

    Тексты со множеством строк. Кроме переноса строки форматирования нет.

    выглядит так:

    123 < 345 (т.е. цифры и математические знаки, длина 29 символов)

    некоторый текст(одна или более строк)

    <пустая строка>

    456 + 789 (снова цифры и математические знаки, 29 символов)

    некоторый текст(одна или более строк)

    <пустая строка>

     

    Задача: разбить содержимое всех строк в блоке "некоторый текст", превышающее длину 40 символов. При этом текст должен разбиваться не "тупо", а по словам(т.е ессли у нас 42 символа в строке, включая пробелы, а последнее слово 5 символов, то должно получиться 36 символов+ пробел и 5 символов). Разбивать, наверное, стоит по последнему "влезающему" пробелу. Этот самый последний пробел особо не нужен и его можно как оставлять, так и удалять.

     

    Заранее спасибо.

Ответы

  • Примерно так:

    Code Snippet

    Sub test()

    Dim WordDoc
    Dim tRange As Range
    Dim i, startRange, endRange, n
    Dim idPosition As Integer
    idPosition = 40
    n = 0

    Set WordDoc = ActiveDocument
    With WordDoc

    For i = 1 To .Paragraphs.Count
    startRange = .Paragraphs(i + n).Range.Start
    endRange = .Paragraphs(i + n).Range.End

    Set tRange = .Range(startRange, endRange)
    If (tRange.Characters.Count) >= (idPosition + 1) Then
    k = 0
    Do
    k = k + 1
    Loop While tRange.Characters.Item(idPosition - k) <> " "
    tRange.Characters.Item(idPosition - k).Select
    Selection.TypeParagraph
    n = n + 1
    End If

    Next
    End With

    End Sub

     

     

    Считаем,что строка в 40 символов не может состоять из одного слова. Хотя и зря Smile
    2 июля 2008 г. 16:17

Все ответы

  • Что значит "разбить содержимое всех строк в блоке "? После блока не превышающего 40 симолов вставлять какой-ли символ? Т.е. в вашем примере после слова из пяти симовлов что нужно ставить?

    2 июля 2008 г. 10:03
  • В этом блоке может быть от одной до четырех строк. Длина строки зарнее не посчитана

    Макрос должен проходиться по тексту и проверять: если длина строки более 40 символов - разбиваем строку на две(три, четыре - лишь бы куски не превышали 40 символов). Если строка короче 40 символов - ничего не делаем, идем к следующей.

    Главное условие - разбивать так, чтобы слова не разбивались. Т.е. если у нас 45 символов, а последнее слово длиной 10 символов - то нужно получить одну строку 35(34) символов и одну 10 символов.

    Пробелы в месте разбиения можно удалять или оставлять - они ни на что не вдлияют.

     

    пример:

    123

    вот это ну слишком уж длинная строка с текстом и мы ее разбиваем

    <пустая строка>

    234

    а это короткая строка

    <пустая строка>

     

    результат:

    123

    вот это ну слишком уж длинная строка с

    текстом и мы ее разбиваем

    <пустая строка>

    234

    а это корoткая строка

    <пустая строка>
    2 июля 2008 г. 10:16
  •  Undel написано:

    Никогда не писал макросы,

     

    Тогда стоит ли возиться?

     

    Но если хотите освоить написание скриптов и макросов, то ....

     

    Ваша задача наиболее просто решается с использованием регулярных выражений.

     

    http://msdn.microsoft.com/en-us/library/ms974570.aspx

     

    http://www.regular-expressions.info/vbscript.html

    2 июля 2008 г. 13:51
    Модератор
  • Примерно так:

    Code Snippet

    Sub test()

    Dim WordDoc
    Dim tRange As Range
    Dim i, startRange, endRange, n
    Dim idPosition As Integer
    idPosition = 40
    n = 0

    Set WordDoc = ActiveDocument
    With WordDoc

    For i = 1 To .Paragraphs.Count
    startRange = .Paragraphs(i + n).Range.Start
    endRange = .Paragraphs(i + n).Range.End

    Set tRange = .Range(startRange, endRange)
    If (tRange.Characters.Count) >= (idPosition + 1) Then
    k = 0
    Do
    k = k + 1
    Loop While tRange.Characters.Item(idPosition - k) <> " "
    tRange.Characters.Item(idPosition - k).Select
    Selection.TypeParagraph
    n = n + 1
    End If

    Next
    End With

    End Sub

     

     

    Считаем,что строка в 40 символов не может состоять из одного слова. Хотя и зря Smile
    2 июля 2008 г. 16:17
  • Спасибо!

    2 июля 2008 г. 20:24