VBAのIf文の使い方です.

構文

If文は条件分岐して処理を行うために用いられます.
条件を満たした場合に何らかの処理を行う場合の構文は

If 条件 Then
条件を満たしたときの処理
End If

です.

例えば,A1セルに特定の英文が入っている場合にのみ,A2セルに文言を入れるコードは次の通りです.

Sub Happy()

If Cells(1, 1) = "you know what happiness is to you" Then
Cells(2, 1) = "Clap along"
End If

End Sub

条件文では=を代入ではなく等しいの意味で使いますが、特に問題はないでしょう。

A1セルの文言は条件通りなので、A2セルに文言が入った

問題

A1セルに「VBA」と入力されているときのみ、B1セルに「マクロ」と入れることができますか?

応用(アレルギー表示)

A1セルにフラグ「●」が立っているときのみ、B1セルに「※本品にはそば粉を使用しています。」という文言を元から入っていた文言の後ろに追加して入れてください。(追加方法を忘れた方は、文字結合をもう一度おさらいください。)

応用(コメントアウト)

A1セルに「コメントアウト」と入力されているときのみ、B1セルのテキストを<!---->で囲むことができますか?(HTMLのコメントのつけ方です。)

Else

条件を満たさなかった場合に何らかの処理を施したいなら、Elseを使います。
構文は

If 条件 Then
条件が真のときの処理
Else
条件が偽のときの処理
End If

です.

例えば,

Sub 幸せなら手をたたこう()

If Cells(1, 1) = "幸せ" Then
Cells(2, 1) = "手をたたこう"
Else
Cells(2, 1) = "指ならそう"
End If

End Sub

A1セルの文言は条件通りでないので、A2セルにElseの場合として文言が入った

条件

If文での条件は自由に設定できます。
例えば、以下の通りです。

  • Cells(1, 1) = 1:A1セルが1のとき
  • Cells(1, 1) > 0:A1セルが0より大きいとき
  • Cells(1, 1) >= 0:A1セルが0以上のとき
  • Cells(1 ,1) <> "":A1セルが空でないとき

「以上」とする場合に>=を使う点も、ExcelのIF関数と同じです。
直観的でないのは最後の<>(〜と等しくない)という演算子を用いるケースで、これだけ意図的に覚えればOKだと思います。

応用(画像挿入)
  1. A1セルが空欄でないなら、B1セルに<img src="../img/dummy.png" width="256" height="256" alt="ダミー画像">と入力してください。(HTMLファイルでimgタグは画像挿入に使われます。ダブルクオートを使っているので注意してください。)
  2. そのコードに手を加えて、A1セルが空欄ならB1セルに「画像後送」と入力するようにしてください。(Elseを使います。条件文を肯定文と否定文のどちらで作るかによって2通りの書き方ができます。)

For文と組合わせる

一定の範囲で、特定の条件を満たす場合だけ処理を行うことができるため、For文とIf文の組み合わせは強力です。

次のマクロは1〜10行目の範囲で、A列に特定の文言が入っているときのみB列に文言を入れます。

Sub グローブパペット()

Dim i As Long

For i = 1 To 10
If Cells(i, 1) = "うし" Then
Cells(i, 2) = "やきにく"
End If
Next

End Sub

「うし」だけ選択的に「やきにく」になった

応用(検索)

A1セルと同じ値をB列1〜10行目からFor文で探し,同じ値であれば右隣のC列に「同じ」,異なる値であれば「違う」と文言を入れるマクロを作成してください.

ちなみに,B列に全部違う値が入っているようなデータであれば,A1セルと同じ値は高々1つしかありません.そのような場合,「同じ」という文言を入れた時点でFor文を打ち切った方が処理が早く終わります.For文から抜けるためには,処理を打ち切りたいところでExit Forと命令します.

応用(マージ)

A列は重複のない品番,B列が品名である10行のデータがあります.
また,E列は重複のない品番,F列が価格である10行のデータがあります.
いずれも見出し行はありません.

A列とE列には同じ品番が入っていることが分かっていますが,順番が一致していません.
A列とE列の品番が一致するように,B列の横のC列へF列に記載されている価格を流し込み,列に関してデータをマージ(=併合)したいと考えています.

処理してください.

品番 品名 品番 価格
ABC-001 酸っぱい果実 ABC-003 5000
ABC-002 甘い果実 ABC-001 300
ABC-003 旨い果実 ABC-002 800

背景色

背景色は次のように設定します.

RGB関数は左から順にRed,Green,Blueで設定します.
値の範囲は0〜255です.

Sub セル背景色の設定例()
Cells(1, 1).Interior.Color = RGB(255, 0, 0) 'A1セルの背景色を赤に設定
End Sub

セル背景色を赤色にする例

