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の関数
MAXをWorksheetFunction.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 で順番に呼び出すプログラムを作ってください。
- ClearAll:A1〜A10 の内容を消す
- InputSample:A1〜A10 に 1〜10 を入力
- 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割をカバー します。

