マクロVBA講座ブログ

事務職をしていて身についたマクロVBAを紹介する人

【Excel】初めてのマクロVBA制作【基本編】  -Range・Cells -

日に日に夏が近づいていますが、エアコンをつけるか悩んでいる今日この頃です。
皆さんは体調に気を付けてくださいね。

では早速、第3弾の内容はマクロを作るうえで必須の Range・Cells の使い方について説明していきます。


Range・Cellsとは?

前回の最後に少しだけ触れましたが、Range・Cells と言うのはどちらもセルを指定する動作です。
人の手で行う場合はセルをクリックする動作が一番近いかと思います。
この動作がなければ文字を入力したり、色を付けたりと Excel の他の動作を行う事ができません。

ではなぜ指定方法が2つもあるのか?

その疑問にお答えすべくそれぞれの特徴を説明していきましょう。

マクロを作る場所に関しては前回の記事をご覧ください。
nekunomon.hatenablog.com

■Range の使い方■

Range による単体指定

1つ目は Range の基本である単体を指定する以下コードをご覧ください。

【コード】

Sub Test_Range()

Range("B2") = "Test_Name①"

End Sub

※""(ダブルクオート):囲んだ範囲を文字として指定する。
※=(イコール):ここでは左のセルに対して右の内容を入力する動作。

【結果画面】

上記のマクロを起動するとセルの B2 に「Test_Name①」が入力されるコードとなっています。
内容はいたってシンプルで、 Range の後に ( ) で囲んだセルの位置に入力するコードとなっています。
また、注意点として""(ダブルクオート)に関しては必ず入力してください。理由を簡潔に説明すると文字として指定していないとどこに入力していいのか分からなくなりエラーとなってしまうのです。
(詳しくは変数についての記事を上げた際に説明いたします。)

Range による範囲指定

2つ目、Rangeで隣接した範囲を指定するコードは以下となります。

【コード】

Sub Test_Range()

Range("B2:C4") = "Test_Name②"

End Sub


【結果画面】

複数の指定の仕方として、( ) 内に指定したセルとセルを「:」(コロン)で繋げるとまとめて入力することが可能となっています。
上記コードだと、B2 ~ C4 までの範囲に文字を入力する動作をしています。
私の経験では文字をまとめて入力することはありませんでしたが、塗りつぶしやコピーまたは書類の一部の範囲を空白にするといった使い方をしていたコードになります。

Range による離れた範囲指定

3つ目は離れた単体の範囲を指定するコードとなります。
【コード】

Sub Test_Range()

Range("A2,B3,C4,C5,E8") = "Test_Name③"

End Sub


【結果画面】

複数の指定の仕方はもう一つあり、離れたセルに対して指定する場合は「,」(カンマ)で繋げると離れたセルにも同じ文字を入力することが可能です。
上記コードだと、A2・B3・C4・C5・E8 にそれぞれ同じ値を入力しています。
書類に名前を複数入力する場合や複数の同じタイトルを離れたセルに入力する際に応用できるコードになるかと思います。

■Range の特徴■

ここまでで、Range の使い方について説明を行いましたが Range のメリット・デメリットはもちろん存在します。ここでは特徴を交えて説明いたします。
メリットとしては、範囲が指定できる点・コードを見た場合の分かりやすい点があげられます。これから説明を行う Cells には範囲を指定する機能が無いためこれは Range 固有の使い方となります。もし、Cells で範囲を指定する場合は Range を使うことになるためあらかじめ覚えておくと良いでしょう。
逆にデメリットは、移動を行う動作は苦手としている点になります。
マクロを組む場合はセルを移動しながら処理を行っていく事を目的としている場合が大半を占めています。
そのため、Range を使う場合は入力セルが固定されてる状況が望ましいでしょう。
例えば日付を入力するセルだったり決まった場所に名前を入力する場合だったりと状況は様々ですが固定化されたセルのみを扱う様にしましょう。

メリット

 ・コードを確認した際にどのセルを対象としているのかが分かりやすい。
 ・まとまった範囲や離れた範囲を指定できる。

デメリット

 ・上下左右の動きを苦手としている。

■Cells の使い方■

Cells には使い方がほぼ1つしかないと言っていいほど範囲の狭いモノとなっています。
ですが、Cells が得意とする動作があるためそれを含めて説明していきます。

Cells による単体指定

まず、Cellsの使い方として以下のコードとなります。

【コード】

Sub Test_Cells()

Cells(2, 3) = "Test_Name①"

End Sub


【結果画面】

上記のコードだと C2 のセルに入力していることが分かります。
Cells の内容を一つずつ見ていくと 2に該当する箇所が "行" 、3に該当する箇所が "列" となります。
Range と違って2行目、3列目(C列)の交わるセルといった指定の仕方となります。
また、Range とは違う点として行と列の指定する順番が逆になっています。
仮に、Range("D7") とした場合は Cells(7,4) となります。

Cells による範囲指定

では、Cells で範囲を指定する場合はどうすればいいのか?
答えは以下のコードとなります。

【コード】

Sub Test_Cells()

Range(Cells(2, 4), Cells(3, 5)) = "Test_Name②"

End Sub


【結果画面】

指定方法としては、2行目、4列目と3行目、5列目をそれぞれ指定して範囲を Range で囲っている状況となります。Cells は1つのセルしか選択できない特性上、このように Range を使用しないと範囲指定ができません。

Cells による移動指定

Cells には移動しやすいといった特徴があり Range に比べると縦横の移動は簡単に行う事ができます。
ただし、この説明には For文や変数が含まれるため少し難しい内容となります。
For文や変数は次回以降に説明を行うのでここでは分からなくても問題ありません。

【コード】

Sub Test_Cells()

Dim i As Long

For i = 2 To 6
    Cells(i, 4) = "Test_Name③"

Next i

End Sub

※For :決まった回数を繰り返す処理

【結果画面】

上記の動作では For文や変数を使用していますが、注目すべきは Cells の ( ) 内の数字になります。
( ) 内の片方が変数となっており i には 2 ~ 6 までの数字が入る処理を行っています。
結果だけ見ると範囲を指定しているように見えますが、For文によって1つずつ文字を入力している処理を行っています。分かりやすく分解するなら以下のコードと同じになります。

【コード】

Sub Test_Cells()

Cells(2, 4) = "Test_Name③"
Cells(3, 4) = "Test_Name③"
Cells(4, 4) = "Test_Name③"
Cells(5, 4) = "Test_Name③"
Cells(6, 4) = "Test_Name③"

End Sub

上記のような指定方法だとマクロを組むのも億劫になってしまいますが、他の動作と合わせると縦横に動かしやすく1つずつセルを指定することができます。

■Cells の特徴■

Cells は少し使いずらい印象を持たれますが、Cells にもメリットがあります。
メリットとしては、縦横へ動きやすい点・セルを1つずつ処理しやすい点があげられます。
1つずつ入力処理が必要な時に使いやすく移動しやすいといった特徴があるためマクロを組むほとんどの場合に使用されるかと思います。また、デメリットとしては範囲を指定できない点になります。
範囲を指定する場合は必ずと言っていいほど Range を使う必要があります。使い方の3つ目のように1つずつ入力するやり方もありますが、処理時間が掛かってしまうためできる限り Range を使うといいでしょう。

メリット

 ・縦横へ動かしやすい
 ・セルを1つずつ処理できる

デメリット

 ・Cells 単体では範囲指定ができない

まとめ

今回はマクロの基礎中の基礎を説明しました。
2種類ほど指定の仕方がありそれぞれに特徴がありますが、人によって「コードは Range で統一した方がいい」「Cells で統一した方がいい」と言われています。ですが、私としてはコード内でも使い分けができていれば混ざっていても問題ないかと思っています。
Range はコード内でも見やすいですし、Cells は動かしやすいためそれぞれの特徴をもとに組むことができれば逆に見やすいコードを作る事ができると思います。
なので、見やすいコードを見つけるためにも是非とも自分なりに工夫したマクロを組んでみてください。

では、今回はここまでとなります。
次回は For文について説明をしていくので良かったら次回も見ていってください。

ここまで見ていただきありがとうございました。