[目次]この記事のコンテンツ一覧
はじめに
エクセルマクロ&VBA初心者超入門講座(2)とエクセルマクロ&VBA初心者超入門講座(3)ではセルを扱うための基本知識を中心に学びました。今回はWithステートメント、マクロのエクセル画面への登録方法、そしてif文の基礎を学びます。
いよいよ簡単なアプリなら作れるようになってくる段階ですね。
標準モジュールの準備
Excelのマクロは全て標準モジュールと呼ばれる場所に記述します。以下の手順に従って標準モジュールを画面に表示しましょう。
[挿入]⇒[標準モジュール]を選択します。
すると、標準モジュール⇒Module1と表示されます。下記画像の赤枠の部分です。
[Module1]を右クリックし、[コードの表示]をクリックします。これで、標準モジュールにマクロを登録する準備ができました。
「全てのマクロは常に標準モジュールに書き込む」と考えてOKです。
[スポンサードリンク]
Withステートメントを使いこなそう
Withステートメントは特に難しいものではありませんが、Withステートメントを理解するには先ずはWithステートメントを使わない例を見るのが手っ取り早いでしょう。
1 2 3 4 5 6 7 |
Sub WithStatementSample1() Range("A1").Value = "売上高" Range("A1").Font.Size = 20 Range("A1").Font.Bold = True End Sub |
まずはサンプルコードの解説をします。1行1行見ていきましょう。
Range(“A1”).Value = “売上高”これは簡単ですね。A1セルに「売上高」という文字列を代入しているだけです。
Range(“A1”).Font.Size = 20このコードは、A1セルのFontプロパティのSizeプロパティに20を設定しています。
なんだか長く連なっていてややこしく感じるかもしれません。ちょっと例え話をしてみましょう。
こんなVBAステートメントはありませんが、「パソコン(PC)のデバイス(周辺機器)のマウス」みたいなものです。もしコードで書くとしたら以下のようになるでしょう。
Pc.Device.Mouse
同じように、「セルのフォントのサイズ」を意味しているわけです。フォントの大きさは数値で指定するので、今回は適当に20にしてみました。
Range(“A1”).Font.Bold = Trueも似たようなものです。「セルのフォントのボールド(太字)」にTrue(真)を設定しているわけです。Trueという値は、ちょっと特殊で、True(真)の反対はFalse(偽)です。要は「真」か「偽」の2通りしかない値なんです。
で、フォントが太字かどうかって、「太字じゃない」・「太字である」に2通りしかないですよね?
だから、TrueかFalseのどちらか一方をBoldプロパティにセットしているというわけです。今回はTrueがセットされていますから、「太字にする」という意味になります。
しかし上記のコードにはちょっとめんどうな点があります。
1 2 3 4 5 6 7 |
Sub WithStatementSample1() Range("A1").Value = "売上高" Range("A1").Font.Size = 20 Range("A1").Font.Bold = True End Sub |
どこがめんどうかというと、Range(“A1”)を何度も書かなくてはならない点です。これを回避する機能がWithステートメントです。
では、「百聞は一見に如かず」ということで上記のコードをWithステートメントを使って書き換えてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub WithStatementSample2() 'Withステートメントの開始は【With オブジェクト】。このサンプルの場合はセルなのでRangeオブジェクトですね。 With Range("A1") .Value = "売上高" .Font.Size = 20 .Font.Bold = True End With 'WithステートメントはEnd Withで終わらせる。 End Sub |
このように書けば、いちいちRange(“A1”)を何度も書く必要はありませんね。
Withステートメントの書式
With オブジェクト
.プロパティ1
.プロパティ2
・
・
・
End With
理解を助けるためにもう1つくらいサンプルコードを見てみましょうか。
サンプルコード1ではあえてWithステートメントを用いない方法で書きます。
そしてサンプルコード2では、Withステートメントを用いて、サンプルコード1を簡略化します。
サンプルコード1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Sub WithStatementSample3() 'A1セルの値にワークシート関数を埋め込む。A1~A10の合計値。 Range("A11").Value = "=SUM(A1:A10)" 'フォントサイズを13に設定。 Range("A11").Font.Size = 13 'フォントの書式を太字に設定。 Range("A11").Font.Bold = True 'フォントのカラーを3(赤)に設定。 Range("A11").Font.ColorIndex = 3 'A11セルの表示形式を通貨に設定。 Range("A11").NumberFormatLocal = "\#,###" End Sub |
Range(“A11”).Value = “=SUM(A1:A10)”
おっとこれは見慣れない、パターンですね。実はRangeオブジェクトのValueプロパティには、普段ワークシートで利用している関数をセットすることもできるのです。従って、A1セルの値は=SUM(A1:A10)になります。
Range(“A11”).Font.Size = 13
これはさっきやったやつですね。「A11セルのフォントのサイズ」に13をセットしています。
Range(“A11”).Font.Bold = True
これもさっき説明したやつですね。「A11セルのフォントの太字にするかどうか」にTrue(太字にする)をセットしています。
Range(“A11”).Font.ColorIndex = 3
これは「A11セルのフォントの色」に3をセットしています。3は赤色を表します。
Range(“A11”).NumberFormatLocal = “¥#,###”
このコードでは「A11セルのセルの書式設定(NumberFormatLocal )」に“¥#,###”をセットしています。
“¥#,###”は、セルの書式設定を「通貨」に設定することを意味します。
¥記号で始まり、#,###となっているところには、数値が、2,000といった形になるというイメージです。
#は数字表すわけですが、#,###とすると、#が4つだから4桁までの数字にしか対応しない気がしますよね?
でも例えば、100000000000という数値がA11セルに入力されても、ちゃんと3桁区切りで、100,000,000,000と表示されます。
尚、サンプルコード1の実行結果は以下のようになります。
さて、このセクションではWithステートメントへの理解を深めることが目的でしたね。サンプルコード1をWithステートメントを使って書き換えると以下のように簡略化されたコードになります。
サンプルコード2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub WithStatementSample4() With Range("A11") .Value = "=SUM(A1:a10)" .Font.Size = 13 .Font.Bold = True .Font.ColorIndex = 3 .NumberFormatLocal = "\#,###" End With End Sub |
要は何度も同じこと(この場合はRange(“A11”))を書くのは面倒なので、With~End Withで囲まれた範囲に、特定のオブジェクト(この場合はRange(“A11”))のプロパティを列挙していいですよ。という機能なのです。
初歩的なIf文を使えるようにしよう!
If文とは条件分岐をするためのマクロです。全くプログラミングの経験がない方のためにまずは日本語でIf文を書いてみます(但しif関数を理解している方であれば、ここまで丁寧に説明する必要はないですね。)。
もし(所持金が500円)ならば、A1セルに”今日のお昼は牛丼です。”と表示する。
もし(所持金が1500円)ならば、A1セルに”今日のお昼は海鮮丼です。”と表示する。
もし(所持金が500円でも1500円でもない)ならば、A1セルに”所持金が不明です。”と表示する。
この日本語で書いたプログラム(?)を見れば分かる通り、A1セルに表示されるのは、「”今日のお昼は牛丼です。”」・「”今日のお昼は海鮮丼です。”」・「”所持金が不明です。”」の3通りのうちいづれか1つになりますよね?
このようにIf文は、条件によって実行されるプログラムを変えることができるのです。逆の見方をすれば、条件を満たさないコードは、実行されず、無視されるということです。
If文の書式
If 条件式1 Then 条件式1が満たされたときの処理
ElseIf 条件式2 Then 条件式2が満たされたときの処理
Else 全ての条件式が満たされなかった場合の処理
Thenは「ゼン」と読みます。和訳すると「それから、その後」という意味です。
Elseは「エルス」と読みます。和訳すると「その他の」という意味です。
Ifステートメントのサンプルコード1
1 2 3 4 5 6 |
Sub IfStatmentSample1() 'もしA1セルの値が「OK」だったら、背景色を緑色にする。43番は緑色を意味する。 If Range("A1").Value = "OK" Then Range("A1").Interior.ColorIndex = 43 End Sub |

