前回の記事「【コード】所定のスタイル以外を削除するWordマクロ 」で紹介したマクロを応用したところ、スタイルを削除できないケースがありました。
文書に存在しているはずのスタイルを削除しようとしているのに、「この名前のスタイルは存在しません。」というエラーメッセージ(エラー番号 5122)が表示されてしまいました。
エラーがでた時には、私はこのマクロを別のプロシージャーから呼び出しており、処理対象とする文書(visible:=falseの状態)をオブジェクト変数として引き渡して処理をしていました。
なお、前回の記事のマクロでは、開いている文書(ActiveDocument)を処理対象にしています(前回記事の33行目)。この状態であればマクロでは大丈夫です。
実は、これがエラー回避のヒントでした。エラーを回避する方法を見つけましたので紹介します。
<目次>
マクロの解説
35行目のように、処理対象である myDoc をActivate します。このことで、myDoc がActiveDocument になるのです。
この処理だけでエラーメッセージが出なくなりました。めでたしめでたし。
文書のスタイルを処理しているときに理解ができないエラーが発生した場合、処理対象の文書をActivateしてみるといいかもしれません。
マクロ改良例
Sub 所定のスタイル以外を削除するマクロ(myDoc As Document) Dim n As Integer Dim nMax As Integer 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 '------------------------------------------- '文書中のスタイルの削除 '------------------------------------------- n = 0 nMax = myDoc.Styles.Count myDoc.Activate 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 myDic = Nothing End Sub