【VBA入門】Cellsでセルを指定(変数などRangeとの使い分けも解説)

こんにちは! 侍エンジニア ライターの本多です。

例えば、こんな指示を受けたとイメージしてください。「開始セルから終了セルの中で、特定の条件を満たすセルを色付けせよ!」

営業マンの売上表にて、目標未達のセルを色付けするといったケースです。こんなときに活躍するがVBAの「Cells」なのです。

ある範囲内においてセルを順番に選択する、これがCellsの大きな特徴です。その他Cellsにはさまざまな特徴があります。この記事では、「Cells」と「Cellsの使い方」といった基本的な内容から、

  • 変数でセルを指定する方法
  • Rangeを使ってセルを指定する方法
  • Rangeの引数にCellsを使う方法
  • 戻り値のRangeオブジェクトを使う方法


という応用的な内容まで解説します。

\業界最安級/
月額2,980円のプログラミングスクール

✔ 業界最安値の月定額2,980円
✔ 「Q&A掲示板」で平均30分以内に回答がもらえる
✔ 月に一度の「オンライン相談」で悩みを解決
✔ 教材の数は30種類以上
✔ 入会金不要+いつでも退会OK

詳しくはこちら

Cellsとは

Cellsとは、セルを個別に選択していくプロパティです。具体的には数値で行方向に何セル、縦方向に何セルという指定をします。似たような働きをするRangeもあります。

Cellsは範囲を指定するというより、どちらかというと単独のセルをピックアップして操作する、といったイメージです。それだけでなく、シート全体や行全体、列全体といった指定も可能です。

Rangeとの使い分け

Cellsには以下の特徴があります。

  • 変数で位置を指定できる。
  • シート全体を指定できる。


一方、Rangeには以下の特徴があります。

  • 範囲につけた「名前」で呼び出せる。
  • 複数の範囲が指定できる。
  • 開始セルと終了セルを指定できる。


範囲が変動の場合は、Cellsが適しています。逆に範囲が固定の場合は、Rangeが適しています。

シート全部、または行・列をまるごと選択する場合はCellsでしかできません。一方、複数の範囲を選択するのはRangeにしかできません。

Rangeの使い方については、こちらのサイトで詳しく解説していますので、ぜひ参考にしてください。

【VBA入門】Rangeでセルの範囲指定(Cellsとの使い分けも解説)
更新日 : 2021年4月23日

Cellsの使い方

ここでは、Cellsの使い方を具体的に見ていきましょう。

Selectでセルを指定する方法

Cellsは、行と列をインデックスで指定します。

[書式]

  1. Cells(行インデックス, 列インデックス).Select

C2を選択してみましょう。

[使用例]

  1. Sub Cells_Sample1()
  2. Cells(2, 3).Select
  3. End Sub

[実行結果]

Cells01

一番左上のセルを始点として、下へ2つ、右へ3つ進むという指示がCells(2, 3)と考えるとわかりやすいでしょう。C2という指定をしたいのにCells(2, 3)というのは分かりづらいですよね。もちろん「そのまま」指定することも可能です。

Cells(2,”C”).Selectとすることもできます。C2なのに(2,”C”)と、指定する順番が逆になるので注意してくださいね。

シート全体を指定する方法

Cellsで行や列を指定しなければ、全セルを指定することになります。

  1. Sub Cells_Sample2()
  2. Cells.Select
  3. End Sub

[実行結果]

Cells02

選択だけでは面白くないので、これを応用して全セルのフォントをMS Pゴシックに設定してみましょう。

まずはMS Pゴシック以外のフォントで文字を表示させました。

Cells03

そして次のコードを実行します。

  1. Sub Cells_Sample3()
  2. Cells.Font.Name = "MS Pゴシック"
  3. End Sub

[実行結果]

Cells04

全てのセルがMS Pゴシックに変わったのが分かります。

Offsetで特定のセルから相対指定でセルを指定する方法

あるセルを基準として、そこから行方向へや列方向へいくつという指定もできます。

[書式]

  1. Cells(行インデックス, 列インデックス).Offset(列方向, 行方向)

[使い方]

  1. Sub Cells_Sample4()
  2. Cells(2, 2).Offset(1, 2).Select
  3. End Sub

[実行結果]

Cells05

B2から下へ1セル、右へ2セル進んだ結果、D3へ進みました。

では上や左へ進めるにはどうすればよいでしょうか?実はOffsetは負の値を指定することも可能です。行方向は正の値で右、負の値で左に進みます。列方向は正の値で下、負の値で上に進みます。

変数でセルを指定する方法

冒頭で述べたとおり、Cellsの大きな特徴は変数でセルを指定できることです。列インデックスと行インデックスで位置を指定、と聞いて鋭い方は気づかれたかもしれませんね。

Cellsのかっこの中に、そのまま変数を入れることができるのです!

行カウンタをi、列カウンタをjとしてループ文を組んでみましょう。セルの中に(行カウンタ, 列カウンタ)という文字列を仕込んでみます。

文字を入れるには、「Cells(行, 列).Value = 文字列」と記述します。

  1. Sub Cells_Sample5()
  2.  
  3. Dim i As Integer '行カウンタ
  4. Dim j As Integer '列カウンタ
  5. For i = 1 To 5
  6. For j = 1 To 5
  7. Cells(j, i).Value = "(" & j & "," & i & ")"
  8. Next j
  9. Next i
  10.  
  11. End Sub

[実行結果]

Cells06

iとjは普通の変数(VBA以外の言語における変数と変わらないという意味で)としてプログラミングすることができます。iとjの両方とも1から5と固定しましたが、これらを算出するコードを作りそこから取得するといったことも可能です。

RangeとCellsを使ってセルを指定する方法

RangeとCellsの合わせ技でセルを指定してみましょう。Cellsは一番左上のセルを始点として行列を指定します。ですが、毎回そうではなく「フォームの決まった帳票の明細部分のみ範囲指定して処理をしたい」ということもあるでしょう。

そんな場合、一番左上から数えて何行何列で・・・・とやってしまうと、かなり大変です。決まった範囲を決めてしまい、そこからCellsにてセルを指定することも可能です。

  1. Sub Cells_Sample6()
  2.  
  3. Dim i As Integer '行カウンタ
  4. Dim j As Integer '列カウンタ
  5. Dim rng As Range '範囲オブジェクト
  6. Set rng = Range("B2:D6")
  7. rng.Interior.Color = vbRed
  8. rng.Cells(2, 2).Select
  9.  
  10. Set rng = Nothing
  11.  
  12. End Sub

[実行結果]

Cells07

分かりやすくするために、rngで定義した範囲を赤にしています。どこが選択されたのか注目してください。

本来ならCells(2, 2)によりB2のはずですが、C3が選択されています。B2からD6が範囲なので、B2を始点として行列ともに2ずつ動いてC3が選択されたというわけです。このように、Rangeとの合わせ技でCellsもさらに拡張できます。

Rangeは以下の記事が参考になりますので、あわせて学習してみてください。

【VBA入門】Rangeでセルの範囲指定(Cellsとの使い分けも解説)
更新日 : 2021年4月23日

Rangeの引数にCellsを使う方法

Rangeプロパティの引数にCellsプロパティを指定することで、セルの範囲を指定することが可能です。

[書式]
  1. Range(Cells1, Cells2).Select

Cells1からCells2の範囲を指定します。

[使用例]
  1. Sub Cells_Sample7()
  2. Range(Cells(2, 2), Cells(4, 4)).Select
  3. End Sub
[実行結果]

Cells08

戻り値のRangeオブジェクトを使う方法

CellsプロパティはRangeオブジェクトを返します。返されたRangeオブジェクトを使ってValueCopyClearなどのプロパティやメソッドを使うことができます。

