【VBAリファレンス】VBA練習問題練習問題19(総合練習1)

スポンサーリンク

VBA総合演習:業務自動化への登竜門

Excel VBAを習得する過程において、個別の文法(ループ、条件分岐、変数、配列)を理解することと、それらを組み合わせて「実務的な成果物」を作り上げることは別次元のスキルです。本稿では、これまで学んだ知識を総動員して取り組むべき「総合練習1」というテーマを掲げます。

この演習の目的は、単にコードを動かすことではありません。可読性、保守性、そしてエラーハンドリングという、プロのエンジニアが現場で最も重視する「品質」の観点を養うことにあります。多くの初学者が陥る「動けばいいコード」から脱却し、誰が読んでも理解できる「資産としてのコード」を書くためのステップを解説します。

総合練習1の要件定義と設計思想

今回の総合練習1では、以下の3つの機能を備えたツールを作成します。

1. データ抽出:特定のシートから条件に合致するデータを別シートに転記する。
2. データ加工:抽出したデータに対して、四則演算や日付フォーマットの変換を行う。
3. ユーザーフィードバック:処理の開始から終了までをステータスバーやメッセージボックスで通知する。

設計において重要なのは「宣言の徹底」と「オブジェクトの明示」です。`Option Explicit`を記述し、すべての変数を型指定することは大前提です。また、`Worksheets(“Sheet1”)`のようにシートを直接参照するのではなく、オブジェクト変数に格納することで、コードの柔軟性を確保します。

詳細解説:プロが意識する実装テクニック

総合練習を進める上で、特に習得すべきテクニックが3点あります。

1. 最終行の動的取得:
`Cells(Rows.Count, 1).End(xlUp).Row` を用いて、データ量が増減しても対応できるようにします。ハードコーディング(数値を直接書くこと)はバグの温床です。

2. 画面更新の停止:
`Application.ScreenUpdating = False` を使用することで、処理中の画面描画を停止し、実行速度を劇的に向上させます。これはVBAのパフォーマンスにおいて最も即効性のあるテクニックです。

3. エラーハンドリング:
`On Error GoTo ErrorHandler` を活用し、予期せぬエラーが発生した際に、ユーザーに分かりやすいメッセージを表示し、かつリソースを解放する仕組みを構築します。

サンプルコード:実務レベルのデータ転記ツール

以下に、上記の要件を満たすサンプルコードを提示します。このコードは、元データから「売上が50,000円以上」のデータを抽出し、別のシートに転記する一連の流れを実装しています。


Option Explicit

Sub DataProcessingTask()
    ' 1. 変数宣言
    Dim wsSource As Worksheet, wsDest As Worksheet
    Dim lastRow As Long, i As Long, targetRow As Long
    
    ' 2. エラーハンドリング設定
    On Error GoTo ErrorHandler
    
    ' 3. 画面更新停止
    Application.ScreenUpdating = False
    
    Set wsSource = ThisWorkbook.Worksheets("DataList")
    Set wsDest = ThisWorkbook.Worksheets("Report")
    
    ' 転記先シートをクリア
    wsDest.Range("A2:C1000").ClearContents
    
    lastRow = wsSource.Cells(wsSource.Rows.Count, 1).End(xlUp).Row
    targetRow = 2
    
    ' 4. ループ処理によるデータ抽出
    For i = 2 To lastRow
        ' 売上が50,000以上の場合
        If wsSource.Cells(i, 3).Value >= 50000 Then
            wsDest.Cells(targetRow, 1).Value = wsSource.Cells(i, 1).Value
            wsDest.Cells(targetRow, 2).Value = wsSource.Cells(i, 2).Value
            wsDest.Cells(targetRow, 3).Value = wsSource.Cells(i, 3).Value
            targetRow = targetRow + 1
        End If
    Next i
    
    MsgBox "処理が正常に完了しました。", vbInformation
    
ExitSub:
    ' 5. 画面更新再開と後片付け
    Application.ScreenUpdating = True
    Exit Sub

ErrorHandler:
    MsgBox "エラー番号:" & Err.Number & vbCrLf & "内容:" & Err.Description, vbCritical
    Resume ExitSub
End Sub

実務アドバイス:なぜこのコードが良いのか

上記のコードは、なぜ実務的と言えるのでしょうか。それは「拡張性」が考慮されているからです。例えば、抽出条件を変更したい場合、`If`文の条件式を書き換えるだけで対応可能です。また、`targetRow`変数を用いて転記先を管理しているため、行が詰まることもありません。

現場のエンジニアは、コードを書く際に「半年後の自分がこれを見て理解できるか」を常に自問自答します。コメントを適切に入れ、インデント(字下げ)を整えることは、単なるマナーではなく、チーム開発における必須スキルです。

また、実務では「データの整合性」が最も重要です。今回の練習では、転記前に`ClearContents`で既存データを削除していますが、これは「古いデータが残ったまま新しいデータが上書きされる」というミスを未然に防ぐための重要なプロセスです。こうした細かな配慮が、信頼されるツールを生み出します。

総合練習1を終えた先の展望

本演習を完璧にこなせるようになったら、次は「配列を用いた高速化」に挑戦してください。今回のコードはセルを一つずつ読み書きしていますが、データ量が数万件を超えると処理速度が低下します。配列(Array)にデータを一括で格納し、メモリ上で処理を行ってからシートに書き戻す手法を学ぶことで、VBAのスキルは一段上のステージへと進化します。

また、`Dictionary`オブジェクトを用いた重複排除や、`FileSystemObject`を用いた外部テキストファイルの操作など、VBAの可能性は無限に広がっています。まずはこの「総合練習1」で、VBAの基本骨格を体に染み込ませてください。

まとめ

VBA総合練習1は、単なるプログラミングのテストではありません。それは、業務プロセスを論理的に分解し、最適なツールへと落とし込む「エンジニアリングの思考」を鍛える場です。

1. 宣言の徹底とオブジェクト参照の明示。
2. 最終行取得や画面更新停止によるパフォーマンスへの配慮。
3. エラーハンドリングによる堅牢なコードの構築。

これら3つの柱を意識して取り組むことで、あなたのExcel VBAスキルは確実に実務レベルへと引き上げられます。コードは、あなたの思考の写し鏡です。美しく、効率的で、誰にとっても優しいコードを書くことを目指してください。この練習をやり遂げた時、あなたは既に「Excelを動かす人」から「業務を自動化するエンジニア」へと変貌を遂げているはずです。自信を持って、一歩ずつ進んでいきましょう。

タイトルとURLをコピーしました