Опубликован: 25.03.2009 | Уровень: для всех | Доступ: свободно
Лекция 12:

Практические примеры программирования для MS Word

< Лекция 11 || Лекция 12: 12 || Лекция 13 >
Аннотация: Лекция посвящена описанию практических примеров программирования на VBA для MS Office.

12.1. Групповая обработка файлов

12-01-Групповая обработка файлов.docm - пример к п. 12.1.

12.1.1. Условие

Предположим, у вас есть несколько сотен файлов в формате .docx и . docm. Например, с ними вы работали дома. Очевидно, что дома у вас установлен Office 2007. И вот, приходит время перенести эти материалы на рабочий компьютер. Вы обнаруживаете, что MS Office на рабочем месте так и не обновили, а на вопросы об обновлении отвечают неопределенно. К тому же, некоторые из ваших документов предназначаются для других пользователей с устаревшими версиями Office - поэтому локальная самостоятельная установка конвертера на вашем ПК проблему не решает. А раз так - у вас есть два пути. Первый - заниматься конверсией файлов в формат .doc вручную, и второй - поручить это дело Microsoft Word.

12.1.2. Решение

Добавим в Microsoft Word кнопку, обработчик нажатия которой содержит следующий код (листинг 12.1)

'Переменная для имени очередного файла
    Dim var_Doc As Variant
    'Для хранения ссылки на открытый файл
    Dim obj_File As Document
    'Для формирования нового имени файла
    Dim str_FileName As String
    'Для подсчета количества обработанных файлов
    Dim var_FileCount
    'Для хранения пути к папке с исходными файлами
    Dim str_In As String
    'Папка с выходными файлами
    Dim str_Out As String
    'Инициализируем переменные
    str_In = "C:\Документы"
    str_Out = "C:\Документы\Обработано"
    'Изменяем текущую директорию на заданную
    ChDir (str_In)
    'Ищем первый файл в директории
    var_Doc = Dir("*.doc?")
    Do While var_Doc <> "" 'До тех пор, пока есть файлы
        'Открываем найденный файл в невидимом окне
        Set obj_File = _
        Documents.Open( _
        FileName:=str_In + "\" + var_Doc, _
        Visible:=False)
        'Формируем имя нового файла
        str_FileName = str_Out + "\" + _
        Mid(var_Doc, 1, Len(var_Doc) - 4) + _
        "doc"
        'Сохраняем файл в формате Word 97-2003
        obj_File.SaveAs FileName:=str_FileName, _
        FileFormat:=wdFormatDocument97
        'Закрываем файл
        obj_File.Close
        'Увеличиваем на 1 счетчик файлов
        var_FileCount = var_FileCount + 1
        'Находим следующий подходящий файл в папке
        var_Doc = Dir()
    Loop
    MsgBox ("Обработано" + Str(var_FileCount) + " файлов")
Листинг 12.1. Групповая обработка файлов

Как видите, алгоритм работы программы выглядит так:

  • Найти файл
  • Открыть его
  • Сохранить в новом формате
  • Закрыть

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

Вы можете доработать эту программу. Например, добавить сюда обработчик ошибок, дать пользователю возможность выбирать места для поиска исходных файлов и сохранения новых и т.д. Когда файл открыт, вы можете обрабатывать его любыми средствами Microsoft Word, то есть эта программа может послужить основой для множества программ, направленных на групповую работу с файлами.

12.2. Копирование материалов нескольких документов в один

12-02-Копирование текстов.docm - пример к п. 12.2.

12.2.1. Условие

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

12.2.2. Решение

Для решения этой задачи напишем макрос, который должен храниться в глобальном шаблоне. При запуске макроса будет создаваться новый документ, в который будут скопированы материалы всех остальных открытых документов. Эту операцию можно реализовать множеством способов, мы избрали копирование материалов через буфер обмена Windows (листинг 12.2.)

'Переменная для хранения ссылки на
    'целевой документ
    Dim obj_TargetD As Document
    'Для хранения ссылки на очередной
    'обрабатываемый документ
    Dim obj_CurDoc As Document
    Set obj_TargetD = Documents.Add
    For Each obj_CurDoc In Documents
        If obj_CurDoc.Name <> _
        obj_TargetD.Name Then
            'Выделяем содержимое очередного документа
            obj_CurDoc.Content.Select
            'Копируем в буфер обмена
            Selection.Copy
            'Активируем целевой документ
            obj_TargetD.Activate
            'Вставляем в текущую позицию курсора
            'материалы из буфера обмена
            Selection.Paste
        End If
    Next