Valueで値を取得、変更する方法

RangeオブジェクトからValueプロパティを呼び出すことで、セルの値を取得もしくは変更することができます。

サンプルコードで確認しましょう。

  1. Sub Cells_Sample8()
  2. ' セルの値の変更
  3. Cells(1, 1).Value = "侍エンジニア"
  4. ' セルの値の取得
  5. MsgBox Cells(1, 1).Value
  6. End Sub
[実行結果]

range09

Copyでセルをコピーする方法

RangeオブジェクトからCopyメソッドを呼び出すことで、セルをコピーすることができます。

サンプルコードで確認しましょう。

  1. Sub Cells_Sample9()
  2. Cells(1, 1).Copy Cells(3, 3)
  3. End Sub
[実行結果]

Copy02

セルのコピーについては、こちらのサイトで詳しく解説していますので、ぜひ参考にしてください。

VBAでセル・シート・ファイルをコピー(値、書式のみも解説)
更新日 : 2019年4月21日

Clearでセルをクリアする方法

Clearメソッドで指定した範囲をクリアすることができます。以下のような状態をクリアします。

range10

  1. Sub Cells_Sample10()
  2. Range(Cells(1, 1), Cells(2, 2)).Clear
  3. End Sub
[実行結果]

range11

RangeオブジェクトのClearメソッドの使い方については、こちらのサイトで詳しく解説しています。ぜひ参考にしてください。

【VBA入門】Rangeでセルの範囲指定(Cellsとの使い分けも解説)
更新日 : 2021年4月23日

VBAの将来性

VBAのスキルを学んで業務を効率化したい

このように思っている人は多いでしょう。

VBAの用途はさまざまで、

  • VBAのスキルがあれば転職できるのでは?
  • 業務効率化のスキルは需要が高そうだから

などが上げられます。確かに、業務効率化はどこの企業も目指していて、需要が高いように見えます。ただ、VBAを扱えることが強みになるかといわれると、すこし疑問があります。

VBAは基本的にエクセル上でしか使用することができません。しかし、最近では社内書式をスプレッドシートで管理している企業も増えており、今後エクセル自体の需要が少なくなってしまう可能性も考えられます。

そうなってしまうと、VBAを習得しても活躍の場が限られてしまいますよね。そう考えると将来的にVBAの需要はあまり高くないといえます。

ではVBAを学んでいる人はどうすればいいのでしょう。VBAの将来性や今後の対策などをこちらの記事でまとめているのでぜひご確認ください。

VBAの将来性に不安の声あり!4つの視点で2021年の動向を解説
更新日 : 2021年5月17日

まとめ

本記事ではCellsについて解説しました。Cellsはセルを選択するときに変数を利用できます。さらにRangeと合わせて使うともっと拡張できることがお分かりいただけたでしょうか。

ご自身で勉強を深めるとともに、Rangeの参考記事と合わせていろいろ試してみてくださいね!

\業界最安級/
月額2,980円のプログラミングスクール

✔ 業界最安値の月定額2,980円
✔ 「Q&A掲示板」で平均30分以内に回答がもらえる
✔ 月に一度の「オンライン相談」で悩みを解決
✔ 教材の数は30種類以上
✔ 入会金不要+いつでも退会OK

公式サイトはこちら

関西在住のITエンジニアです。普通の会社に勤務しながら、侍エンジニアのインストラクター、ライターとして活動しています。

あなたの目的に合わせた
SAMURAI ENGINEERの運営サービス

SAMURAI ENGINEER Pro

未経験でも挫折しないプログラミングスクール

詳細はこちら

SAMURAI ENGINEER Plus

日本最大級のサブスク型オンラインITスクール

詳細はこちら

SAMURAI ENGINEER Freelance

「一人で稼げる」スキルを身につける

詳細はこちら
Close
undefined