上の背景色のように,セルは様々なプロパティ(=性質・属性)を持っています.
プロパティはさながら英語のbe動詞のように,セル背景色は青色である,文字は太字であるなど,「〜である」という情報を保持しています.

問題

C1セルを青色に塗れますか?

応用(差分検出)

1〜20行目において,隣り合うA列とB列で値が異なった場合に,A列のセルを赤色にしてください.

フォント

フォントは次のように設定します.
必要なものだけ適宜設定してください.

Sub フォントの設定例()

Cells(1, 1).Font.Color = RGB(0, 255, 0) '文字色を緑に設定
Cells(1, 1).Font.Bold = True '太字を設定
Cells(1, 1).Font.Italic = True '斜体を設定
Cells(1, 1).Font.Underline = False '下線を解除

End Sub

テキストを太字斜体で緑色にする例

セル背景色やフォントの他、文字の配置、罫線など飾り付けを行う機能にはExcel固有の変数名がたくさんあります。これらの変数名を覚えておく必要はありません。サーチエンジンやマクロの記録機能を使って調べることができれば十分です。

折角なので、ここで次のWithを使った書き方にも触れておきましょう。
複数同時に何かを設定したいときに共通部分を括り出すことができる便利な記法です。
上と全く同じものを次のように書くことができます。

Sub フォントの設定例2()

With Cells(1, 1).Font
.Color = RGB(0, 255, 0)
.Bold = True
.Italic = True
.Underline = False
End With

End Sub

Withを使って書き直した例

問題

B1セルの文言に下線を引けますか?

応用(ダミー検出)

1〜20行目において,値が999であるセルを太字かつ赤色にしてください.
ただし,斜体や下線は変更しないでください.

さらに条件分岐させる場合

条件を満たさない場合に,さらに別の条件を検討したい場合には,ElseIfを使います.

構文は

If 条件1 Then
条件1を満たしたときの処理
ElseIf 条件2 Then
条件1は満たさなかったが、条件2を満たしたときの処理
Else
それ以外の場合の処理
End If

であり,判定は上から順に行われます.

A1セルが何月になっているかに応じて,B1セルの文言を分岐する例は以下の通りです.

Sub お酒は二十歳になってから()

If Cells(1, 1) = "1月" Then
Cells(1, 2) = "は正月で酒が飲めるぞ"
ElseIf Cells(1, 1) = "2月" Then
Cells(1, 2) = "は節分で酒が飲めるぞ"
Else
Cells(1, 2) = "も酒が飲める飲めるぞ"
End If

End Sub

A1セルに2月と入っているときにマクロを実行した例

問題

上の例で、3月のときに雛祭りで酒が飲めると追加したいのであれば、どこにどのように書けばよいでしょうか?

なお、条件によって分岐するパターンが多数ある場合のため、Select文という構文も用意されています。

応用(配送方法)

A1セルに数値でフラグ1が立っていればA2セルに冷蔵、2なら冷凍、それ以外なら常温と入力してください。

複数の条件を組み合わせる

以下を用いることで、条件文を重文として記述できます。

  • And:かつ
  • Or:または
  • Not:〜でない

以下は、A1セルにフラグ、A2セルにフラグが立っているかどうかという2つの条件を利用してA3セルに文言を入力する例です。

Sub 人かつ魚なら人魚姫()
If Cells(1, 1) = "人" And Cells(2, 1) = "魚" Then
Cells(3, 1) = "人魚姫"
End If
End Sub

人と魚のフラグが両方立っているので、人魚姫となった

Sub 人または魚なら生き物()
If Cells(1, 1) = "人" Or Cells(2, 1) = "魚" Then
Cells(3, 1) = "生き物"
End If
End Sub

人フラグは立っていないものの魚フラグが立っているので、生き物となった

Sub 人でないけど魚なら人面魚()
If (Not Cells(1, 1) = "人") And Cells(2, 1) = "魚" Then
Cells(3, 1) = "人面魚"
End If
End Sub

人フラグは立っておらず、かつ、魚フラグが立っているので、人面魚となった

Notを使用するとコードが読みにくくなるので,できるだけ不等号<>を使用したり,言い換えられないかを検討することが望ましいです.

ド・モルガンの法則というものを算数の時間に習いましたが,接続詞AndOrを反転すれば,全ての重文に掛かっているNotを括り出すことができます.
例えば,(Not 条件1) And (Not 条件2)Not(条件1 Or 条件2)とシンプルに書き直すことができます.

応用(未入のチェック)

A1セルに品名が入っておらず,B1列に金額が入っているとき,A1セルに「未入」と入力し,かつ,背景色を設定してください.

おわりに

ここまでで反復と条件を身につけました.
この先,まだまだ知らない関数がたくさん出てくるでしょうが,人の作った簡単なマクロをコピーして,ググりつつ改変して使っていくことができると思います.
それでは,よきマクロライフを!