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

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

関連記事

  1. Office関連

    Officeファイルから作成者などのプロパティを取得するVBScript

    下記記事でも書いていますが、xlsxやdocxといった、OOXML形式…

  2. Office関連

    関数一覧(Excel 2013)

    関数の挿入ダイアログから抽出したExcel 2013の関数情報を表にし…

  3. Office関連

    テーブルの罫線色情報を列挙するPowerPointマクロ

    テーブルが多いプレゼンテーションファイルの、各テーブルの線の色の情報を…

  4. Office関連

    Excel REST APIをPowerShellから呼び出す方法

    以前Excel REST APIをVBAから呼び出す方法を紹介しました…

  5. アイコン一覧

    Office 365アイコン(imageMso)一覧(S)

    Office 365のデスクトップ版Officeアプリケーション(Wo…

  6. Office関連

    jQuery UIのDatepickerをVBAから使用するサンプル

    2014/1/31 追記:Internet Explorerのオー…

コメント

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

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

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

RapidSSL_SEAL-90x50
PAGE TOP