読みにくい・遅い・動きにくいVBAコードを卒業する“改善パターン集”

VBA & Excel
スポンサーリンク

自分のコードに赤面したこと、ありますか?

ある日、チームメンバーのVBAコードを見たときのことです。

整ったインデント、わかりやすい変数名、コメントの置き方にうっとり。

「美しい…コードって、芸術なんだ…」

完全に見惚れてしまいました。

ところがその後、自分の書いたマクロを見返してみて絶句。

全角スペースは迷子、無名の変数たちが暴れ回り、Selectの大行列が画面を占拠。

「えっ、これ書いたの…私?」

あまりの読みづらさに、時空がゆがむかと思いました。

まさかExcelのVBAで“自分の黒歴史”を召喚する日が来るとは…。

でも、そんな私でも少しずつ改善してきた今なら言えます。

コードの読みやすさ・速さ・柔軟さは、あとからいくらでも育てられます。

この記事では、かつての私と同じように「なんとなく書いてきたけど、このままでいいのかな」と感じているVBAユーザーさんに向けて、“読みにくい・遅い・動きにくいコード”を卒業する改善パターン集をまとめました。

心の中で「あるある」とつぶやきながら、ゆるっと読み進めてもらえたら嬉しいです!

スポンサーリンク
  1. 読みにくいコードあるあるとその正体
    1. なぜコードは“読みにくくなる”のか?
    2. 読みやすいコードは未来の自分への思いやり
  2. 【読みにくい編】コードのクセに気づいたら、卒業のチャンスです
    1. パターン①|同じ参照を何度も書く呪文コード
      1. 改善案:With構文でスッキリまとめる
    2. パターン②|変数名が“謎解き”レベル
      1. 改善案:意味が分かる名前にしてあげる
    3. パターン③|コメントがない、または“謎ポエム”
      1. 改善案:処理の意図を“ひとこと”で伝える
    4. パターン④|インデントが崩壊していて構造が見えない
      1. 改善案:インデントでコードに“地図”をつける
    5. まとめ:読みにくさの9割は“気づけば直せるクセ”
  3. 【遅い編】ありがちな“時間を無駄にする”書き方
    1. パターン①|1セルずつ丁寧すぎるループ処理
      1. 改善策:配列にまとめて処理しよう!
    2. パターン②|画面描画(ScreenUpdating)が常にオン
      1. 改善策:最初に止めて、最後に戻す!
    3. パターン③|計算モードが自動のまま
      1. 改善策:処理中だけ手動モードに切り替え
    4. パターン④|やたらとSelect・Activateを使う
      1. 改善策:直接指定で即書き込み!
    5. まとめ:スピードは書き方で生まれる!
  4. 【動きにくい編】すぐ壊れる・応用できないコードは卒業しよう
    1. パターン①|ファイル名・シート名のハードコーディング
      1. 改善案:変数 or ループで柔軟に!
    2. パターン②|コピペ前提の“ベタ書き”構造
      1. 改善案:ループや配列でスケーラブルに!
    3. パターン③|変数の宣言がなかったり、型が曖昧
      1. 改善案:Option Explicit + 変数の型宣言は基本のキ!
    4. パターン④|“一発動作しか想定してない”コード構造
      1. 改善案:事前チェック&存在確認を入れて安心設計
    5. パターン⑤|処理の流れが長くて1か所にまとまってない
      1. 改善案:処理ごとに「Sub」や「Function」に分けて再利用性UP!
    6. 仕上げに|動きやすさ=“怖くないコード”
  5. まとめ|美しいコードは未来の自分へのラブレター
    1. 書きっぱなしから、読み返したくなるコードへ
    2. かっこいいコード”は、実はとっても実用的
    3. コード改善は“旅”みたいなもの
    4. これからは“どう書くか”を楽しんでみよう
    5. 最後に|“過去の自分に助けられる日”が来る

読みにくいコードあるあるとその正体

VBAを始めたばかりの頃、私はこう思っていました。

「動けばOKでしょ?」

……はい、未来の自分が苦しむとは、露とも思わずに。

書いてるときは最高にノッてるので、変数名は“aaa”でも“temp1”でも気にしない。

コメントも書かず、処理の流れは“脳内メモリ”にだけ保存。

何度も登場する長ったらしい Worksheets(“報告用”).Range(“B2”) を、毎回手打ち。

結果、自分のコードなのに3日後にはまったく読めません。

タイムカプセルから出てきた謎の儀式、みたいな気持ちになります。

なぜコードは“読みにくくなる”のか?

読みにくさの正体は、だいたいこんなクセから生まれます:

  • 同じ参照を何度も書いていて、視線が混乱する
  • 変数の名前が意味不明(例:a、aaa、結果1)
  • コメントが一切ない or あっても内容がふんわりすぎる
  • インデントがズレていて構造が見えない

これらが1つでも当てはまると、処理の意図が見えにくくなり、保守も応用もつらくなってきます。

読みやすいコードは未来の自分への思いやり

美しいコードって、ただ整ってるだけじゃなくて、「なぜそう書いたのか」が自然と伝わるんですよね。

「この変数って、集計結果なんだな」とか、「ここで集計範囲を限定してるんだな」とか。

それがわかると、読む側も安心するし、書いた自分もちょっと誇らしくなるんです。

この章では、そんな「読みやすさ」のために、まず直したいクセやパターンをBefore→After形式で紹介していきます。

コードにちょっとだけ優しくなると、未来のあなたがきっと感謝してくれますよ。

【読みにくい編】コードのクセに気づいたら、卒業のチャンスです

さて、ここからは具体的な「読みにくいコードあるある」を、Before→After形式で見ていきます。

最初に言っておきたいのは、「みんな通る道なので安心してください」ということ。

私も最初は、変数名に“x”と“y”を連発し、書き上げたコードを未来の自分に託して爆誕した「誰も読めないマクロ」を量産しておりました。

ではさっそくいきましょう!

パターン①|同じ参照を何度も書く呪文コード

Worksheets("月次").Range("B2").Value = "合計"
Worksheets("月次").Range("B3").Value = "件数"
Worksheets("月次").Range("B4").Value = "平均"

──“Worksheets(“月次”)”の呪文、3連続唱えられてますね。

改善案:With構文でスッキリまとめる

With Worksheets("月次")
    .Range("B2").Value = "合計"
    .Range("B3").Value = "件数"
    .Range("B4").Value = "平均"
End With

見た目がシュッとしましたし、「この3行、同じシートを操作してるんだな」とひと目でわかります。

読み手にとっての親切さ=やさしさです。

パターン②|変数名が“謎解き”レベル

Dim a As Double
Dim b As Double
a = Cells(2, 3).Value
b = a * 1.1

読んでる側:「a…って、なに? bって誰?」

改善案:意味が分かる名前にしてあげる

Dim 基本金額 As Double
Dim 税込金額 As Double

基本金額 = Cells(2, 3).Value
税込金額 = 基本金額 * 1.1

何をしているのかが“パッと”わかるので、未来の自分にもやさしい!

変数名は「短く」よりも「意味が通じること」が大事です。

パターン③|コメントがない、または“謎ポエム”

' やるべきことをやる
i = i + 1

改善案:処理の意図を“ひとこと”で伝える

' 行数カウントを1行進める
i = i + 1

“コードを説明する”のではなく、“なぜそれをしているか”を添えるとベスト。

パターン④|インデントが崩壊していて構造が見えない

If 条件 Then
MsgBox "OK"
Else
MsgBox "NG"
End If

コードの階層が分からないと、読み手は地図なしで迷子になります。

改善案:インデントでコードに“地図”をつける

If 条件 Then
    MsgBox "OK"
Else
    MsgBox "NG"
End If

VBAエディターにも自動整形ツールがあるので、こまめに整えておくのがおすすめです!

まとめ:読みにくさの9割は“気づけば直せるクセ”

ここで紹介した内容は、機能とは直接関係ないけど、読んだ瞬間の印象が大違いになります。

「なんかこのコード、安心する」 そんな第一印象を与えるマクロって、それだけで価値があります。

次の章では、“読みやすい”を超えて“速くなる”ための改善パターンを見ていきましょう。

自作マクロにちょっとだけ魔法をかける時間です。

【遅い編】ありがちな“時間を無駄にする”書き方

読みやすいコードになってきたら、次は「速さ」もほしくなってくるものです。

私の場合、「自分のコードのせいで仕事が進まない」と気づいたときのダメージは大きかったです。

特に処理ボタンを押してからExcelが固まり、しばらく“ぐるぐるマークととアイコンタクト”してると、精神にも悪影響が…。

でも、よくよく見直すと「無駄が多かった」だけなんですよね。

この章では、処理速度をグンと上げるための“ありがちなNGパターンと改善策”をご紹介します!

パターン①|1セルずつ丁寧すぎるループ処理

For i = 1 To 10000
    Cells(i, 1).Value = Cells(i, 1).Value * 2
Next i

一見まじめで一生懸命。でも、これではExcelとVBAの間で1万回おつかいに出てる状態です。何度も処理結果をやり取りしていると、当然ながらめちゃくちゃ遅い…。

改善策:配列にまとめて処理しよう!

Dim data As Variant
Dim i As Long

