VBAコードを見直してスッキリさせる3つのテクニック|IIf・変数置き換え・不要分岐の削除

「とりあえず動く」コードを書いた後に見直すだけで、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).Valueamount に置き換えることで、「何の値を使っているのか」が名前から伝わり、コードの見通しが良くなります。また、判定基準が変わった場合も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

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール