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

  • 3
    Like
  • 0
    Comment
More than 1 year has 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);
            }

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