前回の記事「【コード】所定のスタイル以外を削除する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





