[教えて!VBA] 第2回 一つのセルの値が「東京都」であることを条件として別のアクションを行うにはどうすればいいの??

概要

この記事について

かんたんな概要と結論

Excelのシートのセルに入力されたデータを読み取るには、
RangeあるいはCellsを使用します。

セルのデータを読み取り処理を様々に書くことができれば、
VBAマクロの表現の幅は非常に広がります。

こんにちは、dedeです。

この記事では、
VBAマクロに関する質問のうち、
皆が疑問に思っているトピックについて解説いたします。

今回は、 一つのセルの値が「東京都」であることをチェックする方法とその比較について
を解説いたします。

※この記事は、Office VBAマクロのうち
Excel VBAマクロに関するトピックです。

レベル:初級者向け

セルの値を調べたいのはどんな場合?

例えば、特定の値が入っているセルだけを対象として、
その隣のセルに文字を入力したい場合を考えます。

下記の図では、
都道府県が「東京都」と入力されたセルの隣のセルだけに「必要」と自動入力するマクロを想定しています。

想定する流れ

他にも、その値の入ったセル自身の背景色を変更したり、
値を取得してなにかの計算処理を加えて他のセルに反映するなど、
Excel VBAマクロにおいては、セルの値を参照することはもっとも使われる基本的なテクニックです。

方法

セルの値を取得する

セルの値を取得するには、
Rangeプロパティを使用する、あるいはCellsプロパティを使用することで実現できます。

いずれにしても、Rangeオブジェクト(プロパティと同名なのでややこしい)という
セル範囲の情報をもっているオブジェクトを取得する点では相違ありません。

※ここでいう「オブジェクト」とは、
対象としているものの情報とそれを操作する関数をセットで持っているデータの一種と理解ください。

例えばRangeオブジェクトはセル範囲のアドレスや、セルをコピーする操作関数を持っています。

Rangeを使う

次のようにRangeプロパティの引数にセルのアドレスを指定します。

1Dim cellValue As String
2cellValue = Range("B2").Value

このようにすると、B2セルに記載された内容を
文字列としてcellValue変数に格納します。

例えば、B2セルに「あいうえお」と入っていた場合、
cellValueにも「あいうえお」と入ります。

Cellsを使う

次のようにRangeプロパティの引数にセルのアドレスを 座標として 指定します。

1Dim cellValue As String
2cellValue = Cells(2, 2).Value

Cells(2, 2)というのはB2セルを指しています。

気づかれたかもしれませんが、
Cellsの引数の最初には対象セルの行番号が、その次には対象セルの列番号を数値に変換したものが入ります。

Cellsの引数規則

どちらを使えばいいの?

RangeでもCellsでも指定したセルの内容を取得できるとわかりましたが、
どのように使い分けるのか??

それは、
Rangeには一つのセルだけでなく複数のセルの情報をオブジェクトとして取得し、それらを操作できるという利点があるが、
Cellsは常に単一のセルを取り扱うプロパティだということに焦点を当てれば見えてきます。

例えば、
次のコードでは、 A1セルからC3セルまでのセルの背景色を一括で赤色に変更します。

1Range("A1:C3").Interior.Color = 255

そのため、
このように一括で複数セルを取り扱いたいときにRangeを使用します。

一方、Cellsを使った場合、
プログラムコードを見たときに単一のセルを取り扱っていることがすぐにわかるので、
「あっ、このコードのここの部分では一つのセルについて操作しているんだな」とわかりやすくなります。

上記の理由から、
複数セルを取り扱いたい場合以外では、Cellsを使用することを勧めます。

セルの値によって分岐させる

次に、
「IFステートメント」というVBAの構文を使って
取得したセルの値に応じて処理を分岐させます。

1If 評価式 Then
2    ここは評価式がYESであった場合にのみ実行されます    
3Else
4    ここは評価式がNOであった場合にのみ実行されます    
5End If

「評価式」とは、
内容がYES/NO(VBAの用語ではTRUE/FALSE)として表現できる式が入ります。

例えば「1 + 2 = 3」「東京は日本の首都」「滋賀は東北地方の県である」はすべて評価式です。

上記のIFステートメントを使って、
取得したセルの値が「東京都」であった場合にのみ隣のセルの値に「必要」と入力するコードは
次のようになります。

1If cellValue = "東京都" Then
2    Cells(隣のセルの行番号, 隣のセルの列番号).Value = "必要"
3End If

なお、ここでは評価式がNOであった場合には
何もしないので、
Elseステートメント部分は使用していません。

デモ

Cellsで書かれたデモ

都道府県が「東京都」と入力されたセルの隣のセルだけに「必要」と自動入力するマクロです。

 1Sub 必要の入力()
 2    
 3    If Cells(3, 2).Value = "東京都" Then
 4        Cells(3, 3).Value = "必要"
 5    End If
 6    If Cells(4, 2).Value = "東京都" Then
 7        Cells(4, 3).Value = "必要"
 8    End If
 9    If Cells(5, 2).Value = "東京都" Then
10        Cells(5, 3).Value = "必要"
11    End If
12    If Cells(6, 2).Value = "東京都" Then
13        Cells(6, 3).Value = "必要"
14    End If
15    
16End Sub

これを実行すると、
C3セルとC6セルにのみ「必要」と入力されます。

実行前

実行後

Range形式に書き直すと……

Range形式に書き直すと、次のように書けます。
もともとExcel関数をよく使っていたユーザにはこちらのほうが馴染み深いかもしれません。

 1Sub 必要の入力()
 2    
 3    If Range("B3").Value = "東京都" Then
 4        Range("C3").Value = "必要"
 5    End If
 6    If Range("B4").Value = "東京都" Then
 7        Range("C4").Value = "必要"
 8    End If
 9    If Range("B5").Value = "東京都" Then
10        Range("C5").Value = "必要"
11    End If
12    If Range("B6").Value = "東京都" Then
13        Range("C6").Value = "必要"
14    End If
15    
16End Sub

終わりに

セルからデータを取得して、
それに応じた処理を行うことは、
Excel VBAマクロでもっともよく使われるロジックです。

これをうまく使えるようになれば、
マクロの自動化の幅が非常に広がるでしょう。

ここには書ききれませんでしたが、
RangeCellsの使用法には他にもバラエティがあるので、
Microsoftの公式を見てみると面白いかもしれません。

関連記事

comments powered by Disqus