1

Тема: Перебор всех текстовых элементов в документе

Доброго времени суток, уважаемые коллеги!
Коллеги, потому что сам пишу макросы, правда пока только для Excel. Но вот настала нужда обработки данных в в файле Word, поэтому прошу Вашей помощи здесь.
Если вкратце, то передо мной стоит задача обработки файлов формата Word, Excel и txt. А если еще точнее, то надо по особому обработать текстовое содержимое этих файлов и заменить исходный текст на обработанный.
Для этого у меня есть функция, которой на вход подается строковый параметр. Она его обрабатывает и возвращает уже обработанную строку.
Обработать последние два типа для меня не проблема. Текстовый файл я считываю построчно, обрабатываю строку и записываю его в файл.
Для Excel еще проще - обрабатываю последовательно все ячейки.
Но вот с Word у меня затык (опыта нет абсолютно). по сути надо открыть указанный Word-файл. последовательно считать строковые данные и перезаписать их после обработки функцией.
Проблемы:
1) Считывать текст так, чтобы предложения не разрывались. Я так понимаю, что достаточно считывать весь параграф.
2) В файле могут быть таблицы. Тогда надо поячеечно передать в функцию содержимое каждой ячейки и перезаписать ее обработанной строкой.

Надеюсь изложил более или менее понятно. По форуму полазил и решения не нашел (видимо задача на столько тривиальная, что ее просто нет смысла выкладывать :-))

2

Re: Перебор всех текстовых элементов в документе

если не супер-пупер большой секрет
--в чем смысл обработки

может простой замены окажется достаточно

3

Re: Перебор всех текстовых элементов в документе

Предложения можно считывать через коллекцию Sentences. Если порядок следования текста и таблиц важен, то документ для чтения нужно разбить на диапазоны текста и таблиц. Определять диапазоны по номеру начального и конечного символа таблиц. Таблицы читать поячеечно — не проблема. Задавайте вопросы — будем решать по мере их поступления

Лучше день потерять — потом за пять минут долететь!

4

Re: Перебор всех текстовых элементов в документе

shanemac51 пишет:

если не супер-пупер большой секрет
--в чем смысл обработки
может простой замены окажется достаточно

Функция заменяет число, написанное текстом, на само число. Замена здесь не поможет.

viter.alex пишет:

Предложения можно считывать через коллекцию Sentences. Если порядок следования текста и таблиц важен, то документ для чтения нужно разбить на диапазоны текста и таблиц. Определять диапазоны по номеру начального и конечного символа таблиц. Таблицы читать поячеечно — не проблема. Задавайте вопросы — будем решать по мере их поступления

Сейчас прикинул. В принципе порядок не важен, т.к. код должен работать так: получили предложение - обработали функцией - заменили это предложение на обработанное. А если в тексте будет два идентичных предложения, то и для функции работы меньше.
Забыл сразу упомянуть - программу реализую в Excel-е (а где же еще, я ведь только в нем работаю :-) ). В ячейке указывается путь к файлу. по кнопке "пуск" этот файл обрабатывается. т.е. в коде, как я понимаю, будет переменная Word-ского типа. С ней и должна происходить работа. Буду признателен за конкретный пример.

5

Re: Перебор всех текстовых элементов в документе

имеется в виду

пять руб заменить на 5 руб
сто десять тысяч двести пятнадцать руб на 110215 руб


---
или нечто другое

6

Re: Перебор всех текстовых элементов в документе

Нечто такое. Эта функция уже реализована. Вопрос в обработке файла  smile

7

Re: Перебор всех текстовых элементов в документе

Имхо, изначально подход неверный.

Если речь о текстовом файле (txt) открытом в Word, то конечно, можно перебирать предложения/абзацы и прогонять их вашей функцией.

Если же речь о документе (doc, docx...), то придется использовать инструменты Word, в данном случае - поиск и замену.

Причина в том, что документ это не просто текст, это сложный набор элементов. Если вы пишите универсальный макрос, когда содержимое обрабатываемого им документа может быть любым, то однозначно - только поиск и замена Word. Если вы уверены, что в документе только текст, то можно попробовать вашу функцию, но я бы так не делал.

Макросы под заказ и готовый пакет - mtdmacro.ru

8

Re: Перебор всех текстовых элементов в документе

Попытался вот накропать код из интернет-находок и совета viter.alex. Вроде как предложения выхватываются корректно даже текст в таблицах), но вот при сохранении файла получается какая-то ересь :-(

On Error Resume Next
        Set oWord = GetObject(, "Word.Application") 'Ищем уже открытый Word
        If Err.Number <> 0 Then 'Если не нашли - создаём новый экземпляр
            Err.Clear
            Set oWord = CreateObject("Word.Application")
        End If
        If oWord Is Nothing Then
            MsgBox "Невозможно создать экземпляр приложения MS Word!", vbCritical, vbNullString
            Exit Sub
        End If
        
        Set oDoc = oWord.Documents.Open(fileIn)

        If Err.Number <> 0 Then
           MsgBox "Ошибка при открытии модифицируемого документа"
           Exit Sub
        End If
        
        For i% = 1 To oDoc.Sentences.Count
            longStr = ConvertStrToNum(oDoc.Sentences(i).Text, True)
            If longStr <> oDoc.Sentences(i).Text Then oDoc.Sentences(i).Text = longStr
        Next i
        oDoc.SaveAs2 (fileOut)

В чем мой косяк?

9

Re: Перебор всех текстовых элементов в документе

Видимо мои действия с коллекцией Sentences не совсем правильные.
Подскажите, пожалуйста, как реализовать поставленную задачу

10

Re: Перебор всех текстовых элементов в документе

Видимо вопрос настолько простой (а может даже сложный), что так никто и не помог  big_smile. Помучился я и вроде как накропал код, который даже работает. Понял, что метод поиска и замены тупиковый, т.к. есть ограничение на длину искомого текста (а у меня есть и длинные предложения). Зашел вот с такого бока и вроде как все заработало. Может кому пригодится:

Dim rng As Object, oWord As Object

Set oWord = CreateObject("Word.Application")

With oWord
    .Documents.Open filename:=fileIn, ReadOnly:=False
                
    iCount = .ActiveDocument.Sentences.Count
    For i% = 1 To iCount
         Set rng = .ActiveDocument.Sentences(i)
         strIn = .ActiveDocument.Sentences(i).Text
         longStr = ConvertStrToNum(strIn, True)
         If Trim(longStr) <> Trim(strIn) Then
              .ActiveDocument.Range(rng.Start, rng.End).Text = longStr
         End If
    Next i
    .ActiveDocument.Close (True)
    .Quit
End With
Set oWord = Nothing

Если все таки здесь есть подводные камни, то прошу указать на них.

11

Re: Перебор всех текстовых элементов в документе

меня больше интересует  ConvertStrToNum(strIn, True)
не зная принципа --сложно понять задачу
я попробовала и бросила

-------не зная броду --не суйся в воду-----------------
---реальный исходный текст 1 позиции в контексте всего предложения
---это же предложение на выходе

=================
абсолютно не хочется угадывать ваши хотелки