Excel VBAで同じような処理が続くと、コードが非常に長くなり、管理や修正が大変になることがあります。
今回は、「複数の列に同じ処理(数式コピー)を行うコード」をループで簡潔に書き直す方法をご紹介いたします。
実現したいこと
- 複数の列(AH列~BQ列)に対して、2行目の数式を最終行までコピーしたい
- 長くなってしまったコードをループ構文で短くシンプルにしたい
Before:1列ずつ処理していた冗長なコード
最初に書いていたコードは、各列ごとに1つずつ書いていたため非常に長くなっていました。
' 一部抜粋(実際は36列分)
ws.Range("AH2").Copy Destination:=ws.Range("AH3:AH" & lastRow)
ws.Range("AI2").Copy Destination:=ws.Range("AI3:AI" & lastRow)
ws.Range("AJ2").Copy Destination:=ws.Range("AJ3:AJ" & lastRow)
' 以下省略
この方法でも処理は実行されますが、列が多くなるほどメンテナンス性が悪化します。
After:Forループで簡潔に書き直したコード
以下のように、列番号を使ってループ処理を行うことで、コードが劇的に短く・わかりやすくなります。
Sub CopyFormulasDown()
Dim ws As Worksheet
Dim lastRow As Long
Dim col As Long
' ワークシートを指定
Set ws = ThisWorkbook.Sheets(1)
' 列Aの最終行を取得
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' AH列(列番号34)〜BQ列(列番号69)までをループで処理
If lastRow > 2 Then
For col = 34 To 69
ws.Cells(2, col).Copy Destination:=ws.Range(ws.Cells(3, col), ws.Cells(lastRow, col))
Next col
End If
End Sub
ポイント解説
ws.Cells(2, col):2行目のセル(数式元)Destination:=...:コピー先は3行目~最終行まで34〜69:Excelの列番号で、AH列 = 34,BQ列 = 69
補足:列番号を調べる方法
列番号は以下の方法で確認できます。
A = 1,B = 2,...,Z = 26AA = 27,AB = 28,...,AH = 34,BQ = 69
不明な場合は、以下のようなコードで確認も可能です。
MsgBox Columns("AH").Column ' → 34 と表示される
まとめ
VBAでの処理は、繰り返しの多い構文をループで置き換えることで、コードの可読性・保守性が大きく向上します。
- 同じ処理が並ぶときは列番号を使ったForループが効果的
- Excelでは**列名ではなく列番号(1〜16384)**を使うことで、動的に処理が可能
- コードの整理にもなり、ミスを減らすことができます
作業効率を高めるだけでなく、将来的な変更にも強いコードになりますので、ぜひご活用ください。
技術書の購入コストを抑えてスキルアップするなら

ここまで読んでいただきありがとうございます。最後に宣伝をさせてください。
プログラミングの技術書や参考書は、1冊3,000円〜5,000円するものも多く、出費がかさみがちです。Kindle Unlimitedであれば、月額980円で500万冊以上の書籍が読み放題となります。
気になる言語の入門書から、アルゴリズム、基本設計の専門書まで、手元のスマホやPCですぐに参照可能です。現在は「30日間の無料体験」や、対象者限定の「3か月499円プラン」なども実施されています。まずはご自身のアカウントでどのようなオファーが表示されるか確認してみてください。
