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が保存された。
結論
やはり、基本が大切です。