VBAでセル/セル範囲を指定するために使用する、
Range,Cellsの基本的な使い方を解説します。
単独のセルを指定する場合
A1セルを指定するコード
単独のセル「A1」を指定する場合は、以下の3通りの書き方ができます。
Range("A1") Cells(1, 1) Cells(1, "A")
Rangeを使う場合はセルアドレスをそのまま入力できます。
Cellsを使う場合は、Cells(行番号, 列番号)とカンマで行と列を区切って指定します。
この時、列番号には数値を入れてもアルファベットを入れても問題ありません。
後ほど説明しますが、Cellsで書くメリットは「中身に変数を使えること」です。
よって、ただ「A1セル」を指定したいとき(≒変数がいらないとき)は、
Range("A1")と書いておくのがわかりやすいですね。
セルに値を代入する
以下のコードで「A1セルに1を入力」することができます。
Range("A1") = 1 Cells(1, 1) = 1 Cells(1, "A") = 1
同じ処理をしたいとき、RangeとCellsで書き方が変わることは基本ありません。
セルの値を使用する
以下のコードのようにセルの値を使用できます。
' B2セルの値をA1セルに入力(B2⇒A1への値貼り付けと同じ動き) Range("A1") = Range("B2") ' 四則演算を行ってから入力する Range("A1") = (Range("B2") + Range("C3")) / Range("D4") ' A1セルの値を現在のシートのシート名にする ActiveSheet.Name = Range("A1")
前述の通り、Rangeの部分をCellsで書いても同じように動きます。
セルの値をシート名に使用するなど、関数ではできないことを簡単に実行できるのはVBAの良さですね。
他のシートのセルを指定する
以下のコードで他のシートのセルを指定できます。
' シートの名前で指定する Worksheets("○○").Range("A1") ' シートの番号(左から何番目のシートか)で指定する Worksheets(1).Range("A1")
例えば以下のコードで、そのシートを選択せずに別のシートの値を変更できます。
Worksheets("○○").Range("A1") = 1 Worksheets(1).Range("A1") = 1
現在のシート以外のシートを扱えるのも、VBAの良さですね。
ちなみに、最初に使ったシートを指定しない場合の
Range("A1")
このコードは「現在選択しているシート」のA1セルを指しますが、
この「現在選択しているシート」をActiveSheetと呼び、
ActiveSheet.Range("A1")
でも同じ指定ができます。
言い換えると「Range("A1")はActiveSheet.Range("A1")の省略形」ということですので、こちらも覚えておきましょう。
他のブックのセルを指定する
以下のコードで他のブックのセルも指定できます。
Workbooks("Book1.xlsx").Worksheets("○○").Range("A1")
ただし、このブックは開いている必要がありますのでご注意ください。
※ ブックも番号(開いた順番)で指定することが一応できますが、
シート番号と違い開くたびに変わる数字なため基本は使用しません。
単独セルの解説については以上です。
この書き方が基本となりますので覚えておきましょう。
複数のセルを処理する場合(変数とループ)
変数とループを使った繰り返し処理
複数のセルに同じ処理をしたい場合は、
Forステートメントを使った繰り返し処理を行います。
例えば以下の表のD列を計算するコードがこちらです。
Dim R As Long For R = 2 To 7 Cells(R, 4) = Cells(R, 2) * Cells(R, 3) Next
D列(売上) = B列(単価) × C列(個数)
という計算を、2行目から7行目まで行うコードです。
このコードは「VBAプログラミングの基本コード」ですので、
しっかりマスターしておいて下さい。
RangeとCellsの使い分け
上記のコードは、D2~D7の6つのセルを処理していますが、
一括で処理されているわけではなく、1セルずつ順番に処理をしています。
- Rを2にする
- D2セルに「B2×C2」の結果を入力
- Rを3にする
- D3セルに「B3×C3」の結果を入力
・・・
よってセルの指定自体は「ひとつのセルを指定」しているのに変わりありません。
さてここで「ひとつのセルの指定方法」を思い出すと、
Range("A1") Cells(1, 1) Cells(1, "A")
この3つがあると説明しました。
この使い分け方はとても分かりやすく、
「変数を使いたい=ループ処理を書きたい場合はCells」
と覚えておけばOKです。
- 常にA1セルのように「完全に固定の1セル」であればRange("A1")
- D2~D7セルのように「順次処理する各セル」であればCells(R, 4)
と使い分けた通りです。
なお、Cellsの「列」に数字を使うかアルファベットを使うかは自由です。
- 列にも変数を使いたい場合は数字
- 表が小さく書きやすさを優先するなら数字
- 表がAA列を超えるなど読みやすさを重視したい場合はアルファベット
あたりの理由を参考に、好みの方法を選んで書けばOKです。
別シートのセルを処理する場合
別シートのセルを処理する場合も、単独セルと同様の書き方ができますが、
Dim R As Long For R = 2 To 7 Worksheets("○○").Cells(R, 4) = Worksheets("○○").Cells(R, 2) * Worksheets("○○").Cells(R, 3) Next
と、このままではかなり読みづらいコードになってしまいます。
シートだけでもこれなので、さらにブックの指定なんて書けません。
この対策としては、
以降「.」のみでシートを指定できるようになるWithステートメント
With Worksheets("○○") ' ← ここから先は「.」だけでこのシートを意味するようになる Dim R As Long For R = 2 To 7 .Cells(R, "D") = .Cells(R, "B") * .Cells(R, "C") Next End With ' Withの設定ここまで
シートを一度変数に入れる
Dim ws As Worksheet Set ws = Worksheets("○○") ' ← ここから先は変数wsでこのシートを指定できる Dim R As Long For R = 2 To 7 ws.Cells(R, "D") = ws.Cells(R, "B") * ws.Cells(R, "C") Next
などの方法があります。
シートの指定方法を勉強したい方は、以下の記事をご参考ください。
www.limecode.jp
これで複数セルをFor文で処理する場合の解説を終わります。
まとめとしては、
- A1など固定されたセルである場合はRange
- 変数を使いたい=ループ処理を書きたい場合はCells
を使用すればよいと覚えておきましょう。
セル範囲に一括で処理をする場合
最後に「セル範囲」へ一括で処理を行う場合のコードを解説します。
まずは以下のコードでセル範囲を指定できます。
Range("A2:A7")
シート関数の「SUM」の中身でもお馴染の「開始セル:終了セル」という指定で、
Rangeによるセル範囲の取得も行うことができます。
指定した範囲に一括で処理をする例としては、
' セル範囲の値をクリア Range("A2:A7").ClearContents ' セル範囲の背景色を設定 Range("A2:A7").Interior.Color = RGB(255, 0, 0)
など、セル範囲.○○というコードでいろいろな処理を実行できます。
よく出てくる書き方ですのでしっかり覚えておきましょう。
ひとつ覚えておきたいコードとしては、
Range("A2:A7").Value = Range("B2:B7").Value
と、セル範囲.Value = セル範囲.Value で値貼り付けができます。
手作業の「コピー⇒値貼り付け」はコードにすると大変なのですが、
このコードは単純明快でしかも高速ですので活用してみてください。
セル範囲を変数で扱いたい場合
RangeにはRange("セルアドレス")のほかにもう一つの書き方があります。
それがRange(開始Cells, 終了Cells)と、RangeとCellsを組み合わせる方法です。
例えばA2:A7セルをその書き方で書くと以下のコードになります。
Range(Cells(2, 1), Cells(7, 1))
開始セルと終了セルをそれぞれCellsで指定して、
それをカンマ区切りでRangeに渡すことでもセル範囲が指定できます。
これを利用することで「セル範囲を変数で指定できる」ようになり、
例えば最終行である「7」を変数で扱う場合は以下のコードになります。
Dim 最終行 As Long 最終行 = ActiveSheet.UsedRange.Rows.Count Range(Cells(2, 1), Cells(最終行, 1))
これで最終行がシートによって異なる場合でも、
セル範囲を自動的に取得して処理できるようになりました。
このRange(Cells, Cells)という書き方も、
これから先たくさん書くことになる基本コードです。
しっかりマスターしておきましょう。
ここまでのコードをまとめると、
- A1やA2:A7など固定されたセル/セル範囲である場合はRange
- 変数を使ってループ処理を書きたい場合はCells
- 変数を使ってセル範囲を指定したい場合はRange(Cells,Cells)
と使い分ければよいということになります。
他シート/他ブックのセル範囲を変数で指定する
他シートのセル範囲を処理する場合は、
Range(Worksheets("○○").Cells(2, 1), Worksheets("○○").Cells(7, 1))
と、中身のCells両方にシートの指定を付ければOKです。
この指定を忘れるとエラーになりますのでご注意ください。
またこのシート指定が何度も出てくるとかなり読みづらいコードになってしまうため、
Withステートメントや
With Worksheets("○○") ' ← ここから先は「.」だけでこのシートを意味するようになる Range(.Cells(2, 1), .Cells(7, 1)) End With
ワークシート変数
Dim ws As Worksheet Set ws = Worksheets("○○") ' ← ここから先は変数wsでこのシートを指定できる Range(ws.Cells(2, 1), ws.Cells(7, 1))
などを活用してください。
また、Cellsのシート指定は必ず必要ですが、
ws.Range(ws.Cells(2, 1), ws.Cells(7, 1))
このようにRangeのシート指定はあってもなくてもOKです。
個人的にはあった方が見やすいので、見やすさ重視で
「Range(Cells,Cells)は3つすべてにシート指定を付ける」
と覚えてしまってもよいと思います。
再掲になりますが、シート指定の方法についてはこちらを参考にしてください。
www.limecode.jp
使いたい変数が「最終行」の場合
Dim 最終行 As Long 最終行 = ActiveSheet.UsedRange.Rows.Count Range(Cells(2, 1), Cells(最終行, 1))
上記のように「使う変数が最終行だけ」の場合は、
実はもっと簡単にセル範囲を指定できる方法があります。
それがこちら
Dim 最終行 As Long 最終行 = ActiveSheet.UsedRange.Rows.Count Range("A2:A" & 最終行)
このコードのように、「セルアドレスを文字列結合で作る」方法でも、
セル範囲を指定することができます。
この方法はとても読みやすいコードになりますし、
さらに前項で苦戦した「他シートの指定」も、
Worksheets("○○").Range("A2:A" & 最終行)
これで済むためとても使い勝手が良いです。
最終行以外にも変数を使いたい場合は使えない手法のため万能ではないですが、
この方法はとても便利ですのでぜひ活用してください。
以上でRange,Cellsを使用したセル/セル範囲の指定方法の解説を終了します。
Range,Cells、正確には「Rnageプロパティ」「Cellsプロパティ」は、
VBAの核となるプロパティで、初級者から上級者まで全員が使います。
これから長い付き合いになりますので、しっかりマスターして、
快適なVBAライフのお供としてください。
また、セル範囲の指定方法はRange,Cells以外にもたくさんあり、
もっと簡単で便利に書ける方法もあります。
例えばA2:A〇セルの「〇はわからないけどデータ数はわかっている場合」は、
Range("A2").Resize(データ数)
なんていう書き方もできます。
直観的で読みやすいですよね。
いろいろなセル範囲の取得方法については以下の記事にまとめています。
興味がある方は、ぜひのぞいていってください。
おまけ:変数名について
Range,Cellsの説明とはちょっとそれますが、
変数名についても軽く解説しておきます。
Cellsを使用してForループを使ったコード
Dim R As Long For R = 2 To 7 Cells(R, 4) = Cells(R, 2) * Cells(R, 3) Next
このように行を「Row」の頭文字Rで表しました。
この変数名は自由に決めてよいため、
Dim 行 As Long For 行 = 2 To 7 Cells(行, 4) = Cells(行, 2) * Cells(行, 3) Next
こんな風に書くことも可能です。
変数名には日本語含めて好きな文字を使うことができますので、
自分なりにわかりやすい変数名にするとよいです。
また、ひとつ覚えておいた方が良い変数名として、
Dim i As Long For i = 2 To 7 Cells(i, 4) = Cells(i, 2) * Cells(i, 3) Next
と書かれているコードを見かけるかもしれません。
この「i」は整数(Integer)の頭文字に由来していて、
ループに使う変数は「i」を使うプログラミング文化があります。
個人的には、iは他のループでも使うため混線しないよう、
行列はR,Cなど「行と列だとすぐわかるもの」にした方がいいと思います。
例えばこれ↓とか
Cells(R, C) ' VS Cells(i, j)
他にもこれ↓とか
Worksheets(シートNo).Cells(R, C) ' VS Worksheets(i).Cells(j, k)
流石に前者の方が読みやすく間違えにくいです。
ただし、iを使ったコードもよく見ますので、
人のコードを読むために文化としては覚えておきましょう。
この変数名の考察についてはこちらをどうぞ。
www.limecode.jp