読者です 読者をやめる 読者になる 読者になる

私は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」と「【写】実験用サンプル_.pdf」の2つが開いています。

この状態で実行してみた。

「【写】実験用サンプル__.pdf」が新たに生成されたPDFファイルです。

この通り、無事にファイル名を変えてPDFが保存された。

結論

やはり、基本が大切です。

@akashi_keirin on Twitter