data = Range("A1:A10000").Value

For i = 1 To UBound(data, 1)
    data(i, 1) = data(i, 1) * 2
Next i

Range("A1:A10000").Value = data

“一括で読み込んで一括で返す”ことで、処理時間は数十秒→数秒に。体感速度が劇的に変わります!

パターン②|画面描画(ScreenUpdating)が常にオン

' 処理だけ書いてるつもりだけど
Cells(1, 1).Value = "スタート"
For i = 1 To 10000
    Cells(i, 2).Value = i
Next i

実はVBAは、書き込みのたびに画面を律儀に更新しようとしてくれます。

えらい。でも、今は無駄に親切すぎる…。

改善策:最初に止めて、最後に戻す!

Application.ScreenUpdating = False

' 処理いろいろ
' …

Application.ScreenUpdating = True

これだけで、目に見えてスピードアップするケースもあります!

パターン③|計算モードが自動のまま

数式が多いシートでは、セルの変更ごとに全体の再計算が走ります。

マクロ中にこれが発生すると、Excelが「計算…してるからちょっと待って」状態に。

改善策:処理中だけ手動モードに切り替え

Application.Calculation = xlCalculationManual
' 処理いろいろ
Application.Calculation = xlCalculationAutomatic

手動モードにすることで、「あとでまとめて計算していいよ〜」というスタンスに。

速さがかなり違ってきます。

パターン④|やたらとSelect・Activateを使う

Range("A1").Select
Selection.Value = "開始"

初心者の頃は「とりあえず選択してから操作する」流れが安心感ありましたが、これが処理の大きな足かせになります。

改善策:直接指定で即書き込み!

Range("A1").Value = "開始"

たったこれだけでも、処理の無駄なラウンドトリップを減らせます。

“寄り道せずに目的地へ”が高速化の基本です。

まとめ:スピードは書き方で生まれる!

処理が遅い=VBAが遅い、ではありません。

ムダなループ、無駄な更新、無駄な選択が蓄積して、Excelが疲弊してるだけなんです。

この章で紹介した改善策をひとつでも取り入れると、「えっ、もう終わったの?」という快適さが待ってます。

次章では、“速い”だけじゃなく“壊れにくく・使いまわしやすい”コードを書くためのテクニックをご紹介します!

【動きにくい編】すぐ壊れる・応用できないコードは卒業しよう

「このマクロ、ちょっと内容変えて使いたいな」と思って開いてみたら──

「なにこのシート名直打ち!ファイルパス固定!変数名なに!?…怖っ!!」 → そっと閉じました。

過去の自分と向き合う勇気が必要な瞬間です。

ここでは、「修正しようとしただけなのに、全体が崩壊しそうなマクロ」の特徴を紹介します。

小さな書き方のクセを見直すだけで、再利用しやすく・壊れにくいコードにグッと近づきます!

パターン①|ファイル名・シート名のハードコーディング

Workbooks("月報2024年6月.xlsx").Worksheets("まとめ").Range("A1").Value = "完了"

これ、1文字でも間違ったらアウトです。

しかも名前が変わるたびにコードを書き換える地獄…まるで“マクロの人質”。

改善案:変数 or ループで柔軟に!

Dim wb As Workbook
Set wb = ThisWorkbook

Dim ws As Worksheet
Set ws = wb.Sheets("まとめ")

ws.Range("A1").Value = "完了"

ファイルをまたぐ場合は Workbooks.Open などで、エラー対策と存在確認を加えるのも大事ですね。

パターン②|コピペ前提の“ベタ書き”構造

Range("A2").Value = Sheets("入力1").Range("B2").Value
Range("A3").Value = Sheets("入力2").Range("B2").Value
Range("A4").Value = Sheets("入力3").Range("B2").Value

──この感じ、見覚えある人も多いのでは?

3つ以上の入力Xが出てきた時点で、腕が疲れます。

改善案:ループや配列でスケーラブルに!

Dim i As Integer
For i = 1 To 3
    Sheets("集計").Cells(i + 1, 1).Value = Sheets("入力" & i).Range("B2").Value
Next i

これで10シートでも100シートでも対応できます!

未来のコピー&ペースト地獄から解放されましょう。

パターン③|変数の宣言がなかったり、型が曖昧

i = 1
total = Cells(i, 1)
  • totalってString?Double?いつ宣言された?
  • 未宣言の変数がいると、タイポでも気づかずエラーにならないという恐怖が。

改善案:Option Explicit + 変数の型宣言は基本のキ!

Option Explicit

Dim i As Long
Dim total As Double

「ちょっと面倒だな…」と思うかもしれませんが、型を明示するだけで思わぬバグを防げます。

