t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA バグの回避コードは別プロシージャに分離し、説明的な名前をつけ、懇切丁寧にコメントする。

プログラミングでどうにもならないバグに出会ったとき、そのバグを回避するコードを書くことになる。
バグの回避コードというのは厄介で、単体で読んでも一見何をやっているのかさっぱり分からないことが多い。

これをメインの処理コードに混ぜ込むと、メイン処理の理解を難しくさせる。
従って、バグ回避コードは短いものであっても別プロシージャに分離するのが望ましい。

また、プロシージャ名はそのプロシージャの機能を説明する簡潔な名前であることが望ましいが、バグの回避用プロシージャは簡潔さを犠牲にしてでも説明的な名称にこだわりたい。

以下、前回の記事で紹介したバグ回避用のプロシージャである。
長大な名称になっているが、「バグ 回避 for 数値書式コピー失敗」なので目的が一目瞭然。

Sub BugAvoidanceForNumberFormatCopyFail()
    Dim r As Range: Set r = ThisWorkbook.ActiveSheet.Cells(1, 1)
    Do Until r.Value = "" And r.Offset(1, 0).Value = ""
        Set r = r.Offset(1, 0)
    Loop
    r.Value = Date
    r.NumberFormat = "hh:mm:ss"
    r.Copy r.Offset(1, 0)
    Range(r, r.Offset(1, 0)).ClearContents
'Rem Reproducible bug code are below.
'Sub NumberFormatCopyFail
'    With ThisWorkbook.Sheets.Add
'        .Range("B1").Value = "22:00"
'        .Range("A1:B1").Copy
'        .Range("A2").Select
'    End With
'    ActiveSheet.Paste
'    Application.CutCopyMode = False
'End Sub
End Sub

最初はBugFixにしてたけど根本解決じゃないしなぁ。。ということでAvoidance(回避)とした。
「Workaround_NumberFormatCopyFailIssue」という名前でも良かったかな。

それから懇切丁寧にコメントする。
コードの挙動ではなく、目的をコメントすることが肝心。挙動はコードを見れば分かるし、少々複雑でもステップ実行すれば分かるが、それをもって一体何がしたいのかは説明がないと分からない。

前回工夫したのはこの部分。

'Rem Reproducible bug code are below.
'Sub NumberFormatCopyFail
'    With ThisWorkbook.Sheets.Add
'        .Range("B1").Value = "22:00"
'        .Range("A1:B1").Copy
'        .Range("A2").Select
'    End With
'    ActiveSheet.Paste
'    Application.CutCopyMode = False
'End Sub

これはパッと見、使わなくなった古いコードをコメントアウトしているだけに見えるけど、私はそれはしない主義。
実は日本語でつらつら説明するのが面倒だったので、バグの再現マクロをそのまま張り付けてコメント化するという新たな試みだった。
Reproducible bug code are below(再現可能なバグコードは以下)となんとなく気分で英語で書いてみたので苦手な方は単なる不要コードのコメントアウトに見えたかも。ごめん。。

以上。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。