Excel VBA | Subプロシージャ(マクロ)の考え方

VBA
スポンサーリンク

Subプロシージャ 演習問題(中級向け 10問)

今回は 「中級向けのSub演習」10問 を紹介します。
テーマは 実務でよく使う処理(ループ・入力チェック・複数シート・引数活用・まとめSub) です。
すべて 解答コード+詳細解説付き です。


問題11:空白セルを探してメッセージを出す

A1〜A10 の中で 最初に空白のセル を見つけ、その番地を MsgBox に表示してください。
空白がない場合は「空白なし」と出す。


解答11

Sub FindFirstBlank()
    Dim i As Long

    For i = 1 To 10
        If Range("A" & i).Value = "" Then
            MsgBox "最初の空白は A" & i
            Exit Sub
        End If
    Next i

    MsgBox "空白なし"
End Sub
VB

解説

  • 空白なら If Range("A" & i).Value = "" で判定
  • 見つけた時点で Exit Sub で終了
  • 10回ループして見つからない場合は「空白なし」

問題12:値が10以上のセルをカウントして表示

A1〜A20 の中で 10以上の数値が何個あるか 数えて表示してください。


解答12

Sub CountOver10()
    Dim i As Long
    Dim cnt As Long

    For i = 1 To 20
        If Range("A" & i).Value >= 10 Then
            cnt = cnt + 1
        End If
    Next i

    MsgBox "10以上のセルは " & cnt & " 個です"
End Sub
VB

解説

  • 条件に合うときだけカウンタを+1
  • 実務では「条件に一致するレコード数」をよく数える

問題13:シート名一覧をA列に書き出す

現在のブックの全シート名を、A1〜順番に書き出してください。


解答13

Sub ListSheets()
    Dim i As Long

    For i = 1 To Worksheets.Count
        Range("A" & i).Value = Worksheets(i).Name
    Next i
End Sub
VB

解説

  • Worksheets.Count でシート数
  • Worksheets(i).Name でシート名取得
  • 実務で「ブック情報収集」で超よく使う

問題14:特定シートのセル内容を別シートに転記

Sheet1 の A1〜A10 を Sheet2 の B1〜B10 にコピーする Sub を作ってください。


解答14

Sub CopyToAnotherSheet()
    Dim i As Long

    For i = 1 To 10
        Worksheets("Sheet2").Range("B" & i).Value = _
            Worksheets("Sheet1").Range("A" & i).Value
    Next i
End Sub
VB

解説

  • 複数シートを扱う場合は Worksheets("名前") を明示する
  • 実務では頻出(集計、レポート作成など)

問題15:引数で範囲と書き込む値を指定する Sub

以下のように呼び出すと、指定範囲に同じ値を入れる Sub を作ってください。

例:
FillRange "A1:A5", 100


解答15

Sub FillRange(rng As String, v As Variant)
    Range(rng).Value = v
End Sub

Sub TestFillRange()
    FillRange "A1:A5", 100
End Sub
VB

解説

  • Variant を使うと数値・文字どちらにも対応
  • 引数で柔軟な処理を書ける(再利用性UP)

問題16:エラーが起きても続行する安全な処理

A1〜A10 のセルを数値に変換して合計してください。
ただし 文字列があってもエラーで止まらないように 作ってください。


解答16

Sub SafeSum()
    Dim i As Long
    Dim s As Double

    On Error Resume Next    ' エラーを無視して続行

    For i = 1 To 10
        s = s + CDbl(Range("A" & i).Value)
    Next i

    On Error GoTo 0         ' エラー無視を解除

    MsgBox "合計は " & s
End Sub
VB

解説

  • On Error Resume Next でエラーでも止まらない
  • CDbl で数値変換
  • 実務の「混在データの集計」でよく使う

問題17:空白をスキップして合計

A1〜A20 のうち 空白を除いた数値だけを合計 する Sub を作ってください。


解答17

Sub SumSkipBlank()
    Dim i As Long
    Dim s As Double

    For i = 1 To 20
        If Range("A" & i).Value <> "" Then
            s = s + Range("A" & i).Value
        End If
    Next i

    MsgBox "空白を除いた合計 = " & s
End Sub
VB

解説

  • 判定は <> ""
  • 「有効データだけ処理する」という実務で重要な考え方

問題18:行ごとに最大値を求めて書き込む

A〜C列の値のうち、行ごとに最大値を求めて
D列に書き込む Sub を作ってください。
対象:1〜10行


解答18

Sub MaxToD()
    Dim i As Long
    Dim maxValue As Double

    For i = 1 To 10
        maxValue = WorksheetFunction.Max(Range("A" & i & ":C" & i))
        Range("D" & i).Value = maxValue
    Next i
End Sub
VB

解説

  • Excelの関数 MAXWorksheetFunction.Max として使える
  • Range("A1:C1") のように行をまとめて渡す
  • 行ごとに集計というのは実務で非常によくある

問題19:指定範囲内の“文字列セル”だけ色を塗る

A1〜A20 の中で 文字列が入っているセルだけ
背景色を黄色にする Sub を作ってください。


解答19

Sub ColorTextCells()
    Dim i As Long
    Dim v As Variant

    For i = 1 To 20
        v = Range("A" & i).Value

        If VarType(v) = vbString Then
            Range("A" & i).Interior.Color = vbYellow
        End If
    Next i
End Sub
VB

解説

  • VarType(v) = vbString で「文字列か?」を判定
  • .Interior.Color = vbYellow で背景色変更
  • 実務で「データの種類ごとに色分け」する場面で有用

問題20:3つのSubをまとめて動かす“メイン処理”を作る

次の3つの Sub を用意して、
MainProcess で順番に呼び出すプログラムを作ってください。

  1. ClearAll:A1〜A10 の内容を消す
  2. InputSample:A1〜A10 に 1〜10 を入力
  3. CalcTotal:合計を B1 に書く

解答20

Sub MainProcess()
    ClearAll
    InputSample
    CalcTotal
End Sub

Sub ClearAll()
    Range("A1:A10").ClearContents
End Sub

Sub InputSample()
    Dim i As Long
    For i = 1 To 10
        Range("A" & i).Value = i
    Next i
End Sub

Sub CalcTotal()
    Dim i As Long
    Dim s As Long
    For i = 1 To 10
        s = s + Range("A" & i).Value
    Next i
    Range("B1").Value = s
End Sub
VB

解説

  • MainProcess で全体の流れを管理
  • 「データ準備 → 入力 → 計算 → 結果表示」という
    実務で頻出の“メインSubパターン”

まとめ:中級編で身につくこと

今回の 10問で学べるスキル:

  • 条件分岐(文字列判定・空白判定)
  • 複数シート操作
  • 引数の活用(汎用的なSub)
  • エラー処理(On Error)
  • Excel関数の利用(WorksheetFunction)
  • メインSubで処理を整理する設計力

これらは 日常の業務マクロの8割をカバー します。

VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました