2019-12-28に更新

VBAをパーフェクトにマスターするシリーズ♪ 4章「フロー制御ステートメント」「パーフェクトExcel VBA」

■前回までの記事

VBAにもっと詳しくなろう♪ 「パーフェクトExcel VBA」

VBAをパーフェクトにマスターするシリーズ♪ 2章「式と値」「パーフェクトExcel VBA」

VBAをパーフェクトにマスターするシリーズ♪ 3章「ステートメント」「パーフェクトExcel VBA」

続きを書きました。
VBAをパーフェクトにマスターするシリーズ♪
今回は「4章」で新しく知ったことと、思ったことを簡単にまとめました。

これは学習記録です。
書籍の内容は、あえて多くは載せていません。
大事なことも省いていますので、詳細につきましては、ぜひ書籍をご覧ください。

■4章「フロー制御ステートメント」

4-2  Select Caseステートメント

4-2-3 文字列を判定する

式リストにToキーワードやIsキーワードを用いることで、文字列が指定の範囲に含まれるかという判定が可能です。

Sub MySub()
    Dim c As String
    Select Case c
        Case "0" To "9"
            '半角数字
        Case "A" To "Z", "a" To "z"
            '半角アルファベット
        Case Else

    End Select
End Sub

正規表現で指定するのではなく、こんな書き方もできるそうです!
知りませんでした。

4-4 For Each ~ Next ステートメント

4-4-2 コレクションに対する反復処理

Excel VBAでは、多くのオブジェクトについてその集合を表すコレクションが用意されています。
たとえば、Wrokbooks、Worksheets、Range、ListRowsなどです。

多くのコレクションは、その要素数を返すCountプロパティを持ちますので、For ~ Next ステートメントで代替することも可能です。

4-4-3 配列に対する反復処理

配列に対する反復処理の場合は、ループ内で使用する変数をVariantg型にする必要があり、その点でわかりづらくなってしまうというデメリットがあります。

For ~ Next文の初期値にLBound関数、終了値にUBound関数を用いる記述を用いることのほうが多いようです。

    Dim numbers(1 To 3) As Long

    Dim i As Long
    For i = LBound(numbers) To UBound(numbers)
        Debug.Print numbers(i)
    Next i

私はFor~Nextのほうが好みなので、どちらかといえばEachを使わないことが多いです。

でもこういうときには、こっちのほうが便利でしょう?・・・と言われたらそうなのかな。

    Dim numbers(1, 1) As Long
    numbers(0, 0) = 0: numbers(1, 0) = 1
    numbers(0, 1) = 2: numbers(1, 1) = 3        
    Dim number  As Variant
    For Each number In numbers
        Debug.Print number
    Next number

「全部」の処理をしてる、というのがわかりやすいから、ということのようです。
入れ子になっても良いと思うのだけど、どうなんでしょう。
順番を指定して処理したいかどうか?というのも大きそうです。
おおよそ指定したいことが多いです、私の場合。

4-6 処理の終了とスキップ

4-6-1 Exitステートメント

Exit Property ・・・ Propertyプロシージャを終了する

「Exit Property」は知りませんでした。そんなのあるんだ。
っていうか「Propertyプロシージャ」って何だろう?(※5章に載ってました)

4-6-3 Exitステートメントによるループの終了

For文が入れ子になっているとき、内側のFor文から一気に外側のFor文も抜けたい場合、
外側をDo~Loop文、内側をFor文にして、Exit Doで一気に抜けられるテクニックが載っていました。

私の場合、入れ子になっていて両方抜けたい場合は、フラグ(Boolean)を使っているような気がします。

4-6-4 GoToステートメントによるループのスキップ

他のプログラミング言語にはあるContinueがないので、ループのスキップにGoToが使えます、という話です。

本節で紹介したループのスキップ、4-7で紹介するエラー処理など、特定の目的以外での使用は避けたほうがよいでしょう。

乱用は避けましょう。

4-7 処理の中断

4-7-1 Stopステートメント

Stopの使い方。Stopでは必ず止まります。次のAssertは、

4-7-2 Debug.Assertステートメント

Debug.Assert booleanexpression

booleanexpressionはブール式で、Falseに評価された場合にのみ、処理を中断します。

異常値の検出にも有効です。

Debug.Assert cell.Value >= 0

→cell.Valueが負の数だと止まるので、

本来0以上の数のみしか存在しえないのであれば、負の数が検出された時点で処理が中断し、異常値への対応を行うことができます。

Debug.Assert、使っていなかったのですが、今後は活用したいと思います。

4-8 エラー処理

大事なエラー処理ですが、少し身構えてしまいます。

