ナビゲーション リンクのスキップホーム > さくっと解決シリーズ > マクロでテンプレート名が取得できたりできなかったりするモヤモヤをさくっと解決(Microsoft Word Interop)

マクロでテンプレート名が取得できたりできなかったりするモヤモヤをさくっと解決(Microsoft Word Interop)

このページは、2016年12月5日現在の情報に基づいて掲載しております。
情報の信頼性は、法令の改正や温暖化の進行具合、摂取したコラーゲンの量、ムカデがどの足から歩き出したか等の様々な事象の影響を受け、日々刻々と常に変化しております。

Microsoft Word®で何かやってハマって解決策を求めてWeb航海に出てみると、なぜだか英語の情報に行き当たることが多いものです。
中学や高校で習うような文法に沿ったものであればまだ読めるのですが、これがQ&Aサイトだったりすると、何と言いますか・・・読んでるだけで体が踊り出してくるような躍動感溢れるリズミカルな表現だったりしてまして、つられた体の動きが止まるまで待たねばならないこともしばしばでして、理解するまでに時間がかかる傾向があります(僕だけかも知れませんが・・・)。
それでも有益な情報を残してくれているんだなとわかれば感謝もひとしおですが、そこに落ち着くまでが毎回大変だったりします。

Microsoft Word®を使う日本人は少なからずいるわけですが、それでいて日本語の情報が落ちていないということは、発信しない人が多いということなのでしょうか。
そうしたこともあって、いろいろと情報発信していこうと思い立ったのが、この「さくっと解決シリーズ」を始めたきっかけでありますが、「こんな情報、誰も欲しがらないだろう」と決め込む前に、些細なことでも発信していける日本人でありたいなと思う今日この頃です。

そんなわけで、今回は、適用されたテンプレートの名前をマクロで取得する方法と、設定する方法についてです。

AttachedTemplateというプロパティはあるけれども・・・

Documentオブジェクトに、AttachedTemplateというそのものズバリなプロパティが用意されております。
[MSDN] Document.AttachedTemplate プロパティ

これ使えばいけるよ~!ってだけなら、わざわざ本稿を書こうとは思わないわけですが、このプロパティ、設定するときはいいのですが、取得するときには本稿の表題のような難があります。
数ファイルで試して取得できたと喜ぶことはできても、実際に運用し始めたあとで取得できたりできなかったりする事態に見舞われることになります。

上記のMSDNの解説をよくよく見てみるとわかるのですが、このプロパティの値はObject型であり、Templateインタフェースという得体の知れないものを返してくるのです。
[MSDN] Template Interface(英語)

ある1つのテンプレートは、Templatesコレクションに含まれる1つのTemplateインタフェースという位置づけでありますから、そもそもTemplatesコレクションに含まれていないテンプレートに関する情報は、取得することが基本的に無理なんだろうと考えますが、そうであれば全く取得できないという結果であって欲しいわけで、取得できたりできなかったりするから問題を複雑にしているのかなと。
というのも、標準の「ユーザーテンプレート」フォルダに、適用されたテンプレートが置かれていないからといって、必ずしも取得できないわけではないということを目の当たりにしてしまったからなんですけどね。
本件は、Microsoft®さんに問い合わせることなく解決してしまったので、なぜこのような動きになるのか細かく掘り下げておりませんが、上述したような辺りにモヤモヤの原因があるということをここでは書き残しておこうと思います。

なお、テンプレートを設定するだけであれば、MSDNの解説のとおり、テンプレートの名前(フルパス)を指定すれば設定できます。

適用されているテンプレートの名前を取得する

次のコードを実行することで、適用されているテンプレートの名前を取得することができます。

Public Sub GetTemplate()
    Dim WdDoc As Document
    Dim TemplateName As String
    
    Set WdDoc = ActiveDocument
    TemplateName = WdDoc.BuiltInDocumentProperties("Template")
    
    '値を利用するコード
    
    Set WdDoc = Nothing
End Sub

"Normal.dotm" のように、拡張子を含む形で、適用されているテンプレートの名前を取得することができます。

テンプレートを設定する

次のコードを実行することで、テンプレートを設定することができます。
標準の「ユーザーテンプレート」フォルダに配置してある場合でも、フルパスで指定する必要がありますのでご注意ください。

Public Sub SetTemplate()
    Dim WdDoc As Document
    
    Set WdDoc = ActiveDocument
    WdDoc.AttachedTemplate = Options.DefaultFilePath(wdUserTemplatesPath) & "\" & "hogefuga.dotm"
    
    Set WdDoc = Nothing
End Sub
下線部は、標準の「ユーザーテンプレート」フォルダを取得する構文。

フルパスで指定することで、設定することができます。
存在しないテンプレートを指定すると、例外が発生します。

とまぁ、今回は簡潔にさくっと書きましたが、「Hey you! テンプレートの名前を取得するときは、こうするんだぜ!」みたいなノリの英語版Q&Aよりはよっぽど親切だと感じてもらえると信じたいところです。

本サイトは、下記のサイトポリシーに同意いただいたうえでご利用ください。

サイトポリシー | お問い合わせ | 運営会社(株式会社GAIDE)

Copyright © 2016 GAIDE CO., LTD. All rights reserved.