Этюды для программистов Microsoft Word

Home ] Up ] Этюд 1.1. Подгонка размера текста ] Этюд 1.2. Изменение регистра символов ] Этюд 1.3. Поиск и раскраска гиперссылок ] Этюд 1.4. Стили ] Этюд 1.5. Вставка форматированного текста ] Этюд 1.6. Вычисление высоты текста. ] Этюд 1.7. Форматирование заголовка. ]


Этюд 1.5. Вставка форматированного текста

ШАБЛОН (нем. Schablone)
1. Пластина с профилем, контуром предмета или иное приспособление, являющееся образцом при изготовлении изделий (тех.).
2. перен. Готовый образец, которому слепо подражают; избитая форма выражения мысли (неодобрит.).

Толковый словарь Ушакова. http://dic.academic.ru/dic.nsf/ushakov/1089774

A pattern is a recurring set of events or objects that repeat in a predictable fashion. It can be a template or model which can be used to generate things or parts of a thing, especially if the things that are created have enough in common for the underlying pattern to be inferred, in which case the things are said to exhibit the pattern.

http://en.wikipedia.org/wiki/Pattern

В этом этюде мы рассмотрим задачу вставки в текущий документ заранее отформатированного текста. Этот прием часто используется при автоматическом формировании документов. Вместе со вставкой текста обычно осуществляется замена некоторых предопределенных тагов их значениями. Например, таг "ФИО" во вставляемом тексте заменяется на фамилию, имя и отчество автора.

Ресурсы

Шаблон "AhTextDateline.dot", 24 Кб, формат ZIP [скачать].

Функциональная спецификация

Задача

Требуется вставить в текущий документ форматированный текст из другого, заранее подготовленного, шаблонного документа. После вставки необходимо произвести замену предопределенных тагов во вставленном тексте согласно таблице замен. Необходимо создать шаблон "AhTextDateline.dot", в котором будут размещены макросы для вставки форматированного текста. Панель инструментов "AhTextDateline" должна предоставлять быстрый доступ к функциям вставки заголовков "Byline" (Автор) и "Dateline" (Дата). Шаблонные документы должны находиться в той же папке, что и использующий их шаблон "AhTextDateline.dot".

Шаблонный документ "AhPatternByline.doc"

Шаблонный документ "AhPatternByline.doc" имеет следующий вид.

 

В этом шаблонном документе, наряду с обычным текстом, могут располагаться таги %AH_USER_NAME% и %AH_USER_ROLE%, которые должны быть заменены на имя и должность автора соответственно.

Шаблонный документ "AhPatternDateline.doc"

Шаблонный документ "AhPatternDateline.doc" имеет следующий вид.

В этом шаблонном документе, наряду с обычным текстом, может располагаться таг %AH_DATELINE%, который должен быть заменен на текущую дату в формате "MM/DD/YYYY".

Шаблонные документы "AhPatternByline.doc" и "AhPatternDateline.doc" должны находиться в той же папке, что и использующий их шаблон "AhTextDateline.dot".

Панель инструментов "AhTextDateline"

Панель инструментов "AhTextDateline" имеет следующий вид:

 Краткое описание кнопок панели инструментов "AhTextDateLine" приведено в следующей таблице.

Кнопка панели

Макрос

Краткое описание

Help

AhTextDatelineHelp

Краткая подсказка по кнопкам панели инструментов.

Byline

AhTextByLineInsertTest

Вставка форматированного текста из файла "AhPatternByline.doc". Заменяются таги %AH_USER_NAME% (автор) и
%AH_USER_ROLE% (должность).

Dateline

AhTextDateLineInsertTest

Вставка форматированного текста из файла "AhPatternDateline.doc". Заменяются таги
%AH_DATELINE% (текущая дата).

Краткая подсказка

Краткая подсказка по кнопкам панели инструментов имеет следующий вид.

Вставка заголовка "Byline"

В открытый документ вставляется форматированный текст из файла "AhPatternByline.doc".

Таги %AH_USER_NAME% и %AH_USER_ROLE% в тексте файла заменяются на имя и должность автора соответственно.

Пример вставленного текста.

Евгений Ахунджанов
Автор

Вставка заголовка "Dateline"

В открытый документ вставляется форматированный текст из файла "AhPatternDateline.doc". Таг %AH_DATELINE% в тексте файла заменяется на текущую дату в формате "MM/DD/YYYY".

Пример вставленного текста

Дата создания: 31/12/2007

Вставленный в результате работы обоих макросов текст должен иметь примерно следующий вид:

Реализация - шаблон "AhTextDateline.dot"

В шаблоне "AhTextDateline.dot" реализованы функции для вставки форматированного текста, расположенного в других документов с одновременной заменой тагов.

'
' File AhTextDateline.dot|AhTextDateline
'
' Etudes for Microsoft Word Programmers.
' Etude
1.5. Inserting Formatted Text.
'
' First published on http://www.transcriber.ru
'
' © 2000-2007. Evgeny Akhundzhanov. All rights reserved.
'
Option Explicit
 

 

Константы

'
' Constants
'
Const cStrPattByLn As String = "AhPatternByline.doc"
Const cStrPattDate As String = "AhPatternDateline.doc"

Сообщения

'
' Messages
'
Const cStrDateLineHelp As String = _
"Etudes for Microsoft Word Programmers." & vbCrLf & _
"Etude
1.5. Inserting Formatted Text." & vbCrLf & _
"http://www.transcriber.ru" & vbCrLf & vbCrLf & _
     "Template 'AhTextDateline.dot' - " & _
     "Inserting formatted text from external document." & vbCrLf & vbCrLf & _
     "Byline - inserting ByLine from '%1'" & vbCrLf & _
     "Dateline - inserting Dateline from '%2'"
Const cStrPatternFileNotFound As String = "%1 template file <%2> was not found."

Процедура AhTextDatelineHelp

'
' AhTextDatelineHelp
'
Sub AhTextDatelineHelp()
    Dim strDateLineHelp As String
    strDateLineHelp = cStrDateLineHelp
    strDateLineHelp = Replace(strDateLineHelp, "%1", cStrPattByLn)
    strDateLineHelp = Replace(strDateLineHelp, "%2", cStrPattDate)
    MsgBox strDateLineHelp

End Sub

Процедура AhUtilFileInsert

'
' AhUtilFileInsert
'
Private Function AhUtilFileInsert(ByVal FileName As String) As Boolean
    On Error GoTo ErrorLabel
    Selection.InsertFile FileName
    AhUtilFileInsert = True
    Exit Function
ErrorLabel:
    AhUtilFileInsert = False

End Function

Процедура AhUtilReplaceTag

'
' AhUtilReplaceTag
'
Private Sub AhUtilReplaceTag(ByVal strTag As String, ByVal strReplace As String)
Dim iNameLength As Long
Dim iSelStart As Long
    On Error Resume Next
    iSelStart = Selection.Start
    With Selection.Find
        .Forward = True
        .ClearFormatting
        .MatchWholeWord = False
        .MatchCase = False
        .MatchWildcards = False
        .Wrap = wdFindContinue
        .Text = strTag
        .Replacement.ClearFormatting
        .Replacement.Text = strReplace
        iNameLength = Len(.Replacement.Text)
    End With
    '
    ' just replace once
    '
    If Selection.Find.Execute(Replace:=wdReplaceOne) Then
        Selection.Start = iSelStart + iNameLength - Len(Tag)
    End If
End Sub

Процедура AhTextBylineInsert

'
' AhTextBylineInsert
'
Sub AhTextBylineInsert(ByVal strPatternFileName As String, ByVal strUserName As String, ByVal strUserRole As String)
Dim bOldReplacement As Boolean
    '
    ' save Application properties
    '
    With Application
        bOldReplacement = .Options.ReplaceSelection
        .Options.ReplaceSelection = False
        .ScreenUpdating = False
    End With
   
    '
    ' assume pattern file is in the same folder
    '
    Dim strFilePath As String
    strFilePath = ActiveDocument.Path + "\" + strPatternFileName
 
    '
    ' replace tags
    '
    If AhUtilFileInsert(strFilePath) Then
        AhUtilReplaceTag "%AH_USER_NAME%", Trim(strUserName)
        AhUtilReplaceTag "%AH_USER_ROLE%", Trim(strUserRole)
    Else
        Dim strMess As String
        strMess = cStrPatternFileNotFound
        strMess = Replace(strMess, "%1", "Byline")
        strMess = Replace(strMess, "%2", strPatternFileName)
        MsgBox strMess
    End If
   
    '
    ' restore Application properties
    '
    With Application
        .Options.ReplaceSelection = bOldReplacement
        .ScreenUpdating = True
    End With
