古いバージョンのWordで作成された文書を開くと、タイトル バーに「互換モード」と表示されることがあります。
詳細については「以前のバージョンの Word で作成された文書を Word 2010 で開く」にある通りで、互換モードになっていると一部の機能が制限されてしまいます。
今回は、文書が互換モードになっているかどうかを判定するWordマクロを紹介します。
DocumentオブジェクトのCompatibilityModeプロパティ
Word 2010で追加された、DocumentオブジェクトのCompatibilityModeプロパティを使うと、対象となる文書に設定されている、互換モードのバージョンを取得することができます。
上図はWord 2010で新規作成した文書(非互換モード)でCompatibilityModeプロパティの値を調べたもので、下図はWord 2003で作成したdocファイル(互換モード)のCompatibilityModeプロパティの値を調べたものです。
これだけを見ると、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プロパティの値を調べてみると、下図のようになります。
上図の通り、アプリケーションのバージョンが「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を除いて最も番号が大きい(新しいバージョン)のメンバーを調べるという、仰々しいコードになってしまいましたが、これでようやく文書が互換モードになっているかどうかを、調べることができるようになりました。
「変換」コマンドが有効かどうかで判定する方法
文書が互換モードになっているかどうかを調べるもう一つの方法として、互換モード時のみ有効な「変換」コマンドが有効になっているかどうかで判定する方法もあります。
Private Function IsCompatibilityMode() As Boolean IsCompatibilityMode = Application.CommandBars.GetEnabledMso("UpgradeDocument") End Function
コードは上記のように大分すっきりしますが、文書ごとの判定ができなくなりますので、文書を指定して互換モードかどうかを判定したい場合には、先に挙げたコードの方を使用するようにしてください。
この記事へのコメントはありません。