【コード】「この名前のスタイルは存在しません。」となりスタイルを削除できない場合の対処例

前回の記事「【コード】所定のスタイル以外を削除するWordマクロ 」で紹介したマクロを応用したところ、スタイルを削除できないケースがありました。

文書に存在しているはずのスタイルを削除しようとしているのに、「この名前のスタイルは存在しません。」というエラーメッセージ(エラー番号 5122)が表示されてしまいました。

エラーがでた時には、私はこのマクロを別のプロシージャーから呼び出しており、処理対象とする文書(visible:=falseの状態)をオブジェクト変数として引き渡して処理をしていました。

なお、前回の記事のマクロでは、開いている文書(ActiveDocument)を処理対象にしています(前回記事の33行目)。この状態であればマクロでは大丈夫です。

実は、これがエラー回避のヒントでした。エラーを回避する方法を見つけましたので紹介します。

マクロの解説

35行目のように、処理対象である myDocActivate します。このことで、myDocActiveDocument になるのです。

この処理だけでエラーメッセージが出なくなりました。めでたしめでたし。

文書のスタイルを処理しているときに理解ができないエラーが発生した場合、処理対象の文書を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

トップへ戻る