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

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

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

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

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

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


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

Cellsとは

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

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

Rangeとの使い分け

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

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


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

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


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

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

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

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

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の大きな特徴は変数でセルを指定できることです。列インデックスと行インデックスで位置を指定、と聞いて鋭い方は気づかれたかもしれませんね。

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は以下の記事が参考になりますので、あわせて学習してみてください。

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

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

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

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

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

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

range10

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

range11

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

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

VBAの将来性

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

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

VBAの用途はさまざまで、

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

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

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

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

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

VBAより将来的にWebプログラミング言語がおすすめな3つの理由
更新日 : 2019年10月9日

まとめ

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

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

LINEで送る
Pocket

SEからWebエンジニアへ転職した理由

侍エンジニア塾卒業生の小池さんは、以前は社内SEとして約5年ほど勤務していました。しかし業務内容は社内のヘルプデスク対応など、プログラムを書く仕事は全くなかったそうです。

SEながらプログラムを書けない現状に「将来仕事がなくなるんじゃないか」と不安を感じ、プログラミング学習を決意。

弊社スクールで学習し、無事ベンチャー企業のプログラマーとして転職に成功しました。そんな小池さんの学習法や転職体験談を伺いましたので、是非ご覧ください。

「プログラミングができないSEは仕事がなくなる」不安を感じたSEが未経験から転職成功するまで
更新日 : 2019年10月7日

書いた人

本多 農

本多 農

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

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説