「とりあえず動く」コードを書いた後に見直すだけで、VBAは驚くほどスッキリします。冗長なIf分岐は IIf 関数で1行に、同じ値の繰り返し参照は変数に一度入れる、不要な条件判定は削除する。この3つを意識するだけで、保守しやすく、後から見ても読みやすいコードになります。
この記事では、次の内容を順番に解説します。
- 冗長なIf〜Elseを IIf関数でまとめる
- 同じ参照の繰り返しを変数に置き換える
- 不要な条件判定を取り除く
- 見直し前・見直し後のコード全体比較
- よくある質問(IIfの注意点・見直しの進め方等)
冗長なIf〜ElseをIIf関数でまとめるには?
「条件が真なら〇、偽なら×を代入する」だけのシンプルな分岐は、IIf 関数を使うと1行で書けます。
見直し前
If Cells(i, 2).Value >= 10000 Then
Cells(i, 3).Value = "〇"
Else
Cells(i, 3).Value = "×"
End If
見直し後
Cells(i, 3).Value = IIf(Cells(i, 2).Value >= 10000, "〇", "×")
IIf(条件, 真の値, 偽の値) という書き方で、条件が成り立つ場合と成り立たない場合の値を1行で書けます。5行あったコードが1行になり、処理の意図もすぐ読み取れます。
ただし IIf は条件が成り立たなくても「偽の値」の式を評価するため、偽の値でエラーが起きうる場合(ゼロ除算など)は通常の If〜Else の方が安全です。
同じ参照の繰り返しを変数に置き換えるには?
ループ内で同じセルの値を何度も参照していると、コードが読みにくくなるだけでなく、処理が少し遅くなることもあります。一度変数に入れてから使いましょう。
見直し前
For i = 2 To lastRow
If Cells(i, 2).Value >= 10000 Then
Cells(i, 3).Value = "〇"
Cells(i, 4).Value = Cells(i, 2).Value * 0.1
Else
Cells(i, 3).Value = "×"
Cells(i, 4).Value = 0
End If
Next i
見直し後
Dim amount As Double
For i = 2 To lastRow
amount = Cells(i, 2).Value
Cells(i, 3).Value = IIf(amount >= 10000, "〇", "×")
Cells(i, 4).Value = IIf(amount >= 10000, amount * 0.1, 0)
Next i
Cells(i, 2).Value を amount に置き換えることで、「何の値を使っているのか」が名前から伝わり、コードの見通しが良くなります。また、判定基準が変わった場合も1か所修正するだけで済みます。
不要な条件判定を取り除くには?
空白かどうかを判定してから値をコピーするコードは、よく見かける冗長なパターンです。
見直し前
If Cells(i, 1).Value = "" Then
Cells(i, 2).Value = ""
Else
Cells(i, 2).Value = Cells(i, 1).Value
End If
見直し後
Cells(i, 2).Value = Cells(i, 1).Value
空白でも値があっても「A列をB列にコピーする」という処理は同じです。空白のときに空白を入れるだけの条件分岐は不要なので、1行に削減できます。
このように「この条件分岐、両方やっていることは同じでは?」と気づくことが、コードのスリム化の第一歩です。
見直し前・見直し後のコード全体を比較するには?
上記の改善をまとめて適用したビフォーアフターです。
見直し前
Sub CheckAmount()
Dim i As Long
For i = 2 To 100
If Cells(i, 2).Value >= 10000 Then
Cells(i, 3).Value = "〇"
Else
Cells(i, 3).Value = "×"
End If
Next i
End Sub
見直し後
Sub CheckAmountClean()
Dim i As Long
Dim lastRow As Long
Dim amount As Double
lastRow = Cells(Rows.Count, 2).End(xlUp).Row
For i = 2 To lastRow
amount = Cells(i, 2).Value
Cells(i, 3).Value = IIf(amount >= 10000, "〇", "×")
Next i
End Sub
行数は増えていますが、次の点が改善されています。
- ループ終了行を
100固定からlastRow自動取得に変更 - セル参照を変数
amountに置き換えて意味を明確に - If〜Else を IIf に統合
まとめ
- 真偽どちらかを代入するだけのIf〜Elseは
IIfで1行にまとめられる - 繰り返し参照する値は 変数に一度入れる(読みやすさ・速度の両方が改善)
- 「両方同じことをしているだけ」の条件判定は 削除できる
- ループ終了行は 固定値ではなく
lastRowで自動取得 するのが基本 - 「動くからOK」の次のステップは 「読める・直せる」コードにすること
よくある質問
IIfを使うとエラーになる場合がある?
あります。IIf は条件の真偽に関わらず、真の値・偽の値の両方を評価します。そのため、たとえば偽の値に Cells(i,1).Value / x のような式があり、x が0になりうる場合、条件が真でも偽の計算が走ってゼロ除算エラーになることがあります。計算式が複雑な場合や副作用が心配な場合は、通常の If〜Else を使う方が安全です。
どの程度まで短くするのが正解?
「短さ」より「読みやすさ」が優先です。1行に詰め込みすぎて意図が読み取りにくくなるなら、少し長くても分けて書く方が正解です。目安は「後から見た自分が、コードを読んで処理の流れをすぐ追えるかどうか」です。
見直しはいつやるのが良い?
「とりあえず動いた」直後が最もおすすめです。処理の意図が頭に残っているうちに見直すと、冗長な部分に気づきやすく、短時間で整理できます。時間が経つほど「なぜこう書いたか」を思い出すのに時間がかかります。
コードを短くしたら動かなくなった場合は?
見直し前のコードをコメントアウトして残しておくか、別のモジュールにコピーしてから変更するのが安全です。VBEには「元に戻す(Ctrl+Z)」がありますが、保存後は戻せないため、変更前の状態をバックアップとして残す習慣をつけましょう。
Select Caseを使うべき場面は?
条件の分岐が3つ以上になってきたら Select Case の方がすっきり書けることが多いです。IIf はあくまで2択(真か偽か)向けで、3択以上を IIf で書くとネストが深くなって逆に読みにくくなります。
Select Case Cells(i, 2).Value
Case Is >= 50000
Cells(i, 3).Value = "A"
Case Is >= 10000
Cells(i, 3).Value = "B"
Case Else
Cells(i, 3).Value = "C"
End Select


