[教えて!VBA] 第2回 一つのセルの値が「東京都」であることを条件として別のアクションを行うにはどうすればいいの??
概要
この記事について
かんたんな概要と結論
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
の引数の最初には対象セルの行番号が、その次には対象セルの列番号を数値に変換したものが入ります。
どちらを使えばいいの?
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マクロでもっともよく使われるロジックです。
これをうまく使えるようになれば、
マクロの自動化の幅が非常に広がるでしょう。
ここには書ききれませんでしたが、
Range
やCells
の使用法には他にもバラエティがあるので、
Microsoftの公式を見てみると面白いかもしれません。
関連記事
- [Excel VBA] 年度に関わらず営業日数を算出する方法について紹介
- [Excel VBA] 結合セルにコピーペーストするマクロ
- [Excel VBA] PageSetup.PrintAreaによるシートの印刷範囲の変更を行うときにエラーになる場合&その回避方法
- [VBA] Excelの複数シートをループを使わず一行の処理で非表示・再表示にすることはできる??
- [VBA] ブック内の図形内のテキストを検索・置換するマクロ(Qiitaの記事の拡張)