LoginSignup
3
6

More than 5 years have passed since last update.

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

Posted at

過去に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);
            }

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

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6