2017年9月11日 この記事のマクロを利用してみたらエラーが出た場合の対処例 【コード】「この名前のスタイルは存在しません。」となりスタイルを削除できない場合の対処例
スタイルを削除します。
以前、「【コード】Wordファイルからスタイルを全てコピーするWordマクロ」を紹介しました。
上記記事では、所定のファイルに登録されているスタイルをすべてコピーしました。今回の記事では、所定のファイルに登録されているスタイル以外をすべて削除します。
現在開発を担当している案件で、所定のテンプレートファイルに登録されているスタイルを残し、他のスタイルを削除する必要がでてきたのです。
スタイルのコピーでは、CopyStylesFromTemplate メソッドという便利なものがありますが、今回はそういう便利なものがないので、処理を作ってみました。
実務では、スタイルを単に削除してしまうのではなく、そのスタイルが使用中か否かを確認してから削除したりアラートを出したりログに記録したりと、必要に応じて対応した方がいいと思います。
<目次>
このマクロでできること
11行目に指定されたスタイルのテンプレートファイルに登録されていないスタイルを処理対象のファイルから削除します。
マクロの解説
「処理対象のファイルのスタイル名」と「所定のスタイルテンプレートのスタイル名」の比較を1つ1つするのが大変なので、以下の2つの工程で処理をします。
- 所定のスタイルテンプレートのスタイル名を配列に読み込む(16行目~28行目)
- 処理対象のスタイル名と配列内のスタイル名と比較して削除する(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