私はResumeの意味が分かっていなかった
Resumeステートメントの意味が分かっていなかった
Resumeステートメントの意味
久しぶりに『Excel VBA本格入門』(大村あつし著)を読み返していたら、
「Resumeステートメント」を引数なしで使うと、エラーの原因となったステートメントに制御が戻ります。
とあった。
( ゚д゚)ポカーン
え??? そうだったの???
知らんかった……。
てっきり「Resume Next」で一つなんだと思っていたよ……。
あー、恥ずかし。
体系的に学んでいないと、こういう初歩的なところでつまづいているんだよなあ。
ということは、エラーが出た後、GoToでエラー処理ブロックに飛んだ後、リトライできるってことか。
……というわけで、やってみた。
PDF変換クラスを改良する
このとき作成したDocPDFConverterクラスの、WordドキュメントをPDFに変換して保存するメソッドなんだが、
同名のPDFが開いている状態で実行するとエラーが出る
という欠陥があった。
こいつをResumeステートメントを活用して改良してみよう。
コードの改良
リスト1
Public Sub convertDocToPDF(ByRef doc As Word.Document, _ ByVal tgtFolderName As String, _ Optional ByVal addStr As String = "") Set objDoc_ = doc objPath_ = doc.Path objFileName_ = doc.Name Dim nameStr As String nameStr = Left(objDoc_.Name, InStrRev(objDoc_.Name, ".") - 1) objDoc_.Range(1, 1).Select objDoc_.ExportAsFixedFormat _ OutPutFileName:=objPath_ & "\" & tgtFolderName & "\" & addStr & nameStr & ".pdf", _ ExportFormat:=wdExportFormatPDF '……(*)' DoEvents End Sub
(*)のところでPDFファイルを生成するわけだが、引数OutPutFileNameに渡すファイルフルパスと同じフルパスを持ったPDFファイルが開いている状態で実行するとエラーが出る。
そこで、(*)のところを次のリスト2のように書き換える。
リスト2
On Error GoTo ErrorCatch '……(1)' objDoc_.ExportAsFixedFormat _ OutPutFileName:=objPath_ & "\" & tgtFolderName & "\" & addStr & nameStr & ".pdf", _ ExportFormat:=wdExportFormatPDF '……(*)' DoEvents Exit Sub '……(2)' ErrorCatch: nameStr = nameStr & "_" '……(3)' Resume '……(4)'
まず、エラーが発生源である(*)の手前のところで、(1)のように
On Error GoTo ErrorCatch
と書いておく。これで、(*)のところでエラーが出たらErrorCatchラベルにジャンプすることになる。
エラーが出ていなければ、ErrorCatchラベル以下のコードを実行する必要はないので(2)の
Exit Sub
で処理を抜ける。
で、エラーが出ていた場合は、(3)、(4)が実行されることになる。
(3)の
nameStr = nameStr & "_"
では、生成されるファイル名の素材である変数nameStrに「_」(半角アンダースコア)を追加している。
これで、エラーが出たときとは異なるファイル名になるはず。
その後、(4)の
Resume
で(*)の処理にリトライすることになる。
もしそこで再度エラーが出たら、ErrorCatchラベルのところにジャンプして、さらにファイル名に"_"を追加してリトライ、ということになるので、無事に保存が終わるまで繰り返すことになるはず。
実行結果
普通に実行したら「【写】実験用サンプル.pdf」というファイルが生成されるはずの処理を、
この状態で実行してみた。
この通り、無事にファイル名を変えてPDFが保存された。
結論
やはり、基本が大切です。