Автоматизация разработки конструкторской документации средствами VBA

Когда придет пора сдавать проект,
И страшный нормоконтролер тебя возьмет за жабры,
Ты сможешь после гордо заявить – «К КД, товарищи, претензий нет!»
«Как это нет???» — «Вот так. Я прочитал статью на Хабре!»

При выполнении проектов, в которых требуется разработка конструкторской документации соответствующей ГОСТам ЕСКД или СПДС, возникает много задач, связанных с ее корректным изготовлением. Часть этих задач связана с непосредственным оформлением документов – заполнением основных надписей, полей в форматных рамках документа. Другая часть задач связана с поддержанием связности информации в пределах комплекта документов —  единство используемых децимальных номеров, названий изделий, используемых в тексте наименований и тому подобных вещей. Такие задачи можно решать по разному, но автоматизация, безусловно, облегчит жизнь разработчику.

В данной статье, я расскажу о своем подходе к автоматизации такой работы на примере документов Word. Этот же подход применим и к Visio и к AutoCAD и к любому продукту, в котором предусмотрена возможность использования Visual Basic for Application (VBA).

Представим себе такие входные условия для решения:

в составе документации должны быть документы по ГОСТ 2.102, в том числе текстовые, оформленные с учетом ГОСТ 2.105, схемы по ГОСТ 2.701 и, не дай бог, что-то еще строительное по ГОСТ 21.101. А из инструментов есть только стандартный Microsoft Office, Microsoft Visio, Autodesk AutoCAD (это если бог был немилостив) и собственное желание оформить все как можно быстрее, лучше и не затрачивая усилий (то есть, в наличии имеется продуктивная лень).

Лирическое отступление

В некоторых случаях, в компаниях внедряют тяжелые системы автоматизированного проектирования и управления проектной документацией. Но мой опыт показал, что, во-первых, такие системы не ориентированы на российские стандарты и без танцев с бубном сложно выдать то, что им реально соответствует. Во-вторых, они трудны в освоении. В-третьих дороги. Из наиболее понравившихся мне в свое время продуктов упомяну, пожалуй, продукты компании Аскон (Компас, Лоцман, …). Они наши ГОСТы вполне учитывают.

С точки зрения ЕСКД, один из важных моментов для разрабатываемых документов – это рамки и основная надпись. И наверняка, те кто оформляли их в Word сталкивались с тем, как может «плыть» форматирование, размещение шрифтов и так далее.

Шаг 1. Делаем шаблоны текстовых документов.

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

Стандартные страницы документа ЕСКД
Стандартные страницы документа ЕСКД

Заметим, что рамки разные – поэтому для них
придется создать различные разделы. Описывать создание рамок и текстовых полей –
здесь не буду. Это делается достаточно просто, хотя и муторно. Но это делается
всего один раз. Дальше спокойно пользуемся.

Удобно сразу в шаблонах использовать обновляемые поля Word. В частности, содержание, номер страницы, общее количество страниц, текущая дата. Я занес их сразу в соответствующие поля основной надписи – Дата, Лист, Листов и в других местах, где возможно.

Шаг 2. Создаем переменные документа

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

Я решил использовать для этого пользовательские поля Word. В ручном режиме вставка такого поля осуществляется через меню (ленту) Вставка\ Экспресс блоки\Поле\DocVariable. В режиме отображения кода поля, оно выглядит так:

{ DOCVARIABLE Test \* MERGEFORMAT }

Как правило, любой документ комплекта содержит ключевые фрагменты, которые должны повторяться как в пределах документа, так и в комплекте. Для таких фрагментов в шаблоне создаются соответствующие поля – переменные.

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

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

Шаг 3. Создание инструмента работы с полями

Доступ к прямому редактированию созданных полей весьма неудобен, поэтому для этого разумно сделать вспомогательный компонент – диалоговое окно. В VBA есть для этого все необходимое.

Ключевые функции, которые будут полезны при работе с документом в режиме автоматизации такие:

  • создание переменной;

  • удаление переменной;

  • изменение текста/значения переменной;

  • вставка переменной в документ

Диалоговое окно "Обработка переменных"
Диалоговое окно «Обработка переменных»

Создание переменной выбранного типа при помощи VBA производится элементарно:

Sub AddVar(Name As String, Value As String) ActiveDocument.Variables(Name).Value = Value
End Sub

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

Private Sub CommandButton1_Click() If MsgBox("Удалить переменную" + ufdel.cbLocals.Value + "?", vbOKCancel) = vbOK Then FindVarInText ufdel.cbLocals.Value, "Преобразовать в текст" ActiveDocument.Variables(ufdel.cbLocals.Value).Delete End If ReloadVars ufdel.cbLocals.Text = ActiveDocument.Variables(1).Name
End Sub

При этом поиск преременных ведется как в основном тексте, так и в колонтитулах всех его разделов:

Sub FindVarInText(varName As String, Action As String) FieldAction ActiveDocument.Fields, varName, Action For sec = 1 To ActiveDocument.Sections.Count For head = 1 To ActiveDocument.Sections(sec).Headers.Count FieldAction ActiveDocument.Sections(sec).Headers(head).Range.Fields, varName, Action Next For foot = 1 To ActiveDocument.Sections(sec).Footers.Count FieldAction ActiveDocument.Sections(sec).Footers(foot).Range.Fields, varName, Action Next Next End Sub

Обновление полей при изменении переменной разработчиком документа производится автоматически после его изменения в диалоговом окне (если стоит соответствующая галочка).

Private Sub TextBox1_AfterUpdate() Dim varName As String Dim Action As String If Not CheckBox1.Value Then Exit Sub lStat.BackColor = &HC0C0FF lStat.Caption = "Обновляется файл переменных..." ufdel.Repaint xlAddVars ufdel.tbFileName lStat.BackColor = &HC0C0FF lStat.Caption = "Обновляется текст документа..." ufdel.Repaint varName = cbLocals.Text Action = "Обновить" FieldAction ActiveDocument.Fields, varName, Action lStat.BackColor = &HC0C0FF lStat.Caption = "Обновляются колонтитулы..." ufdel.Repaint For sec = 1 To ActiveDocument.Sections.Count For head = 1 To ActiveDocument.Sections(sec).Headers.Count FieldAction ActiveDocument.Sections(sec).Headers(head).Range.Fields, varName, Action Next For foot = 1 To ActiveDocument.Sections(sec).Footers.Count FieldAction ActiveDocument.Sections(sec).Footers(foot).Range.Fields, varName, Action Next Next lStat.BackColor = &H8000000F lStat.Caption = "Значение"
End Sub

Я сознательно сделал окно «Обработка переменных» немодальным. При этом оказалось возможным реализовать такой сценарий обработки (любого) документа:

Открывается документ (или ранее созданный шаблон) и открывается окно «обработка переменных». Разработчик меняет значение ранее созданных в документе полей в диалоговом окне и непосредственно наблюдает корректное изменение текста на экране. По мере написания или вычитки текста, он принимает решение о необходимости повторного использования какого-либо фрагмента. Он выделяет его мышью и нажимает кнопку «создать» в диалоговом окне. При этом автоматически создается переменная и заменяет исходный фрагмент на соответствующее ей обновляемое поле. Он читает документ дальше и в случае необходимости вставляет в текст поля ранее созданных переменных. По окончании правки, разработчик проводит ревизию значений переменных и при необходимости корректирует их. После всего, документ выводится на печать с опцией «обновлять поля при печати», либо он нажимает комбинацию “Сtrl-A” + F9 для ручного обновления и просмотра финального результата на экране.

Собственно, на этом шаге мы уже имеем инструмент, который позволяет нам получить некоторые преимущества редактирования документа, а именно:

  1. Нам не требуется заботиться о корректности отображения оформительской части документа – линии рамок никуда не смещаются при редактировании, текст не пропадает, основная надпись на месте и не разъезжается.

  2. Нам не требуется входить в режим редактирования каждого колонтитула для правки текста, который в них должен находиться. При этом, пропадает проблема «случайно пропавших» разрывов разделов и смещения этих разделов в документе.

  3. Мы четко понимаем, какие термины, сокращения, коды используются в документе и у нас нет нужды их перекрестно перепроверять и редактировать. Они меняются централизованно.

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

Сейчас, мы уже получили достаточно много полезных бонусов. Но ведь лень человеческая безгранична и мы помним, что хотели автоматизировать работу не с документом, а с комплектом документов, но…

Если внимательно посмотреть на рисунок окна пользовательского диалога, приведенную выше в статье, то можно заметить там упоминание файла variables.xls, общих переменных, считывания и сохранения.


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

Читайте так же:

  • В «Авито» назвали регионы с максимальным ростом цен на аренду дачВ «Авито» назвали регионы с максимальным ростом цен на аренду дач В среднем, цены выросли за год почти на треть. Дачи сильнее всего подорожали в Краснодарском крае. Коттеджи — в Ростовской области Фото: Сергей Бобылев/ТАСС За год краткосрочная аренда загородного жилья в России выросла в цене на 29%. Говорится в поступившем в редакцию 12 […]
  • Использование облачных сервисов и ПО Microsoft в России подорожает на 15%Использование облачных сервисов и ПО Microsoft в России подорожает на 15% Microsoft с 1 октября повысит цены на коммерческое программное обеспечение (ПО) и облачные сервисы в России на 15%.  Как сообщили в компании. Изменение должно привести российские цены в соответствие с зафиксированной в долларах стоимостью продукции в Центральной и Восточной Европе. […]
  • Индийский рынок смартфонов упал на 13%Индийский рынок смартфонов упал на 13% Поставки смартфонов в Индии во втором квартале упали на 13% по сравнению с первым кварталом. Всего за три месяца с апреля по июль было отгружено 32,4 млн устройств. Аналитики Canalys объясняют падение отрицательным воздействием второй волны COVID-19. Отметим, что по сравнению со вторым […]
  • Google пытается отменить антимонопольный штраф, наложенный европейским регулятором три года назадGoogle пытается отменить антимонопольный штраф, наложенный европейским регулятором три года назад Google подала апелляцию на отмену антимонопольного штрафа в размере $5 млрд, наложенного Еврокомиссией в 2018 году. Регулятор обвинил компанию в злоупотреблении доминирующим положением, направленном на укрепление позиций на рынке. IT-гигант пытается доказать суду, что Еврокомиссия была […]