パターン④|“一発動作しか想定してない”コード構造

' ファイルパスを入力してね♪
filePath = InputBox("ファイルのパスを入力してください")
Workbooks.Open filePath

やってることは間違ってないですが、「入力ミス」「キャンセル」「ファイルが存在しない」など、想定外が来たらすぐエラーで落ちる構造です。

改善案:事前チェック&存在確認を入れて安心設計

If filePath = "" Then
    MsgBox "処理を中止しました。"
    Exit Sub
End If

If Dir(filePath) = "" Then
    MsgBox "指定したファイルが見つかりませんでした。"
    Exit Sub
End If

こういった“落ちない仕組み”を組み込んでおくと、本番運用にも強いコードになります。

パターン⑤|処理の流れが長くて1か所にまとまってない

' 処理A(10行)
' 処理B(15行)
' 処理C(20行)
' 処理D(……あれ、どこだっけ)

コードが1本の“のれん”みたいになっていると、部分的な再利用や修正が地獄になります。

改善案:処理ごとに「Sub」や「Function」に分けて再利用性UP!

Sub 全体の流れ()
    Call データ読み込み
    Call 集計処理
    Call 出力処理
End Sub

こうしておけば、「今回は集計だけしたい」などの応用も自由自在。 大規模化しても迷子にならないコードに成長します!

仕上げに|動きやすさ=“怖くないコード”

動きにくいコードの特徴は、「触るのが怖い」「ちょっと変えると壊れそう」と思わせてしまうことです。

でも、ここまで見直せば構造がシンプルで壊れにくい“安心マクロ”に進化しています。

「このコード、私じゃなくても読めるし直せるな〜」と思えたら、それはもう大きな成長の証です。

まとめ|美しいコードは未来の自分へのラブレター

この記事をここまで読んでくださったあなたなら、きっともう気づいているはずです。

「動けばOK」だったはずのコードが、 「速くて読みやすくて、しかも他の人にも使ってもらえるかも?」と思えるようになること。

それって、ちょっとだけ誇らしくありませんか?

書きっぱなしから、読み返したくなるコードへ

  • 1行ずつ処理していたところを配列で一括処理に
  • 呪文のような同一参照を With構文で整理
  • 変数名やコメントで意図が“読める”ように
  • ちょっとした書き方のクセを見直して、“速くて強いコード”に

最初は「クセ」として染みついていたものでも、気づいて改善すれば一気に見違えます。

かっこいいコード”は、実はとっても実用的

見た目が整ったコードは、ただの自己満足ではありません。

  • 他の人が見ても分かりやすい
  • バグの原因を早く見つけられる
  • 数か月後に自分が読んでもちゃんと理解できる
  • 改修・応用がラクになる(コピペ地獄も回避!)

つまり、「美しいコード=思いやりのある道具」なんですよね。

コード改善は“旅”みたいなもの

最初に書いたコードは拙くても、 手直しして、見直して、ちょっとずつ「わかりやすく・動きやすく」なっていく。

そのたびに、「あ、あのときより私、成長してるな」と実感できる瞬間があります。

コードって、書いた分だけちゃんと経験値になるんですね。

そして何より、今日の改善は、明日の自分を助けてくれます。

これからは“どう書くか”を楽しんでみよう

マクロはただの業務ツールじゃなく、 「自分だけの仕組みをつくれる、小さなプログラム言語」です。

きれいに書く、速く書く、柔軟に書く。

そのすべては、あなた自身の考え方や工夫が反映された“作品”。

そう思えば、少しだけコードを書くのが楽しくなるかもしれませんね。

最後に|“過去の自分に助けられる日”が来る

私自身、かつての「なんとか動けばいいコード」を書いていた時期があります。

でも少しずつ書き方を見直し始めてから、「未来の自分が読む前提」で組み立てるようになって、 気がついたらマクロを書くのがちょっと楽しくなっていました。

美しいコードは、未来のあなたを助けてくれます。

そしてきっと、誰かの業務や仕事の“余白”も増やしてくれるはずです。

あなたが次に書くVBAコードが、「読めて、速くて、気持ちいい」1本になりますように!

decopon
decopon

「読みにくい」「遅い」「なんか壊れそう」── そんな過去のマクロにひとつずつ向き合ってきた体験を、この記事に詰め込みました。

もしあなたにも、 「あ~、これ自分のことかも…」と感じたところがあれば、 それはすでに“改善できる目”を持っている証拠だと思います。

今日の小さなコード改善が、 明日のあなたやチームの業務を、ちょっとだけ軽やかにしてくれますように。
そしていつか、自分の書いたマクロに 「うん、いい仕事してるな」って言える日が来ますように。

コメント

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