Posted at

【VSTO】Word文章のヘッダーにページ数を入れる

More than 3 years have passed since last update.

過去にWordVBAを使ってヘッダーに日付とページ数を入れました。

【WordVBA】Wordマクロで文章に、日付とページのヘッダーを付ける

しかし世間にはVSTO(Visual Studio Tools for the Microsoft Office )というものがあるようで、そちらの方が一般的のようです。また、.docや.docm、.docx など拡張子を気にする必要もないので素敵ですね

そこで調べて作ってみました。


アクティブなワードの部分を指定します。

Word.Document ADocument = (Word.Document)Globals.ThisAddIn.Application.ActiveDocument;


ヘッダーの部分を指定します

Word.Range HeaderRange = sectin.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;


このHeaderRangeに(現在ページ/全ページ数)みたいな感じにします。

HeaderRange.InsertAfter("(");

//SetRangeを書かないと上書きされてしまいます。
HeaderRange.SetRange(HeaderRange.End + 1, HeaderRange.End + 1);

//この辺りのパラメータはWordVBAと同じです。
HeaderRange.Fields.Add(HeaderRange, Word.WdFieldType.wdFieldPage);

//Fields.Addで入れた後はヘッダーを入れなおします。
HeaderRange = sectin.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
HeaderRange.InsertAfter("/");
HeaderRange.SetRange(HeaderRange.End + 1, HeaderRange.End + 1);

HeaderRange.Fields.Add(HeaderRange, Word.WdFieldType.wdFieldNumPages);
HeaderRange = sectin.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;

HeaderRange.InsertAfter(")");


全てまとめるとこんな感じになります。

       public void dayPageSet() {

DateTime date = DateTime.Now;
string user = Environment.UserName;
Word.Document ADocument = (Word.Document)Globals.ThisAddIn.Application.ActiveDocument;

try {
foreach (Word.Section sectin in ADocument.Sections) {
Word.Range HeaderRange = sectin.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;

HeaderRange.Text = "";

HeaderRange.InsertAfter("(");
HeaderRange.SetRange(HeaderRange.End + 1, HeaderRange.End + 1);
HeaderRange.Fields.Add(HeaderRange, Word.WdFieldType.wdFieldPage);

HeaderRange = sectin.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
HeaderRange.InsertAfter("/");

HeaderRange.SetRange(HeaderRange.End + 1, HeaderRange.End + 1);

HeaderRange.Fields.Add(HeaderRange, Word.WdFieldType.wdFieldNumPages);
HeaderRange = sectin.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;

HeaderRange.InsertAfter(")");

}
}
catch(Exception ex) {
MessageBox.Show(ex.Message);
}

もっと良い方法があるのかもしれません・・・