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関連

    指定したフォルダ内の画像ファイルを一括挿入するPowerPointマクロ

    大量の画像ファイルを1枚/1スライドで挿入する必要があり、…

  2. Office関連

    [Excel Services ECMAScript]ActiveWorkbookのシート数を取得す…

    埋め込んだExcelワークブックのシート数を取得するコードです。 …

  3. Office関連

    格子状にガイドを追加するPowerPointマクロ

    前回の記事で、PowerPoint 2013で追加されたGuide、G…

  4. アイコン一覧

    Office 2013 アイコン一覧(W)

    ・Office 2013 アイコン一覧 NUM…

  5. Office関連

    Outlookを使ってGmail送信を行うVBAマクロ

    下記G Suite アップデート ブログにある通り、今年の6月には“安…

コメント

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

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

Time limit is exhausted. Please reload CAPTCHA.

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

Translate

最近の記事

アーカイブ

PAGE TOP