End Sub

Процедура AhTextDatelineInsert

'
' AhTextDatelineInsert
'
Sub AhTextDatelineInsert(ByVal strPatternFileName As String, ByVal strDateLine As String)
Dim bOldReplacement As Boolean
    '
    ' save Application properties
    '
    With Application
        bOldReplacement = .Options.ReplaceSelection
        .Options.ReplaceSelection = False
        .ScreenUpdating = False
    End With
 
    '
    ' assume pattern file is in the same folder
    '
    Dim strFilePath As String
    strFilePath = ActiveDocument.Path + "\" + strPatternFileName
 
    '
    ' replace tags
    '
    If AhUtilFileInsert(strFilePath) Then
        AhUtilReplaceTag "%AH_DATELINE%", Trim(strDateLine)
    Else
        Dim strMess As String
        strMess = cStrPatternFileNotFound
        strMess = Replace(strMess, "%1", "Dateline")
        strMess = Replace(strMess, "%2", strPatternFileName)
        MsgBox strMess
        Exit Sub
    End If
   
    '
    ' restore Application properties
    '
    With Application
        .Options.ReplaceSelection = bOldReplacement
        .ScreenUpdating = True
    End With

End Sub

Процедура AhTextDateLineInsertTest

'
' AhTextDateLineInsertTest
'
Sub AhTextDateLineInsertTest()
    If Documents.Count = 0 Then Exit Sub
    '
    ' settings
    '
    Dim strDateLine As String
    strDateLine = CStr(Date)
   
    AhTextDatelineInsert cStrPattDate, strDateLine
End Sub

 

Процедура AhTextByLineInsertTest

'
' AhTextByLineInsertTest
'
Sub AhTextByLineInsertTest()
    If Documents.Count = 0 Then Exit Sub
    '
    ' settings
    '
    Dim strUserName As String
    Dim strUserRole As String
 
    strUserName = ActiveDocument.BuiltInDocumentProperties(wdPropertyAuthor)
    If (Len(strUserName) <= 0) Then
        strUserName = "User name here..."
        strUserRole = "User role here..."
    Else
        strUserRole = "The Author."
    End If
   
    AhTextBylineInsert cStrPattByLn, strUserName, strUserRole
End Sub

Выводы

В этом этюде рассмотрены операции вставки в текущий документ форматированного текста из заранее подготовленных шаблонных документов. На основе спецификации создан шаблон "AhTextDateline.dot", который содержит макросы для вставки форматированного текста и замены тагов. Панель инструментов "AhTextDateline" предоставляет простой интерфейс к операциям вставки заголовков "Byline" (Автор) и "Dateline" (Дата).

Если выполнить, а затем отменить (Undo) операцию вставки форматированного текста, то вставленный текст удаляется, а стили только что вставленного и удаленного текста - остаются!

 

Задание 1

В этом этюде фамилия автора берется из свойства документа "Автор", если значением последнего является непустая строка. В противном случае в документ вставляется некий заранее подготовленный текст. Добавьте в код форму, которая позволит пользователю редактировать значения замещаемых тагов. При необходимости расширьте количество замещаемых тагов.

 

Задание 2

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

 

Задание 3

Создайте шаблонный документ, содержащий образцы всех стандартных стилей, используемых в вашей компании.

 

Задание 4

Сколько тагов замены потребуется для вставки приведенного ниже заранее отформатированного текста с результатами голосования?

 


Этюды для программистов Microsoft Word. Этюд 1.5. Вставка форматированного текста.


© 2000-2009 Евгений Ахунджанов, Все Права Сохранены.
www.transcriber.ru | Послать письмо автору