4-8-1 On Errorステートメント

On Error { GoTo line | Resume Next | GoTo 0 }

On Error Resume Next ・・・ エラー処理を有効にし、以降で発生したすべての実行時エラーを無視する
On Error GoTo 0  ・・・ 有効になっているエラー処理をすべて無効にする

4-8-2 エラー発生時に処理を分岐する
On Error GoTo line

    On Error GoTo ErrorHandler

     '~処理~

ErrorHandler:
    Debug.Print Err.Description

Err.Description が気になりました。
(Errオブジェクトについては9章で紹介されているそうです)

4-8-3 エラーを無視する
On Error Resume Next

エラーを無視してもその後の処理に影響がないという確信がある場合にのみ使用すべきでしょう。

最近、なんでここでエラー出るねん、と思って、そのあとの処理に影響なかったので、使ったことがあります。
あまり使いたくないです。

4-8-4 エラー処理を無効にする
On Error GoTo 0

    On Error Resume Next
    Debug.Print x / y
    Debug.Print "エラーが無視されました"
    On Error GoTo 0

On Error Resume Nextステートメントを使用する際には、その影響範囲を少なくすることができますので、積極的に使用するとよいでしょう。

この辺、すこし苦手意識があります。もっと慣れたいところです。平常心で挑みたい。
人が書いたコードにOn Error ~ と書いてあると、一瞬、ウッ、となるんですよね。何してるんだろうと思って、身構えてしまいます。
今回、本書を読んで、前より少し馴染めた気がします。実戦(戦い?)に活かしたいです。

4-8-5 Resumeステートメント

エラー処理ルーチンから、元の処理に戻ることもできます。

えっ、戻れるの?!

▼Resume ステートメントの種類
Resume  ・・・ エラーが発生したステートメントに処理を移す
Resume Next  ・・・ エラーが発生したステートメントの次のステートメントに処理を移す
Resume line ・・・ line で指定した行ラベルまたは行番号に処理を移す

    On Error GoTo ErrorHandler
    Dim x As Long, y As Long
    x = 1
    Debug.Print x / y

ErrorHandler:
    y = 5
    Resume

こんなことまでできてしまう!

・・・なのですが、

エラー処理を充実させるとコードが増え、可読性やメンテナンスの負荷が上がります。

ということなので、あまり書きすぎるのも良くないようです。
その辺、バランス良く考えてから、作りたいところです。

4-9 Withステートメント

4-9-2 Withステートメントのオブジェクト参照のしくみ

Withステートメントを使用するメリットはもう一つあります。オブジェクト参照の回数を減らせるということです。

実は、Withもあまり好きではないのですが(好みの問題)、使いますよね。
見やすい以外にも、処理が速い(体感できるかはさておき)ようです。

.

本章では、一般的にある程度使用されていると思われるものについては、隠さずに紹介をするようにしました。実際に、どれをどのように使用するかについてのヒントにも触れながら解説を進めましたが、都度「作法」と照らし合わせて、判断をするようにしてください。

とても大事でとても難しいポイントかなと思います。

次回はプロシージャです。
プロシージャ、、まだすぐに言葉の意味が理解できません。Subプロシージャ、Functionプロシージャ、等ですね。。。

私は「暗記」が非常に苦手です。プログラミングでは、カタカナや英語の略称が山ほど出てくるので、慣れるしかないですね。今までは雰囲気で理解していましたが(それを理解しているというのか?)、今回はゆっくり読んで、アウトプットもしながら、なので、反復でなじませていければと思っています。

▼著者サイト

書籍「パーフェクトExcel VBA」発売についてのお知らせ

▼Amazonリンク

パーフェクトExcel VBA (PERFECT SERIES)   高橋 宣成著

ツイッターでシェア
みんなに共有、忘れないようにメモ

view_list [連載]「パーフェクトExcelVBA」の本で勉強中〜
第2回 VBAをパーフェクトにマスターするシリーズ♪ 2章「式と値」「パーフェクトExcel VBA」
第3回 VBAをパーフェクトにマスターするシリーズ♪ 3章「ステートメント」「パーフェクトExcel VBA」
第4回 VBAをパーフェクトにマスターするシリーズ♪ 4章「フロー制御ステートメント」「パーフェクトExcel VBA」
第5回 VBAをパーフェクトにマスターするシリーズ♪ 5章「プロシージャ」「パーフェクトExcel VBA」
第6回 VBAをパーフェクトにマスターするシリーズ♪ 6章-1「モジュール」「パーフェクトExcel VBA」

Hata

個人でアプリを作ってたりなかったり(゚ω゚)。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント