<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBS: как поменять значения колонтитулов в шаблоне Word?]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=6784&amp;type=atom" />
	<updated>2012-02-10T09:46:19Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=6784</id>
		<entry>
			<title type="html"><![CDATA[Re: VBS: как поменять значения колонтитулов в шаблоне Word?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=56639#p56639" />
			<content type="html"><![CDATA[<p>Если речь идёт о той части колонтитулов, которая является полем(Нач. отдела, Нормоконтроль, ГИТ, номер документа и его название), то вот такой вариант подойдёт(меняем ФИО Нач. отдела и нормоконтролёра - для обоих в шаблоне использовано одно и тоже поле &quot;Нач. отдела&quot;; а также правим &quot;шифр&quot;, чтобы убедиться что со вторым и далее листом метод работает):<br /></p><div class="codebox"><pre><code>&#039; VB Script Document
option explicit
&#039; http://msdn.microsoft.com/en-us/library/bb213727(office.12).aspx WdFieldType Enumeration
Const wdFieldDocProperty = 85

Dim objFSO
Set objFSO = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Dim objWshShell
Set objWshShell = CreateObject(&quot;WScript.Shell&quot;)
Dim strTplWordFile
strTplWordFile = &quot;КЖ(WORD).doc&quot;
Dim PathToTmplFile
PathToTmplFile = objWshShell.CurrentDirectory &amp; &quot;\&quot; &amp; strTplWordFile

if not objFSO.FileExists(PathToTmplFile) then
    MsgBox &quot;Нет файла-шаблона для отчета в формате MS Word!&quot;, vbCritical, &quot;Ошибка исходных данных!&quot;
    Set objWshShell = Nothing
    Set objFSO = Nothing
end If

Dim objWord
Set objWord = CreateObject(&quot;Word.Application&quot;)
objWord.Visible = True
Dim objDoc
Set objDoc = objWord.Documents.Open(PathToTmplFile)

Dim DocProp, DocProps
Set DocProps = objDoc.CustomDocumentProperties
&#039; Перебираем кастомные свойства документа в поисках нужного
For Each DocProp in DocProps
  If InStr(DocProp.Name,&quot;Нач. отдела&quot;)&gt;0 Then
    DocProp.Value = &quot;Петров П.П.&quot;
  End If
  If InStr(DocProp.Name,&quot;Шифр&quot;)&gt;0 Then
    DocProp.Value = &quot;90.001.3-021-РЗ5.01&quot;
  End If
Next

Dim SubSec, Secs
Dim SubFootr, Footrs
Dim Field, Fields
Set Secs = objDoc.Sections
&#039; http://msdn.microsoft.com/en-us/library/aa221436(office.11).aspx - Using the Document Object
&#039; http://msdn.microsoft.com/en-us/library/aa223083(office.11).aspx - Using the Sections Collection
For Each SubSec In Secs &#039; перебор разделов
    Set Footrs = SubSec.Footers
    &#039; http://msdn.microsoft.com/en-us/library/aa221970(office.11).aspx - Using the HeadersFooters Collection
    For Each SubFootr In Footrs &#039; перебор нижних колонтитулов
        Set Fields = SubFootr.Range.Fields
        For Each Field In Fields &#039; перебор полей колонтитулов
            &#039; обновляем поля нужного типа
            If Field.Type = wdFieldDocProperty Then Field.Update
        Next
    Next
Next</code></pre></div><p>Подозреваю что к свойству как-то можно обратиться не по индексу(или перебором), а как-то более явно(например по коду поля),&nbsp; но пока не нашел подтверждения своим подозрениям. Поэтому и сделал перебором(ну и потому, что пока не совсем понял структуру документа в VBA).</p><p>С текстом(не полями) некоторые идеи есть, но поделиться пока не готов(ибо &quot;больше молчи - за умного сойдёшь&quot;, будет что-то реализованое - поделюсь).</p><p>P.S. ссылки на MSDN дал в коментариях по ходу скрипта(привычка - так потом легче вспоминать &quot;о чём этот скрипт&quot; и откуда что брал <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />).</p>]]></content>
			<author>
				<name><![CDATA[BeS Yara]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=25643</uri>
			</author>
			<updated>2012-02-10T09:46:19Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=56639#p56639</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBS: как поменять значения колонтитулов в шаблоне Word?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=56531#p56531" />
			<content type="html"><![CDATA[<p>Добрый день!<br />Задача: Вывести кабельный журнал&nbsp; из электротехнического САПР (e3.series) в шаблон Word.<br />Проблема: как поменять значения колонтитулов в шаблоне? <br />Как считать колонтитулы мы поняли:</p><div class="codebox"><pre><code>            Dim objFSO
            Set objFSO = CreateObject(&quot;Scripting.FileSystemObject&quot;)            
            Dim objWshShell
            Set objWshShell = CreateObject(&quot;WScript.Shell&quot;)
            Dim strTplWordFile 
            strTplWordFile = &quot;КЖ(WORD).doc&quot;
            Dim PathToTmplFile
            PathToTmplFile = objWshShell.CurrentDirectory &amp; &quot;\&quot; &amp; strTplWordFile

            if not objFSO.FileExists(PathToTmplFile) then
                MsgBox &quot;Нет файла-шаблона для отчета в формате MS Word!&quot;, vbCritical, &quot;Ошибка исходных данных!&quot;
 
                Set objWshShell = Nothing
                Set objFSO = Nothing

            end If
            
            
            Dim objWord
            Set objWord = CreateObject(&quot;Word.Application&quot;)
            objWord.Visible = True
            Dim objDoc
            Set objDoc = objWord.Documents.Open(PathToTmplFile)
            
            Dim iIndexSymb
            
            iIndexSymb = 0
            
            for i = 1 to objDoc.Range(0,0).sections.Count
            
                for j = 1 to objDoc.Range(0,0).sections.item(i).footers.count
                    
                    for k = 1 to objDoc.Range(0,0).sections.item(i).footers.item(j).Range.Fields.Count

                        Dim CodeText
                        
                        Set CodeText = objDoc.Range(0,0).sections.item(i).footers.item(j).Range.Fields.item(k).Result                      
                        
                       
                        
                        MsgBox &quot;Текст поля в колонтикуле = &quot; &amp; CodeText&#039;CodeText.Text
                        
                      
                        iIndexSymb = iIndexSymb + 1                         
                    next
                    &#039; обновляем Этап №2
                    objDoc.Range(0,0).sections.item(i).footers.item(j).Range.Fields.Update
                next
            next</code></pre></div><p>Шаблон КЖ(WORD).doc тут: <a href="http://zalil.ru/32659696">http://zalil.ru/32659696</a><br />он должен находиться в одной папке со скриптом</p>]]></content>
			<author>
				<name><![CDATA[Oki2]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26838</uri>
			</author>
			<updated>2012-02-07T11:44:15Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=56531#p56531</id>
		</entry>
</feed>
