belleflorezel пишет:Добрый день! Задача такова: есть файл с инструкциями к препаратам(окола 100 с одинаковой структурой), который необходимо отформатировать, а именно применить к определенным повторяющимся фразам "Показания", "Противопоказания", "Дозировка", "Лекарственная форма" и т.д. применить стиль заголовка 3. Возможна ли оптимизация работы? Раньше делала через "Найти"-"Выделить все"- Стиль 3. По работе таких документов очень много.
Обычно задачи такого рода автоматизируются написанием VBA-макроса обработки текста. Для работы необходимо изготовить файл конкорданса, отладочный документ и сам макрос. Конкорданс - это файл масок, отвечающих возможным заголовкам. В прицепе к сообщению я разместил пример отладочного документа и файл конкорданса. Обработку (gjckr установки макросов) рекомендую проводить в такой последовательности:
1. Открыть файл ключевых слов keywords_headings.docx и проверить его. Символ звездочки используется для обозначения произвольной последовательности символов (можно употреблять и другие спецсимволы, которые допускает оператор Like языка VBA).
2. Открыть основной файл (не закрывая файла ключевых слов).
3. Выполнить макрос MarkHeadings.
Убедивщись, что обработка проведена корректно, обработайте ваш реальный документ с помощью макроса MarkHeadings.
Примечание: в макросе MarkHeadingsByKeywords введено допущение, что абзац потенциального заголовка не содержит 4 или более слов (чтобы отсечь "ложные срабатывания").
Далее привожу текст макросов MarkHeadings и MarkHeadingsByKeywords.
Sub MarkHeadings()
MarkHeadingsByKeywords "keywords_headings.doc*", "Heading 3"
End Sub
Sub MarkHeadingsByKeywords(Keyw_Doc As String, heading_stylename As String)
'Marks keyword-related paragraphs in the main document with definite syle
Dim kw As Variant
Dim para As Paragraph
Dim Main_Document As String
Dim Keyw_Document As String
Dim kwdoc_found As Boolean
Dim paratext As String
Dim ikw As Long
Dim pw_cnt As Long
'1. Check for the keywords file opened
Main_Document = ActiveDocument.Name
kwdoc_found = False
For Each doc In Documents
If UCase$(doc.Name) Like UCase$(Keyw_Doc) Then
kwdoc_found = True
Keyw_Doc = doc.Name
End If
Next doc
If kwdoc_found <> True Then
MsgBox Keyw_Doc & " file is not loaded"
GoTo e_MHBK
End If
'2. Prepare the keywords array
Documents(Keyw_Doc).Activate
kw = Split(Documents(Keyw_Doc).Range.text, Chr$(13))
'3. Scan the main file and shade the matching keywords.
Documents(Main_Document).Activate
Selection.GoTo What:=wdGoToLine, Which:=wdGoToFirst
For Each para In Documents(Main_Document).Paragraphs
pwcnt = para.Range.Words.count
If pw_cnt < 4 Then 'if a paragraph contains less than N words, it seems to be a heading
paratext = para.Range.text
For ikw = 0 To UBound(kw)
next_kw = Trim$(CStr(kw(ikw)))
If next_kw <> "" Then 'omit empty keywords
If paratext Like next_kw Then
'Apply heading style to the paragraph
para.Range.Select
On Error Resume Next
para.style = Documents(Main_Document).Styles(heading_stylename)
On Error GoTo 0
GoTo mk_next_para
End If
End If
Next ikw
End If
mk_next_para:
Next
Selection.GoTo What:=wdGoToLine, Which:=wdGoToFirst
e_MHBK:
End Sub