Листинг 12.2. Добавление материалов различных файлов в один файл

Здесь мы создаем новый документ, в который копируем содержимое остальных открытых документов. Цикл обхода всех объектов коллекции Documents, то есть открытых документов, позволяет получить доступ к каждому открытому документу. Однако, здесь не обойтись без проверки - мы должны обработать все открытые документы кроме того, в который копируем данные. Для этого прежде чем начать обработку, сравниваем имя целевого и текущего документа.

12.3. Разбиение одного документа на несколько

12-03-Разбиение документа.docm - пример к п. 12.3.

12.3.1. Условие

Задача, противоположная предыдущей. Один открытый документ нужно разбить на несколько, руководствуясь каким-либо признаком, после чего сохранить все документы, дав им соответствующие имена, в папку, заданную пользователем.

Разобъем активный документ на части, по 10 абзацев каждая, и сохраним каждую из частей в отдельном документе с именем такого вида:

Имя исходного документа+ "часть №"+номер части.docx

12.3.2. Решение

Напишем макрос (листинг 12.3.), который имеет смысл хранить в глобальном шаблоне. Этот макрос будет работать с активным документом.

'Переменная для хранения ссылки на
    'активный документ
    Dim obj_Doc As Document
    'Для ссылки на новый документ
    Dim obj_NewDoc As Document
    'Ссылка на абзац документа
    Dim obj_Par As Paragraph
    'Строка для хранения пути сохранения
    'файлов
    Dim var_Path As String
    'Счетчик для подсчета обработанных
    'абзацев
    Dim var_Counter
    'Переменная для сборки имен
    'новых файлов
    Dim var_FileName As String
    'Переменная для хранения номера
    'очередного файла, который используется
    'при создании имени файла
    Dim var_Part
    'Записываем 0 в счетчики количества
    'абзацев и файлов и инициализируем
    'другие переменные
    var_Counter = 0
    var_Part = 0
    Set obj_Doc = ActiveDocument
    var_Path = "C:\Документы"
    'Цикл для каждого абзаца в документе
    For Each obj_Par In obj_Doc.Paragraphs
        'Если в предыдущем сеансе обработано
        '10 абзацев - создается новый файл
        'для записи в него очередных 10
        If var_Counter = 0 Then
            Set obj_NewDoc = Documents.Add
            'Это - номер файла, который будет
            'отражен в его имени
            var_Part = var_Part + 1
        End If
        'Увеличиваем на 1 счетчик обработанных
        'абзацев
        var_Counter = var_Counter + 1
        'Активируем новый документ
        obj_NewDoc.Activate
        'Добавляем в него текст текущего абзаца
        'из исходного документа
        Selection.TypeText (obj_Par.Range.Text)
        'Если обработано 10 абзацев
        If var_Counter = 10 Then
            'Сбрасываем счетчик обработанных абзацев
            var_Counter = 0
            'Собираем имя нового файла
            var_FileName = var_Path + "\" + _
            obj_Doc.Name + _
            " часть № " + Str(var_Part) + ".docx"
            'Сохраняем новый файл
            obj_NewDoc.SaveAs FileName:=var_FileName
            'Закрываем его
            obj_NewDoc.Close
            'Очищаем объектную переменную
            Set obj_NewDoc = Nothing
        End If
    Next
    'Если в объектной переменной, представляющей
    'новый файл, хранится ссылка
    'это значит, что исходный файл имеет
    'количество абзацев, не кратное 10,
    'то есть он не будет сохранен в основном цикле
    'сохраняем этот файл
    If obj_NewDoc Is Nothing = False Then
        var_FileName = var_Path + "\" + _
        obj_Doc.Name + _
        " часть № " + Str(var_Part) + ".docx"
        obj_NewDoc.SaveAs FileName:=var_FileName
        obj_NewDoc.Close
        Set obj_NewDoc = Nothing
    End If
    'Выводим сообщение об окончании работы
    MsgBox ("Файл " + obj_Doc.Name + _
    " обработан, получено " + _
    Str(var_Part) + " файлов, которые" + _
    " хранятся в: " + var_Path)
Листинг 12.3. Разбиваем документ на части

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

< Лекция 11 || Лекция 12: 12 || Лекция 13 >
Евгений Ушаков
Евгений Ушаков
О стоимости курса
Александр Новиков
Александр Новиков
Справочник по объектам VBA
Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989
Михаил Алексеев
Михаил Алексеев
Россия, Уфа, УГАТУ, 2002