Office関連

文書が互換モードかどうかを判定するWordマクロ

古いバージョンのWordで作成された文書を開くと、タイトル バーに「互換モード」と表示されることがあります。

詳細については「以前のバージョンの Word で作成された文書を Word 2010 で開く」にある通りで、互換モードになっていると一部の機能が制限されてしまいます。

今回は、文書が互換モードになっているかどうかを判定するWordマクロを紹介します。

DocumentオブジェクトのCompatibilityModeプロパティ

Word 2010で追加された、DocumentオブジェクトのCompatibilityModeプロパティを使うと、対象となる文書に設定されている、互換モードのバージョンを取得することができます。

Word_IsCompatibilityMode_01

上図はWord 2010で新規作成した文書(非互換モード)でCompatibilityModeプロパティの値を調べたもので、下図はWord 2003で作成したdocファイル(互換モード)のCompatibilityModeプロパティの値を調べたものです。

Word_IsCompatibilityMode_02

これだけを見ると、CompatibilityModeプロパティの値と文書を開いているWordのバージョン(ApplicationオブジェクトのVersionプロパティの値)が同じになっていれば、その文書は互換モードではない、下記コードのように判定できる、と言えるのですが、

Public Sub Sample()
  If ActiveDocument.CompatibilityMode = CLng(Application.Version) Then
    MsgBox ActiveDocument.Name & "は互換モードではありません。"
  Else
    MsgBox ActiveDocument.Name & "は互換モードです。"
  End If
End Sub

CompatibilityModeプロパティの値は必ずしもアプリケーションのバージョンと一致しているわけではありません。

たとえばWord 2016 Previewで同じようにCompatibilityModeプロパティの値を調べてみると、下図のようになります。

Word_IsCompatibilityMode_03

上図の通り、アプリケーションのバージョンが「16.0」になっているのに対し、CompatibilityModeプロパティの値は「15」となっています。

WdCompatibilityMode列挙体

実は、CompatibilityModeプロパティの値はWdCompatibilityMode列挙体と対応していて、この列挙体の既定値(すべての機能が有効)とCompatibilityModeプロパティの値が一致しているかどうかを調べることで、文書が互換モードになっているかどうかを判定することができます。

問題はWdCompatibilityModeの規定値を調べる方法ですが、一つの方法として、下記コードのように、DocumentオブジェクトのSetCompatibilityModeメソッドで互換モードを解除した文書から、CompatibilityModeプロパティの値を調べる方法があります。

Public Sub Sample()
  MsgBox "WdCompatibilityModeの規定値は" & GetCurrentCompatibilityMode() & "です。"
End Sub

Private Function GetCurrentCompatibilityMode() As Long
  Dim ret As Long

  With Application.Documents.Add
    .SetCompatibilityMode wdCurrent
    ret = .CompatibilityMode
    .Close SaveChanges:=wdDoNotSaveChanges
  End With
  GetCurrentCompatibilityMode = ret
End Function

ただし、上記コードの場合だと作業用の文書ファイルを一時作成・破棄することになるため、画面のちらつきが発生します。

TypeLib Informationを使ってWdCompatibilityModeの規定値を取得

このちらつきを抑えるため、TypeLib Information(tlbinf32.dll)を使って規定値を調べるようにしたのが下記コードです。

Option Explicit

Public Sub Sample()
  If IsCompatibilityMode(ActiveDocument) = True Then
    MsgBox ActiveDocument.Name & "は互換モードです。"
  Else
    MsgBox ActiveDocument.Name & "は互換モードではありません。"
  End If
End Sub

Public Function IsCompatibilityMode(ByVal doc As Word.Document) As Boolean
'対象ドキュメントが互換モードか否かを判定
  Dim ret As Boolean
  Dim ccm As Long

  ret = True '初期化
  ccm = GetCurrentCompatibilityMode()
  Select Case doc.CompatibilityMode
    Case wdCurrent, ccm: ret = False
  End Select
  IsCompatibilityMode = ret
End Function

Private Function GetCurrentCompatibilityMode() As Long
'WdCompatibilityMode列挙から最新バージョンの互換モードを取得(wdCurrent除外)
  Dim ta As Object
  Dim mi As Object
  Dim ret As Long
  Const adInteger = 3
  
  ret = 0 '初期化
  On Error Resume Next
  Set ta = CreateObject("TLI.TLIApplication")
  With CreateObject("ADODB.Recordset")
    .Fields.Append "CompatiVer", adInteger, 10
    .Open
    For Each mi In ta.TypeLibInfoFromFile("MSWORD.OLB") _
                     .Constants.NamedItem("WdCompatibilityMode").Members
      Select Case LCase(mi.Name)
        Case "wdcurrent"
        Case Else
          .AddNew
          .Fields("CompatiVer").Value = mi.Value
          .Update
      End Select
    Next
    .Sort = "CompatiVer DESC" 'バージョンで降順ソート
    .MoveFirst
     ret = .Fields("CompatiVer").Value
    .Close
  End With
  On Error GoTo 0
  GetCurrentCompatibilityMode = ret
End Function

WdCompatibilityModeのメンバーを調べ、wdCurrentを除いて最も番号が大きい(新しいバージョン)のメンバーを調べるという、仰々しいコードになってしまいましたが、これでようやく文書が互換モードになっているかどうかを、調べることができるようになりました。

Word_IsCompatibilityMode_04

「変換」コマンドが有効かどうかで判定する方法

文書が互換モードになっているかどうかを調べるもう一つの方法として、互換モード時のみ有効な「変換」コマンドが有効になっているかどうかで判定する方法もあります。

Word_IsCompatibilityMode_05

Private Function IsCompatibilityMode() As Boolean
  IsCompatibilityMode = Application.CommandBars.GetEnabledMso("UpgradeDocument")
End Function

コードは上記のように大分すっきりしますが、文書ごとの判定ができなくなりますので、文書を指定して互換モードかどうかを判定したい場合には、先に挙げたコードの方を使用するようにしてください。

VBAから扱えるDLLをC#で書いてみる。前のページ

類似した書式の文字列を選択するWordマクロ三種次のページ

関連記事

  1. Office関連

    代理人アクセスによって予定を追加するOutlookマクロ

    先日久々にmougの質問に回答しました。マクロを使って、Exc…

  2. Office関連

    スライド内容を自動的に機械翻訳するPowerPointマクロ

    前回の記事で紹介した各スライドに配置されたオートシェイプからテキストを…

  3. Office関連

    Wordマクロで文字数を取得する方法をまとめてみました。

    「蛍光ペンでマークした部分の文字数をカウントするWordマクロ」で蛍光…

  4. Office関連

    Adobe Readerを利用してPDFファイルのページ数を取得するVBAマクロ

    mougの回答用に書いたコードです。mougは半年でログが消えてし…

  5. Office関連

    [Office 2013]オンライン テンプレートを無効にする。

    前回の記事ではOffice 2013でSkyDriveを無効にする方法…

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP