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

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

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

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

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

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


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

なお、VBAの学習で悩む時間を減らしたい場合は「侍テラコヤ」がおすすめです。プロの講師に「Q&A掲示板」で質問できますし、マンツーマンで60分相談できるチケットもあるので、直接わからないことを相談したい方にもおすすめです!

目次

Cellsとは

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

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

Rangeとの使い分け

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

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


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

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


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

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

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

なお、「RangeとCellsの使い分けのシーンを、プロのエンジニアに相談したい」と思った方には、「侍テラコヤ」がおすすめです。

▼侍テラコヤの「Q&A掲示板」で回答した質問の例

  • VBAでセルに枠線を引きたいが、方法がわからない
  • VBAで複数のセルを選択したいが、エラーが出て上手く行かない
  • VBAで、メッセージBOXの選択結果を他Subでも使用したい

1人で悩むのではなく、プロのエンジニアに相談しながら学んでみませんか。

Cellsの使い方

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

Selectでセルを指定する方法

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

[書式]

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

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

[使用例]

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

[実行結果]

Cells01

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

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

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

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

Sub Cells_Sample2()
  Cells.Select
End Sub

[実行結果]

Cells02

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

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

Cells03

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

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

[実行結果]

Cells04

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

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

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

[書式]

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

[使い方]

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

[実行結果]

Cells05

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

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

ここまで、Cellsの使い方について紹介しました。解説した内容についてまとめます。

  • Selectでセルを指定する方法
  • シート全体を指定する方法
  • Offsetで特定のセルから相対指定でセルを指定する方法
  • 変数でセルを指定する方法

実際にVBAを書いてみると、細かい疑問がいろいろ出て来ることもあるでしょう。わからないことが見つかった時に進めやすいよう、侍テラコヤを検討してみませんか。

侍テラコヤでは、以下のように「Q&A掲示板」を通してVBAの質問ができます。

▼侍テラコヤの「Q&A掲示板」で回答した質問の例

  • VBAでセルに枠線を引きたいが、方法がわからない
  • VBAで複数のセルを選択したいが、エラーが出て上手く行かない
  • VBAで、メッセージBOXの選択結果を他Subでも使用したい

解約はいつでもできるため、まずは気になっていることを質問してみてはいかがでしょうか。

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

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

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

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

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

Sub Cells_Sample5()

    Dim i As Integer '行カウンタ
    Dim j As Integer '列カウンタ
    
    For i = 1 To 5
        For j = 1 To 5
            Cells(j, i).Value = "(" & j & "," & i & ")"
        Next j
    Next i

End Sub

[実行結果]

Cells06

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

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

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

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

Sub Cells_Sample6()

    Dim i As Integer '行カウンタ
    Dim j As Integer '列カウンタ
    Dim rng As Range '範囲オブジェクト
    
    Set rng = Range("B2:D6")
    rng.Interior.Color = vbRed
    
    rng.Cells(2, 2).Select

    Set rng = Nothing

End Sub

[実行結果]

Cells07

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

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

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

Rangeの引数にCellsを使う方法

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

[書式]

Range(Cells1, Cells2).Select

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

[使用例]

Sub Cells_Sample7()
    Range(Cells(2, 2), Cells(4, 4)).Select
End Sub

[実行結果]

Cells08

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

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

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

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

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

Sub Cells_Sample8()
    ' セルの値の変更
    Cells(1, 1).Value = "侍エンジニア"
    
    ' セルの値の取得
    MsgBox Cells(1, 1).Value
End Sub

[実行結果]

range09

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

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

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

Sub Cells_Sample9()
    Cells(1, 1).Copy Cells(3, 3)
End Sub

[実行結果]

Copy02

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

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

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

range10

Sub Cells_Sample10()
    Range(Cells(1, 1), Cells(2, 2)).Clear
End Sub

[実行結果]

range11

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

VBAの将来性

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

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

VBAの用途はさまざまで、

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

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

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

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

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

なお、VBAの学習で悩んでいることがある方は「侍テラコヤ」がおすすめです!

▼VBAの学習で侍テラコヤが役立つ理由3つ

  • プロのエンジニアにVBAの質問ができる「Q&A掲示板」がある
  • 1回60分のマンツーマンレッスンで直接プロのエンジニアに相談できる
  • ITリテラシーやプログラミングの基礎を教材で学べる

侍テラコヤの詳しい魅力については、以下をチェックしてみてください!

まとめ

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

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

また「記事を読んだけれど、自分の悩みを完全に解決できなかった」という方もいるかもしれません。プロのVBAエンジニアへ質問したいことがある方は、この機会に「侍テラコヤ」へ入学してみませんか。

侍テラコヤでは、現役エンジニアへの質問や、教材を使ったプログラミング学習が可能です。VBAについて質問したいことがある方はもちろん、この機会にプログラミングへのチャレンジを考えている方もぜひチェックしてください。

この記事を書いた人

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

目次