【2026年7月最新】VBAのCellsでセルを指定する完全ガイド|Rangeとの使い分け・変数活用・ループ処理まで
この記事の内容
ExcelのVBAを使う際、セルを指定する方法は大きく2つあります。「Range("A1")」のように文字列で指定する方法と、「Cells(1, 1)」のように行と列の番号(数値)で指定する方法です。この2つの使い分けを正確に理解することが、VBAマクロ作成の第一歩になります。
「CellsとRangeって何が違うの?」「変数を使ってセルを指定するにはどうすればいい?」「ループ処理でCellsを使うには?」——この記事では、これらの疑問に対して実際のコード例とともに丁寧に答えます。また後半では、「VBAが書けなくてもClaude Codeに日本語で指示すればコードを自動生成してくれる」という、非エンジニアの方向けの活用法もご紹介します。
この記事を最後まで読むと、以下のことが分かります。
01 CELLS VS RANGE CellsとRangeの違い — どちらを使うべきか セル指定方法の2大プロパティを比較し、使い分けの基準を明確にする
まず基本的な前提を整理します。ExcelのVBAでセルを操作するには、主に「Range」と「Cells」という2つのプロパティを使います。どちらも同じセルを指定できますが、得意な場面が異なります。
📚 用語解説
VBA(Visual Basic for Applications):Microsoft Officeに組み込まれているプログラミング言語。ExcelやWordなどの操作を自動化するためのマクロを作成できる。コードをExcelの「開発」タブから記述し、ボタン1つで繰り返し実行できる。プログラミング未経験者でも比較的習得しやすく、業務自動化の入門として人気がある。
| 比較項目 | Range | Cells |
|---|---|---|
| 指定方法 | 文字列 (例: "A1", "B2:D10") | 行・列の数値 (例: Cells(1, 1)) |
| 得意な場面 | 固定セルの指定、範囲指定 | 変数を使った動的な指定、ループ処理 |
| 可読性 | 高い("A1"が視覚的に分かりやすい) | 低め(数値だとどのセルか分かりにくい) |
| 変数との相性 | △ 文字列を組み立てる必要あり | ◎ そのまま変数を渡せる |
| 複数セル指定 | ◎ Range("A1:D10")で簡単 | △ Range(Cells(1,1), Cells(10,4))と組み合わせが必要 |
1-1. Rangeが向いている場面
Rangeは、「どのセルを操作するか」が実行前から決まっている場合に最適です。「常にA1セルのヘッダーを太字にする」「B2:D10を常に合計表示する」といった固定セルへの操作は、Rangeで書く方がコードが読みやすくなります。
Rangeを使う例(固定セル)
Range("A1").Value = "氏名"
Range("B1").Font.Bold = True
Range("A1:D1").Interior.Color = RGB(200, 230, 255)
1-2. Cellsが向いている場面
Cellsは、「操作するセルの行や列が実行時に変わる」場合に真価を発揮します。データの件数によって処理行数が変わる場合や、ループで1行ずつ処理を適用する場合は、Cellsが必須です。
Cellsを使う例(変数・ループ)
For i = 1 To 100
Cells(i, 1).Value = i * 10
Next i
行番号として変数「i」を渡せるのがCellsの強みです。Rangeで同じことをしようとすると「Range("A" & i)」のように文字列を連結する必要があり、可読性が下がります。
📚 用語解説
プロパティ:オブジェクト(この場合はセル)が持つ属性や設定値のこと。Cellsは「どのセルを操作するか」を指定するためのプロパティ。Valueは「セルの値」、Fontは「フォント設定」、Colorは「背景色」といったプロパティをそれぞれのセルが持っている。
固定?
Range("A1")
読みやすい
→ Cells
Cells(i, j)
変数が使える
02 BASIC USAGE Cellsの基本的な使い方 構文・値の取得と変更・書式設定まで実例で解説
Cellsの基本構文はシンプルです。「Cells(行番号, 列番号)」の形で書きます。行番号・列番号ともに1から始まる整数を指定します。
Cellsの基本構文
Cells(行番号, 列番号)
' 例: A1セル(1行1列)
Cells(1, 1)
' 例: B3セル(3行2列)
Cells(3, 2)
' 例: D5セル(5行4列)
Cells(5, 4)
列番号はA=1、B=2、C=3…というように、アルファベット順の数値に対応します。Z列は26、AA列は27になります。最初は対応が覚えにくいですが、よく使うA〜E列(1〜5)だけ覚えておけばほとんどの業務用マクロには対応できます。
| セル位置 | Range表記 | Cells表記 |
|---|---|---|
| 1行1列目(A1) | Range("A1") | Cells(1, 1) |
| 2行3列目(C2) | Range("C2") | Cells(2, 3) |
| 5行5列目(E5) | Range("E5") | Cells(5, 5) |
| 10行2列目(B10) | Range("B10") | Cells(10, 2) |
2-1. セルの値を取得・変更する(Valueプロパティ)
セルの値を読み取ったり書き込んだりするには、Valueプロパティを使います。
値の取得と設定
' A1セルの値を変数に格納
Dim val As String
val = Cells(1, 1).Value
' B2セルに「合計」と入力
Cells(2, 2).Value = "合計"
' C3セルに数値を入力
Cells(3, 3).Value = 12345
Cellsの直後に「= 値」と書くだけでもValueプロパティは省略できます(例: Cells(1,1) = "テスト")。ただし、可読性のためにValueを明示的に書く方が、コードの意図が伝わりやすいです。
2-2. セルを選択する(Selectメソッド)
特定のセルにカーソルを移動させたい場合はSelectメソッドを使います。ただし、マクロの速度を上げるためには、不必要なSelect操作は避けるのが定石です。
セルを選択する
' A1セルを選択
Cells(1, 1).Select
' D5セルに移動してその値を確認
Cells(5, 4).Select
MsgBox Cells(5, 4).Value
2-3. 書式設定(フォント・背景色)
セルの書式(フォントサイズ・太字・背景色など)もCellsを通じて設定できます。
書式設定の例
' A1セルを太字・赤文字に
Cells(1, 1).Font.Bold = True
Cells(1, 1).Font.Color = RGB(255, 0, 0)
' B1セルの背景を黄色に
Cells(1, 2).Interior.Color = RGB(255, 255, 0)
' フォントサイズを14に変更
Cells(1, 1).Font.Size = 14
03 VARIABLE USAGE 変数を使った動的なセル指定 Cellsが真価を発揮する「行番号・列番号を変数で渡す」方法
Cellsの最大の特徴は、行番号と列番号を数値の変数として渡せることです。これにより、「データが何行あるかを実行時に判断して、その分だけ処理する」という柔軟なマクロが書けます。
3-1. 変数を使った基本パターン
変数でセルを指定する基本
Dim rowNum As Integer
Dim colNum As Integer
rowNum = 3
colNum = 2
' 3行2列目(B3)に値を入力
Cells(rowNum, colNum).Value = "テスト"
' 行を1つ進めて次の行に入力
rowNum = rowNum + 1
Cells(rowNum, colNum).Value = "次の行"
変数を使うと、「何行目を操作するか」「何列目を操作するか」をコード実行中に変更できます。これは固定のセル名を文字列で書くRangeでは簡単にできないことです。
3-2. LastRowを使って最終行を自動検出する
実務でよく使うパターンが「データの最終行を自動検出して処理する」です。Excelシートのデータは毎月増えることがあるため、最終行を動的に取得することでデータ量に依存しない汎用マクロが作れます。
最終行を自動検出するパターン
Dim lastRow As Long
' A列の最後のデータがある行番号を取得
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
MsgBox "データは " & lastRow & " 行あります"
「Cells(Rows.Count, 1).End(xlUp).Row」は、A列の最下行からCtrl+上矢印で上に移動したときのセルの行番号を返します。これがA列でデータが入っている最終行の行番号になります。この値を変数lastRowに格納すれば、データ件数が変わっても正しく処理できます。
📚 用語解説
LastRow(最終行取得):Cells(Rows.Count, 列番号).End(xlUp).Rowというコードでシートのデータ最終行番号を取得するVBA定番テクニック。Rows.CountはExcelシートの最大行数(1,048,576)を返し、そこから上方向(xlUp)に移動することで最後にデータが入っている行番号を取得できる。データ件数が変わっても対応できる汎用マクロの基本パターン。
Excel 2007以降は最大1,048,576行ですが、古いExcel(2003以前)は65,536行でした。Cells(Rows.Count, 1)とRows.Countを使うことで、バージョン依存を排除できます。
3-3. 列番号を変数で渡してヘッダー行を処理する
行だけでなく列も変数にすることで、複数の列にまたがる処理が簡単に書けます。たとえば「A列からE列までの1行目に連番ヘッダーを入れる」処理は以下のように書けます。
列方向のループで連番ヘッダーを作成
Dim j As Integer
For j = 1 To 5
Cells(1, j).Value = "項目" & j
Cells(1, j).Font.Bold = True
Next j
04 LOOP USAGE ループ処理でCellsを活用する For〜Next・Do Whileとの組み合わせでデータ一括処理を実現
Cellsがもっとも活躍するのが、繰り返し処理(ループ)との組み合わせです。「100行のデータを1行ずつ処理する」「シート全体を走査して条件に合うセルを探す」といった業務でCellsとループは欠かせません。
4-1. For〜Nextループで行を順番に処理する
For〜Nextループを使った基本的なパターンを見てみましょう。「A列の1行目から最終行まで、各行のB列に合計を入力する」という処理です。
For〜Nextで行を順番に処理
Dim i As Long
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
' B列の値にC列の値を加算してD列に表示
Cells(i, 4).Value = Cells(i, 2).Value + Cells(i, 3).Value
Next i
📚 用語解説
For〜Nextループ:VBAの繰り返し処理の基本構文。「For 変数 = 開始値 To 終了値」で始まり「Next 変数」で終わる。この間に書いた処理が開始値から終了値まで1ずつカウントアップしながら繰り返される。Cellsと組み合わせると、変数を行番号として使うことで1行ずつ処理を進められる。
ループ変数「i」がCells(i, 4)の行番号として使われています。i=2のとき2行目、i=3のとき3行目…と処理が進み、最終行まで自動で繰り返されます。これにより100行でも1000行でも1つのコードで対応できます。
4-2. 2次元ループ(行・列を両方ループ)
行方向と列方向の両方をループして、シート全体のセルを処理する2次元ループも重要なパターンです。
2次元ループでシート全体を処理
Dim i As Long
Dim j As Integer
For i = 1 To 10
For j = 1 To 5
' i行j列のセルに「行×列」の値を入力
Cells(i, j).Value = i * j
Next j
Next i
このコードを実行すると、A1〜E10の範囲に掛け算の結果が入ります。外側のFor iが行(縦方向)、内側のFor jが列(横方向)を制御しています。この二重ループパターンは、表形式データの一括処理でよく使います。
4-3. Do While ループで条件付き処理
終了条件が行数ではなく「セルが空になったら終了」といった場合はDo Whileループが便利です。
Do Whileでデータがある間ループ
Dim i As Long
i = 1
' A列のセルが空でない限り処理を繰り返す
Do While Cells(i, 1).Value <> ""
' 何か処理をする
i = i + 1
Loop
終了行が分かっている場合はFor Next(例: lastRowを取得して使う)、終了条件がデータの有無に依存する場合はDo While(セルが空になったら終了)を使います。実務では、データの最終行を先に取得するFor Nextパターンの方が安全で使いやすい場面が多いです。
05 RANGE COMBINATION RangeとCellsの組み合わせテクニック Rangeの引数にCellsを使って範囲を動的に指定する高度な方法
RangeとCellsを組み合わせることで、「動的な範囲指定」が可能になります。これは実務のVBAでよく使われる上級テクニックです。
5-1. RangeにCellsを引数として渡す
Range(Cells(起点行, 起点列), Cells(終点行, 終点列))という書き方で、動的な範囲を指定できます。
RangeにCellsを引数として渡す
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
' A1から最終行のE列までの範囲を選択
Range(Cells(1, 1), Cells(lastRow, 5)).Select
' 同じ範囲の背景を水色に変更
Range(Cells(1, 1), Cells(lastRow, 5)).Interior.Color = RGB(200, 240, 255)
この書き方の強みは、lastRowが変わっても「A1から最終行まで」という範囲が自動で追従する点です。データが毎月増えても、コードの修正は不要です。
5-2. Offsetで相対位置のセルを指定する
Offsetプロパティを使うと、特定のセルから相対的な位置にあるセルを指定できます。「現在のセルの1行下・2列右」といった指定が可能です。
Offsetで相対位置を指定
' Cells(3, 2)の1行下(4行目、2列)
Cells(3, 2).Offset(1, 0).Value = "1行下"
' Cells(3, 2)の2列右(3行目、4列)
Cells(3, 2).Offset(0, 2).Value = "2列右"
' ループ内で隣の列に結果を書き込む
For i = 1 To 10
Cells(i, 1).Offset(0, 1).Value = Cells(i, 1).Value * 1.1
Next i
📚 用語解説
Offsetプロパティ:指定したセルから相対的に移動した位置のセルを返すプロパティ。Offset(行のズレ, 列のズレ)という形で指定する。例えばCells(5, 3).Offset(1, 2)は「5行3列から1行下・2列右」=「6行5列目」のセルを指す。ループ処理で「現在の処理行の隣の列に書き込む」といった場面で重宝する。
06 PRACTICAL CASES 実践的なユースケース — コピー・クリア・シート全体操作 実際の業務でよく使うCellsの活用パターンを実例で解説
ここまで学んだ知識を使って、実際の業務でよく使う操作パターンを実例で紹介します。
6-1. セルをコピーして別のセルに貼り付ける
セルのコピーと貼り付け
' A1の値をB1にコピー(値のみ)
Cells(1, 2).Value = Cells(1, 1).Value
' 書式ごとコピーする場合はCopyメソッドを使う
Cells(1, 1).Copy Destination:=Cells(1, 3)
6-2. セルの内容をクリアする
セルのクリア
' 値だけ消す(書式は残す)
Cells(1, 1).ClearContents
' 値も書式も全部消す
Cells(1, 1).Clear
' ループで範囲全体をクリア
For i = 2 To 100
Cells(i, 1).ClearContents
Next i
6-3. シート全体のセルを一括操作する
Cells(引数なし)とするとシート全体の全セルを指定できます。
シート全体の操作
' シート全体のフォントを変更
Cells.Font.Name = "メイリオ"
Cells.Font.Size = 11
' シート全体の書式をリセット
Cells.ClearFormats
6-4. 特定の条件に合うセルを検索して処理する
条件に合うセルを検索して色付け
Dim i As Long
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To lastRow
' A列の値が1000以上なら背景を赤に
If Cells(i, 1).Value >= 1000 Then
Cells(i, 1).Interior.Color = RGB(255, 200, 200)
End If
Next i
07 ERROR HANDLING よくあるエラーと対処法 Cellsを使ったVBAでよく発生するエラーの原因と解決策
VBAでCellsを使っているとき、特定のエラーメッセージに遭遇することがあります。エラーの原因と対処法を事前に知っておくことで、デバッグの時間を大幅に短縮できます。
| エラー | 原因 | 解決策 |
|---|---|---|
| 実行時エラー 9(添字が有効範囲にありません) | 存在しないシートやセル範囲を指定した | シート名・行番号・列番号を確認する |
| 実行時エラー 1004(RangeクラスのSelectメソッドが失敗しました) | アクティブでないシートのセルをSelectしようとした | Selectの前にシートをActivateする |
| 型が一致しません(Type Mismatch) | 数値型の変数に文字列が入った | CellsのValueの型をCStr・CLng等で変換する |
| 実行時エラー 91(オブジェクト変数がセットされていません) | Nothing状態のオブジェクトにアクセスした | Set文でオブジェクトを正しく初期化する |
7-1. 列番号のオーバー対策
Cellsの列番号に「16385」以上の値を指定するとエラーになります。ExcelはXFD列(16384列)が最大です。ループで列番号を増やしていく処理では、上限チェックを入れておくと安全です。
列番号のオーバー対策
Dim j As Integer
For j = 1 To Columns.Count
' Columns.Countを使えば最大列数に依存しない
If Cells(1, j).Value = "" Then Exit For
Next j
VBAのCellsは行・列番号ともに1から始まります。プログラミング経験者が0始まりと混同してエラーになるケースがよくあります。Cells(0, 1)やCells(1, 0)は無効です。
08 CLAUDE CODE 【独自】Claude CodeでVBAコードを自動生成する VBAが書けなくても日本語指示だけでマクロを自動生成できる方法
ここまでCells・Range・ループなどVBAの基本を解説してきましたが、「これを全部覚えるのは大変…」と感じた方も多いと思います。特に非エンジニアの経営者・管理職の方にとって、VBAの文法をゼロから習得するのは時間がかかります。
そこで弊社が実際に活用しているのがClaude Codeです。Anthropicが提供するAIエージェントで、「どんなマクロを作りたいか」を日本語で説明するだけで、VBAコードを自動生成してくれます。
8-1. Claude CodeへのVBA依頼例
Claude Codeへの依頼例(日本語で指示するだけ)
- 「A列のデータがある全行について、B列の値が1000以上なら背景を赤にするマクロを作って」
- 「シートの1行目をヘッダー行として、2行目から最終行まで項目1〜5の合計をF列に表示するマクロを作って」
- 「sheet1のデータをsheet2にコピーして、コピーしたセルを結合してフォントを統一するマクロを書いて」
- 「毎月使う月次集計の操作を自動化するVBAマクロを設計して」
Claude Codeはこれらの指示を受け取ると、CellsやRangeを使った適切なVBAコードを生成します。生成されたコードをExcelのVBAエディタに貼り付けて実行するだけで、複雑な操作が一瞬で完了します。
8-2. GENAI社内でのVBA自動化実例
弊社(株式会社GENAI)では、Claude Max 20xプラン(月額約30,000円)を契約し、業務のあらゆる場面でClaude Codeを活用しています。VBA自動化でも以下のような実績があります。
| 業務 | 従来 | Claude Code活用後 |
|---|---|---|
| 月次売上集計マクロ作成 | エンジニアに依頼・数日待ち | 日本語で指示→Claude Codeが即座にVBAを生成 |
| レポートフォーマット統一 | 手動で100シート×書式変更(2時間) | Cellsループマクロを生成してもらい5秒で完了 |
| データバリデーション | 条件チェックを手動確認(ミスリスク大) | If+Cellsのループマクロで自動チェック |
| VBAコードのデバッグ | 自力でエラー調査(30分〜) | エラーメッセージをそのまま貼ると即解決策を提示 |
「VBAを覚えなければ自動化できない」という思い込みがありますが、Claude Codeを介すことで「何をしたいか」を伝えるだけで自動化できる時代になっています。VBAの文法に詳しくなくても、業務の内容さえ説明できれば十分です。
09 CONCLUSION まとめ CellsとRangeの使い分けから、Claude Codeによる自動化まで
この記事では、VBAのCellsプロパティについて基本構文から変数活用・ループ処理・Rangeとの組み合わせ・よくあるエラー・そしてClaude Code活用まで幅広く解説しました。最後にポイントを振り返ります。
VBAのCellsは、最初は単純な構文に見えますが、変数・ループ・Rangeとの組み合わせを習得することで、業務の自動化レベルが一気に高まります。さらにClaude Codeを活用すれば、VBAの習熟度に関わらず高品質なマクロを素早く手に入れることができます。
ExcelVBAを活用した業務自動化を、AI鬼管理が支援します
「Excelの集計作業をVBAで自動化したい」「Claude Codeを使ったマクロ生成を試してみたい」という方は、AI鬼管理にご相談ください。
弊社の実運用事例をもとに、あなたの業務に最適な自動化設計をご提案します。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
AI活用を自社で回せるようになりたい方へ
AI鬼管理
Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。
よくある質問
Q. VBAのCellsとRangeはどちらを使うべきですか?
A. 操作するセルが固定の場合はRange(例: Range("A1"))、変数やループで行・列番号が変わる場合はCells(例: Cells(i, j))を使います。一般的なルールとして、「静的な指定はRange、動的な指定はCells」と覚えておくと判断が速くなります。
Q. Cellsで列をアルファベットで指定することはできますか?
A. はい、Cells(1, "A")のようにアルファベット文字列でも指定できます。ただし、通常は数値(Cells(1, 1)でA列)を使う方が、変数と組み合わせやすいため一般的です。アルファベット指定は視認性重視の場面で使います。
Q. VBAのループでCellsを使うときに気をつけることはありますか?
A. ループ処理では「ループ変数が範囲を超えないか」に注意が必要です。特に動的に最終行を取得する場合は、Cells(Rows.Count, 1).End(xlUp).Rowで最終行を先に変数に格納してから使うことをおすすめします。また、ループ内でSelect操作を繰り返すとマクロが遅くなるため、値の操作だけならSelectを省いて直接Cells(i, j).Value = ...と書く方が高速です。
Q. Cells(Rows.Count, 1).End(xlUp).Rowとはどういう意味ですか?
A. 「Rows.Count」でExcelシートの最大行数(1,048,576)を取得し、そのA列(列番号1)の最下部のセルから上方向(xlUp)に移動して最後にデータが入っているセルを見つけ、その行番号(.Row)を返す、というコードです。データの最終行を動的に検出するVBAの定番テクニックで、データ量が変わっても正しく処理できます。
Q. VBAで書式ごとセルをコピーするにはどうしますか?
A. 値のみのコピーなら「Cells(1, 2).Value = Cells(1, 1).Value」で済みますが、書式も含めてコピーする場合は「Cells(1, 1).Copy Destination:=Cells(1, 3)」のようにCopyメソッドを使います。ただしCopyはクリップボードを使うため、大量のセルを処理する場合はValueのみのコピーの方が高速です。
Q. VBAを書けなくてもClaude CodeでExcelを自動化できますか?
A. はい。「A列にデータがある行について、B列の値が1000以上なら背景を赤にして」のように日本語で説明するだけで、Claude Codeが適切なVBAコードを生成します。生成されたコードをExcelのVBAエディタに貼り付けて実行するだけで自動化が完成します。VBAの文法を知らなくても、「何をしたいか」を言語化できれば十分です。
Q. シート全体のセルを指定するにはどうしますか?
A. 引数なしの「Cells」(Cells.Font.Name = "メイリオ"など)でシート全体の全セルを対象にできます。また「Cells.ClearFormats」でシート全体の書式をリセットできます。ただしシート全体への操作は処理が重くなりがちなため、必要な範囲に限定した方が実用的です。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
Claude Code を業務に落とし込む
専門研修コース一覧
受講者本人の業務を題材に、「使いこなせる」状態になるまで伴走する研修プログラム。1対1特化型・ハンズオン・法人講座の3コースを展開中。業務特化・実装まで踏み込むタイプのClaude Code研修です。
研修コース一覧を見る →AI鬼管理へのお問い合わせ
この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。




