[VBA] On Error Resume Next で条件判定の次の行

VBAではエラーが発生しても、処理を継続させるための構文として On Error Resume Next が用意されている。
これを使えば、エラー発生時にも処理位置が次の行に移って、処理が継続される。

Visual Basic言語リファレンス On Error ステートメント
On Error Resume Next は、実行時エラーを発生させたステートメントの直後のステートメント、または、On Error Resume Next ステートメントを含むプロシージャの最新の呼び出しに続くステートメントで、実行を続行します。

うん、まあだいたいは分かるけど、If文の判定条件でエラーが発生したりすると、制御はどこに移動するんだろう?

[WSH] Windowsのコマンドプロンプトで正規表現を使って、文字列置換

ファイルや標準出力の内容を文字列置換したいなんてことはよくあるよね。
こんなときUnixだと、sedやawkを使うところだけど、Windowsのコマンドプロンプトでは該当するコマンドが用意されていない。
バッチに変数の文字列置換をする機能はあることはあるけど、バッチでループをするのもなんだし、正規表現も使えない。

もちろん、PowerShellを使うって選択肢もあるけど、PowerShellはPowerShellの中に閉じた世界で、既存のコマンドとの連携がしにくいってのがある。

で、Windowsに標準搭載されている機能でなんとかしようとすると、WSHでスクリプトを組んでしまうのが一番簡単だと思う。

[VBA] IsError関数によるエラー処理

VBAには On Error によるエラートラップ以外にIsError関数によるエラー判定方法が存在する。

"On Error" or "IsError" ?

例えば、引数が負数であればエラーとする処理は以下のようになる。
Function MustBePositiveOnErr(ByVal v As Long) As Variant
    MustBePositiveOnErr = v

    If v < 0 Then
        Err.Raise 5 ' Invalid Procedure call or argument.'
    End If
End Function

例外処理に慣れたプログラマであれば、なんということもない処理だね。

CVErrは整数値をErr型に変換してくれる。
ただし、CVErrを使った関数は戻り値の型をVariantにする必要がある。

[VBA] VBAの条件演算子は短絡評価にならない

タイトルどおりだけど、VBAの条件演算子は短絡評価にならない。
どういうことかというと、以下のようなNULLチェックがうまくいかない。
If x = Nothing Or x.Foo = "abc" then
これはxがNothingではない場合に限って、x.Fooを参照することを意図している。

でも、VBAのOr演算子は2項の演算項を両方とも評価してから、Or演算を実行するので、xがNothingの場合も x.Foo = "abc" が評価されて実行時エラーが発生してしまう。