前回の記事「【コード】所定のスタイル以外を削除するWordマクロ 」で紹介したマクロを応用したところ、スタイルを削除できないケースがありました。
文書に存在しているはずのスタイルを削除しようとしているのに、「この名前のスタイルは存在しません。」というエラーメッセージ(エラー番号 5122)が表示されてしまいました。
エラーがでた時には、私はこのマクロを別のプロシージャーから呼び出しており、処理対象とする文書(visible:=falseの状態)をオブジェクト変数として引き渡して処理をしていました。
なお、前回の記事のマクロでは、開いている文書(ActiveDocument)を処理対象にしています(前回記事の33行目)。この状態であればマクロでは大丈夫です。
実は、これがエラー回避のヒントでした。エラーを回避する方法を見つけましたので紹介します。
<目次>
マクロの解説
35行目のように、処理対象である myDoc をActivate します。このことで、myDoc がActiveDocument になるのです。
この処理だけでエラーメッセージが出なくなりました。めでたしめでたし。
文書のスタイルを処理しているときに理解ができないエラーが発生した場合、処理対象の文書をActivateしてみるといいかもしれません。
マクロ改良例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | 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 |