条件式の部分は、A1セルの値が”OK”となっているかどうかを意味しています。
もしA1セルの値がOKとなっていれば、Range(“A1”).Interior.ColorIndex = 43が実行され、セルの背景色が緑色になります。
逆に、もしA1セルが空っぽだったり、”NG”といった値等が入っていたら、何も実行されません。セルの背景色は元の無色のままです。
ちなみに、セルの値の文字色を変えるコードは、
Rangeオブジェクト.Font.ColorIndex = 数値でしたね。
一方セルの背景色を変えるマクロは、
Rangeオブジェクト.Interior.ColorIndex = 数値です。
ColorIndexプロパティの色番号一覧
またRGB関数を用いてセルの背景色や文字色を設定することもできます。Excel2007以降のバージョンをお使いであれば、RGB関数によって16000色の色指定ができます。詳細は「Excel VBA|セルの背景色:Interior.ColorIndexプロパティの色番号対応表一覧」をご覧下さいませ。
Ifステートメントのサンプルコード2
今度は、If-ElseIf-Elseステートメントを使った条件分岐のマクロを紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Sub IfStatementSample2() 'A1セルが空欄かどうかを判定し、空欄ならば、MsgBoxメソッドで、エラーメッセージを表示する。 If Range("A1").Value = "" Then MsgBox Prompt:="A1セルが空欄です。必ず「OK」か「NG」かを入力して下さい。", Title:="エラーメッセージ" 'A1セルの値が「OK」ならば、A1セルの背景色を黄緑色にする。 ElseIf Range("A1").Value = "OK" Then Range("A1").Interior.ColorIndex = 4 'A1セルの値が「OK」”以外”ならば、A1セルの背景色を赤にする。 Else Range("A1").Interior.ColorIndex = 3 'If-ElseIf-else文を書くときは忘れずに必ず最後にEnd Ifを書く。 End If End Sub |
この例では3パターンに条件分岐しています。A1セルが空白の場合は下記の画像のようにエラーメッセージが表示されます。
尚、MsgBoxメソッドの書式は以下の通りです。
MsgBox Prompt:=”表示するメッセージ” Title:=”ホップアップ”のタイトル文”
また、thenに続いて改行している点に注意して下さい。
1 2 |
ElseIf Range("A1").Value = "OK" Then Range("A1").Interior.ColorIndex = 4 |
改行しなくても問題なくマクロは動作しますが、改行した方がVBAのコードが読みやすくなるというメリットがあります。読みやすいコードを書くことは自分にとっても他人にとっても極めて重要なことです。
if 条件式 Then
条件式が満たされた場合に実行する処理
というような形式でIf文を書く癖をつけておくと良いでしょう。
さて、A1セルの値が「OK」になっている場合は、以下のような実行結果になります。
さらに、A1セルの値が空欄でもなく、「OK」でもない場合、以下の画像のような実行結果になります。
1 2 |
Else Range("A1").Interior.ColorIndex = 3 |
IfとElseIfには、Thenをつける必要がありますが、Elseには条件式も必要なければ、Thenも必要ありません。なぜなら、Elseは、If文・ElseIf文のいづれの条件にも合致しなかった「その他の場合」を表すからです。
マクロをボタンに登録する
このセクションでは、マクロをボタンに登録し、ワークシート上のボタンをクリックすれば、マクロが起動するようにします。
ボタンに登録するマクロは選択しているセル(ActiveCell)を、A1セルにコピーするだけの簡素なマクロです。
コードは以下の通りです。
1 2 3 4 5 |
Sub CopyActiveCell() ActiveCell.Copy Destination:=Range("A1") End Sub |
まずは適当なオートシェイプ(図形)をエクセル画面に配置します。どの図形でもOKです。
次にオートシェイプ(図形)を右クリックし、[マクロの登録]を選択します。
すると以下のような画面になるので、[CopyActiveCell]を選択し[OK]をクリックします。
すると、
をクリックする度に、今選択しているアクティブなセルがA1セルにコピーされます。
なんの実用性もないのが悲しいところですが、先ずはマクロをボタン(というか図形)に登録し、図形をクリックする度にマクロが起動するように設定する方法を覚えていただければと存じます。
[スポンサードリンク]
おわりに
「エクセルマクロ&VBA初心者超入門講座(4)【Withステートメント・マクロの登録・If文その1】」はこの辺りで終わりにしたいと思います。まだまだ実用的なマクロを作るには、ご紹介している機能が足りないのが現状ですが、もう少しマクロを学べば、驚くほど便利なアプリを自作できるようになります。
今後とも、「エクセルマクロ&VBA初心者超入門講座」を宜しくお願い申し上げます。
【エクセルマクロの関連記事】
- エクセルマクロ&VBA初心者超入門講座一覧
- エクセルマクロ&VBA初心者超入門講座(1)【開発環境の準備】
- エクセルマクロ&VBA初心者超入門講座(2)【セルの操作をマスターしよう】
- エクセルマクロ&VBA初心者超入門講座(3)【セルの操作その2】
- エクセルマクロ&VBA初心者超入門講座(4)【Withステートメント・マクロの登録・If文その1】
[スポンサードリンク]
[スポンサードリンク]