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

2017年9月11日

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

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

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

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

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

マクロの解説

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

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

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

 

-コード
-,

S