古いバージョンの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
コードは上記のように大分すっきりしますが、文書ごとの判定ができなくなりますので、文書を指定して互換モードかどうかを判定したい場合には、先に挙げたコードの方を使用するようにしてください。






















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