エクセルVBAでは、セルを対象になにかしらの処理をすることが多くなります。それはエクセルのシートがセルと呼ばれるマスの集合でできたシートなので当然ですが、これらをあつかうマクロではRangeまたはCellsをつかったコードを書きます。
インターネット上のWebサイトを調べてみても、Rangeで書かれたコードも、Cellsで書かれたコードもたくさん見ることがありますが、どういった場面でどちらを使えば良いかがわかりにくいと感じるのではないでしょうか。
この記事ではエクセルVBAでRangeやCellsに使い方やそれぞれから使いやすい場面とそうでない場面などを解説していきます。今までセルのあつかいでRangeやCellsを何となく選んで使っていた人はこちらの記事を参考にして目的のマクロによって使いわけかたをぜひマスターしてください。
最近、RangeまたはCellsを使いだしたよ。って人も参考にしてみてね♪
結論
極論を言ってしまえば、ほとんどの場面でRangeとCellsどちらの方法でもマクロは作れますが、RangeとCellsの使い分けを考えるときの基本的には以下のような場合で分けると良いでしょう。
Rangeが使いやすい場面
・複数のセルの範囲を指定したいとき
・定義した名前のセルの範囲をあつかいたいとき
・セルの範囲をオブジェクトとしてあつかいたいとき
・セルの範囲が固定されているとき(データの増減などが発生せず常に一定の範囲であるとき)
Cellsが使いやすい場面
・ひとつのセルを指定したいとき
・セルごとのくり返し処理をしたいとき
・シート上のすべてのセルを指定したいとき
ものすごくざっくり言えば、いくつかのセルのかたまりをまとめて使った処理のときは「Range」で、セルを1つずつ使った処理のときは「Cells」だとおぼえればOKです。
それでは、RangeとCellsの基本的な書きかたとそれぞれの場面で使えるサンプルコードを詳しく解説していきます。
なぜ、膨大な事務作業でも定時で退社できるのか。
実務をプロから学べる「ユースフル」の動画は永年見放題。Q&A機能で分からないを放置しないから安心。
詳しくは以下のリンクをクリック
Rangeでセルを指定するときの書きかた
ご存知のとおりRangeでセルを指定するときは、列名,行数の順番で書きます。列名は文字列で指定するため(“)ダブルクォーテーションを囲みます。
RangeでA1セルを指定するときの書きかた
Range(“A1”)
Rangeが使いやすい場面
結論の部分でも書きましたが、どちらを使うことが正しいわけではないので、思いどおりに動いているのであればRange、Cellsのどちらを使うこともできます。ただ、それぞれの書きかたで使いやすい場面はあるので、ここでは比較的にRangeをつかったほうが簡単であると思われる場面を紹介していきます。
複数のセルの範囲を指定したいとき
Sheet1のA1セルからE5セルの範囲を選択する
サンプルコード
Option Explicit
Sub Range1_Select()
ThisWorkbook.Sheets(1).Range("A1:E5").Select
End Sub
上のコードを実行すると、シート1のA1からE5セルを選択します。
Sheet1のA6セルからJ15セルの範囲にまとめて文字を入力する
サンプルコード
Option Explicit
Sub Range2_Write()
ThisWorkbook.Sheets(1).Range("A6:J15") = "100セル"
End Sub
上のコードを実行すると、シート1のA6からJ15セルの全部に「100セル」をいう文字をまとめて入力します。
定義した名前のセルの範囲をあつかいたいとき
エクセルのシートでは特定のセル範囲に名前をつけて定義できます。
例えば、A6セルからJ15セルの範囲に「定義した範囲」という名前をつけてみました。
サンプルコード
Option Explicit
Sub Range3_ClearContents()
'シート1の"定義した範囲"をRangeをつかって指定する
ThisWorkbook.Sheets(1).Range("定義した範囲").ClearContents
End Sub
上のコードを実行すると、シート1のA6からJ15セルに書かれた文字をまとめて削除します。
※実行したときの動きがわかりやすいように、シート上のボタンクリックでコードが実行するようにしています。
指定した「定義した範囲」の文字が削除されたね♪
セルの範囲をオブジェクトとしてあつかいたいとき
セルの範囲をオブジェクト変数として処理できます。
例えば、以下のコードはシート1のA1からE10セルの範囲を「範囲」と名前をつけた変数にしています。
サンプルコード
Option Explicit
Sub Range4_object()
Dim 範囲 As Range
Set 範囲 = ThisWorkbook.Sheets(1).Range("A1:E10")
'指定のセル範囲を赤色に着色する
範囲.Interior.ColorIndex = 3
'イミディエイトウィンドウに結果を出力する
Debug.Print 範囲.Address '$A$1:$E$10 (セル範囲のアドレス)
Debug.Print 範囲.Rows.Count '10(セル範囲の行数)
Debug.Print 範囲.Columns.Count '5(セル範囲の列数)
End Sub
※オブジェクト変数にセル範囲を代入する場合は、Setステートメントを忘れずに書きましょう。
Rangeでセル範囲を変数にしちゃうんだね。
セルの範囲が固定されているとき
セルの範囲が固定されている場合はRangeで範囲を指定するコードが書きやすいです。
以下のシートでは、全国の支店名とその右となりのセルに売上額が入力されており、B1セルにすべての支店の売上を合計する処理をします。
売上を合計するセルの範囲は、新しく支店が増えない限りは変動することはないのでRangeで範囲を指定すると良いでしょう。
サンプルコード
Option Explicit
Sub Range5_fixedrange()
With ThisWorkbook.Sheets(2)'シート2
'B1セルに支店ごとの売上が入力された範囲をRangeで指定して合計する
.Range("B1") = Application.WorksheetFunction.Sum(Range("B4:B12,D4:D11"))
End With
End Sub
Rangeで指定するセル範囲が離れている場合(飛び地)でも、Range(“B4:B12,D4:D11”)のように(,)カンマで区切って指定します。
毎回おなじセル範囲の合計を計算するとかならRangeでOKだね。
Tips
上のサンプルコードに書いているWithってどういう意味?
Withステートメントはコードを短くして、見やすくする効果があるものです。自分が書いたコードをもっとスッキリさせたい人は以下のリンクより記事をご覧ください。
複数の行をあつかいたいとき
Rangeは複数行を範囲の指定するときに使いやすいです。
以下のサンプルコードは、エクセルのSheet1の1行目から5行目を選択状態にします。
サンプルコード
Option Explicit
Sub Range6_Rows()
With ThisWorkbook.Sheets(1) 'シート1
'1行目から5行目を選択する
.Range(Rows(1), Rows(5)).Select
End With
End Sub
※Rowは行という意味の単語です。複数の行としてRowsにして、はじまりとおわりを(,)カンマで区切って書きます。
複数の列をあつかいたいとき
Rangeは行と同じように複数の列を範囲として指定するときにも使いやすいです。
以下のサンプルコードは、エクセルのSheet1のA(1)列目からE(5)列目を選択状態にします。
サンプルコード
Option Explicit
Sub Range7_Columns()
With ThisWorkbook.Sheets(1) 'シート1
'1(A)列目から5(E)列目を選択する
.Range(Columns("A"), Columns("E")).Select
'または以下のように書きます
'.Range(Columns(1), Columns(5)).Select
End With
End Sub
※Column(カラム)はエクセルシートの列のことです。Columnsにして列を指定します。列の名前で範囲を指定するときは(“)ダブルクォーテーションで囲むことを忘れないようにしましょう。また、列を数の範囲で指定する書きかたもできます。
Cellsでセルを指定するときの書きかた
Cellsでセルを指定するときは、行数、列数の順番で書きます。いずれの値も数値で書くためRangeのようにダブルクォーテーションは必要ありません。
CellsでA1セルを指定するときの書きかた
Cells(1,1)
エクセルシートのA列は1、B列は2、C列は3となります。A1セルは1行、1列なので、上記のように引数を指定します。
Tips
Excelのオプション機能にある[R1C1参照形式を使用する]をONにするとエクセルシート上の列も数値で表示されるようになりますので、マクロを作るときに列名を数字に変換するのが苦手な人はこの機能を利用しましょう。
エクセルシートにおける表示の変化は以下のとおり。
Cellsが使いやすい場面
ここではCellsをつかったほうが簡単であると思われる場面を紹介していきます。
ひとつのセルを指定したいとき
1つのセルに対して何かの処理を実行したいときは、Cellsが便利です。
Sheet1のA1セルを選択する
サンプルコード
Option Explicit
Sub Cells1_select()
'シート1のA1セルを選択する
ThisWorkbook.Sheets(1).Cells(1, 1).Select
End Sub
Sheet1の指定したセルに文字を入力する
サンプルコード
Option Explicit
Sub Cells2_Write()
'セルを指定して文字を入力する。
'Cellsでは行,列の順番で数値を指定する。
ThisWorkbook.Sheets(1).Cells(1, 1) = "A1セル♪"
ThisWorkbook.Sheets(1).Cells(2, 1) = "A2セル♪"
ThisWorkbook.Sheets(1).Cells(1, 2) = "B1セル♪"
ThisWorkbook.Sheets(1).Cells(2, 2) = "B2セル♪"
ThisWorkbook.Sheets(1).Cells(5, 5) = "E5セル♪"
End Sub
Cellsでは左から行数、列数と指定するので、Cells(2,1)だと、A列の2行目で、Cells(1,2)はB列の1行目ということになります。
上のコードを実行すると、A1、A2、B1、B2、E5セルにそれぞれの文字を入力します。サンプルのように1つのセルそれぞれに処理を書く場合はCellsで指定すると良いでしょう。
セルごとのくり返し処理をしたいとき
Cellsはセルごとに何かの処理をくり返し実行するときに便利です。くり返しとは文字通り、指定された条件や回数に応じた分の処理をくり返すことです。
エクセルのマクロでCellsと言えば、ここで紹介する方法がいちばん多くみられる方法ではないかと感じられるほど一般的な使いかたになります。
以下のサンプルでは、セルに書かれた値を削除する処理をA1から順番に実行し、E5セルまでくり返します。
サンプルコード
Option Explicit
Sub Cells3_Repeatedly()
'Cellsの引数に変数をつかって位置を指定する
Dim 行 As Integer: 行 = 1
Dim 列 As Integer: 列 = 1
'A1セルからE5セルの範囲のセルに書かれた値を1つずつ削除する動作をくり返す
For 行 = 1 To 5
For 列 = 1 To 5 '行が1のときに列が1から5に変化する。行が2のときに…とくり返す
ThisWorkbook.Sheets(1).Cells(行, 列).ClearContents
Next 列
Next 行
End Sub
上のコードを実行すると、シート1のA1セルの文字を削除します。続いてB1セル、C1セル、D1セル、E1セルと進み、E列(列数が5)まで達すると、行数が2になり順番に処理をくり返します。
Tips
Cellsを使ったくり返しはわかるけど、Rangeではくり返しの処理はできない?
ここで紹介した方法以外のくり返しについては以下の記事でも紹介しています。
シート上のすべてのセルを指定したいとき
シート上のすべてのセルに何かしらの処理をするときもCellsが使えます。今までの説明で複数のセルの場合はRangeで、ひとつのセルの場合はCellsを使うようなイメージですが、シート上のすべてのセルをCellsで指定するときは次のように書きます。
サンプルコード
Option Explicit
Sub Cells4_AllSelect()
'シート1のセルをすべて選択する
ThisWorkbook.Sheets(1).Cells.Select
End Sub
上のコードを実行するとシート1のすべてのセルを選択します。
※すべてのセルにまとめて文字を入力するなどの処理を実行するとメモリ不足のエラーが発生する可能性があります。
RangeとCellsは組み合わせて使うこともできる
RangeとCellsを組み合わせてセルの範囲を指定することもできます。次のコードはRangeで指定するセル範囲の視点と終点をCellsで指定しています。
サンプルコード
Option Explicit
Sub Range_Cells1()
'RangeとCellsを組み合わせてA1からE5セルの範囲にまとめて文字を入力する
ThisWorkbook.Sheets(1).Range(Cells(1, 1), Cells(5, 5)) = "Range&Cells"
End Sub
上のマクロを実行すると、エクセルシートのA1セルからE5セルに”Range&Cells”を入力します。
まとめ
今回はVBAでセルや範囲を指定するときに出てくる、RangeやCellsの使いどころを紹介しました。
RangeとCellsは、エクセルのシートで動くマクロには避けて通れないものだと思います。わたしがVBAを書き出したころは、Cellsばかり使っていたのでRangeっているの?と考えている時期がありましたが、どちらかの方法のみで書くのではなく、この記事で紹介したようなものを参考に使いやすい場面で使いわけていくことでわかりやすく、ミスの少ないコードが書けるようになります。
RangeとCellsの使い分けのヒントになればうれしいな。
「会社で使うからExcelのスキルを上げたい…」
「独学でVBAをはじめたけど思うようにスキルアップした気にならない…」
ユースフルならそんな悩みを解決するヒントが見つかるかも!
まずは無料体験版のエクセル講座チェックしてみよう。
なぜ、膨大な事務作業でも定時で退社できるのか。
実務をプロから学べる「ユースフル」の動画は永年見放題。Q&A機能で分からないを放置しないから安心。
詳しくは以下のリンクをクリック
コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。
コメント