【Word VBA】所定のスタイル以外を削除するWordマクロ

2017年9月11日
この記事のマクロを利用してみたらエラーが出た場合の対処例
【コード】「この名前のスタイルは存在しません。」となりスタイルを削除できない場合の対処例 

スタイルを削除します。

以前、「【コード】Wordファイルからスタイルを全てコピーするWordマクロ」を紹介しました。

上記記事では、所定のファイルに登録されているスタイルをすべてコピーしました。今回の記事では、所定のファイルに登録されているスタイル以外をすべて削除します。

現在開発を担当している案件で、所定のテンプレートファイルに登録されているスタイルを残し、他のスタイルを削除する必要がでてきたのです。

スタイルのコピーでは、CopyStylesFromTemplate メソッドという便利なものがありますが、今回はそういう便利なものがないので、処理を作ってみました。

実務では、スタイルを単に削除してしまうのではなく、そのスタイルが使用中か否かを確認してから削除したりアラートを出したりログに記録したりと、必要に応じて対応した方がいいと思います。

このマクロでできること

11行目に指定されたスタイルのテンプレートファイルに登録されていないスタイルを処理対象のファイルから削除します。

マクロの解説

「処理対象のファイルのスタイル名」と「所定のスタイルテンプレートのスタイル名」の比較を1つ1つするのが大変なので、以下の2つの工程で処理をします。

  1. 所定のスタイルテンプレートのスタイル名を配列に読み込む(16行目~28行目)
  2. 処理対象のスタイル名と配列内のスタイル名と比較して削除する(33行目~50行目)

テンプレート内のスタイル名の読込みのために、一旦テンプレートファイルを開く必要があります。

16行目のようにテンプレートファイルに基づいて新規ファイルを作成すれば、テンプレートファイルに保存されているスタイルを確認できます。また、Visible:=False とすることで、ファイルを表示せずに開くことができます。

所定のスタイルテンプレートのスタイル名を保存する配列にDictionaryオブジェクトを使いました。

スタイル名は大文字・小文字や半角・全角を区別して登録できます。そこで、大文字・小文字や半角・全角を区別して配列に入れられるDictionaryオブジェクトが使えるわけです。スタイル名をDictionaryオブジェクトのキーとして登録します。

Dictionaryオブジェクトのキーを検索することで、配列内の文字列(キー)を完全一致で探すことができるのです。

スタイル名の判定は、DictionaryオブジェクトExistsメソッドを利用します(41行目)。

進捗状況をステータスバーに表示します(47行目~48行目)。

マクロ


Sub 所定のスタイル以外を削除するマクロ()
 
 Dim n As Integer
 Dim nMax As Integer
 Dim myDoc As Document '処理対象の文書
 Dim myDocStyle As Style 'myDocのスタイル
 Dim myTempDoc As Document 'テンプレートファイル
 Dim myTempDocStyle As Style 'myTempDocのスタイル
 Dim myDic As Object
 
 Const myTempFilePath As String = "C:\スタイルテンプレート.dotx"
 
 '-------------------------------------------
 'テンプレート内のスタイル名の読み込み
 '-------------------------------------------
 Set myTempDoc = Documents.Add(Template:=myTempFilePath, Visible:=False)
 
 '連想配列にスタイル名を登録する
 Set myDic = CreateObject("Scripting.Dictionary")
 
 For Each myTempDocStyle In myTempDoc.Styles
  myDic.Add myTempDocStyle.NameLocal, ""
 Next myTempDocStyle
 
 myTempDoc.Close SaveChanges:=wdDoNotSaveChanges
 DoEvents
 
 Set myTempDoc = Nothing
 
 '-------------------------------------------
 '文書中のスタイルの削除
 '-------------------------------------------
 Set myDoc = ActiveDocument
 
 n = 0
 nMax = myDoc.Styles.Count
 
 For Each myDocStyle In myDoc.Styles
  
  'テンプレート内のスタイル以外の場合に削除
  If myDic.Exists(myDocStyle.NameLocal) = False Then
   myDocStyle.Delete
   DoEvents
  End If
  
  'ステータスバーに処理状況を表示
  n = n + 1
  Application.StatusBar = n & " / " & nMax
    
 Next myDocStyle
 
 Set myDoc = Nothing
 Set myDic = Nothing
    
End Sub

トップへ戻る