Excelデータの入力不備で計算エラーが発生して家に帰れない!――入力規則よりも簡単なチェックマクロとは:働く価値を上げる“VBA/GAS術”(3)(2/2 ページ)
1つのExcelファイルを複数人で編集する場合、想定していたのとは違う形式でデータを入力されてしまい、不備が発生する可能性も少なくない。その問題をExcel VBAで解決するにはどうすればいいのだろうか。
イミディエイトウィンドウを使ったコードの確認
処理を記すときに必要となるイミディエイトウィンドウの操作方法を見ていきます。
その前に、開発を進めているプロジェクトの構成要素を確認できる「プロジェクトエクスプローラー」について確認しておきましょう。
プロジェクトエクスプローラー
VBEの左側に「プロジェクト - VBAProject」というウィンドウがあれば、すでにプロジェクトエクスプローラーが起動されています。もし表示されていなければ、VBEのメニューから「表示」→「プロジェクトエクスプローラー」か、またはショートカットキー[Ctrl]+[R]で開くことができます。
上記の図では、「数値チェック.xlsm」というプロジェクトが下記の要素で構成されていることが分かります。
- Sheet1(備品購入リスト)
- ThisWorkbook
- Module1
ここで注目すべきは「Sheet1(備品購入リスト)」で、これが今回のプロシージャ「数値チェック()」で操作をしたいと考えている「Worksheet」オブジェクトです。「オブジェクト」とはVBAで操作をする対象のことで、Excelのワークブック、ワークシート、セルなどは全てオブジェクトとして操作できます。
プロジェクトエクスプローラーを確認すると、オブジェクト名が「Sheet1」、ワークシート名が「備品購入リスト」であることが分かります。
【1】コマンドを実行できるイミディエイトウィンドウで「Sheet1」の確認
オブジェクト名「Sheet1」はVBA内で、そのままWorksheetオブジェクトを指し示して使用できます。試しに、下記コマンドをイミディエイトウィンドウで入力して[Enter]を押してみましょう。
? Sheet1.Name
イミディエイトウィンドウに「備品購入リスト」と出力されたはずです。コマンドの「Name」プロパティは、ワークシート名を表します。また「プロパティ」は、オブジェクトの属性情報を表すもので、オブジェクトの種類によって保有する情報が異なります。
イミディエイトウィンドウでは、「?」を使うことで、直後に書いたコマンドの結果および評価を表示します。
また、後述しますが、イミディエイトウィンドウでは、コードの実行結果も確認できます。
【2】セルの値を参照し、「Debug.Print」でイミディエイトウィンドウに出力
「Sheet1」でワークシートを指定できることが分かりましたので、今度はセルを指定していきます。セルを指定するには、Worksheetオブジェクトの「Cells」プロパティを使います。書式は以下の通りです。
Worksheetオブジェクト.Cells(行番号, 列番号)
行番号、列番号をそれぞれ数値で指定することで、該当するセルを操作できるようになります。例えばA1セルなら「Cells(1,1)」、E3セルなら「Cells(3,5)」と記入します。また指定したセルは、セルまたはセル範囲を表すオブジェクトである「Range」オブジェクトとして使います。
セルに記載されている値を取得する場合は、「Value」プロパティを使います。書式は以下の通りです。
Rangeオブジェクト.Value
この書式を使うことで、指定したRangeオブジェクト、つまりセルに記載されている値を参照できます。試しに、備品購入リストで下記プロシージャを実行してみましょう。
Sub シートの値を参照() Dim i As Long For i = 2 To 6 Debug.Print Sheet1.Cells(i, 2).Value Next i End Sub
実行をすると、B列の2〜6行目のデータがイミディエイトウィンドウに出力されます。このプロシージャでは、イテレータiが行番号をつかさどっているので、For〜Next文内で「Cells(i,2)」とすれば、2列目(=B列)を、2行目から6行目まで1行ずつ動かした場合のセルの値を参照できます。
「Debug.Print」は、指定した値をイミディエイトウィンドウに出力する命令で、デバッグのときなどに使うので、併せて覚えておくとよいでしょう。
【3】数値かどうかを判定する
プロシージャ「数値チェック()」では、2〜6行目のC列、D列についてその値が数値かどうかを判断して、数値でなければその背景色を黄色に変更する処理をします。つまり、「セルの値が数値かどうか」という条件を判定して、その判定結果に応じて処理を分岐する必要があります。
今回のような条件分岐処理をする場合、VBAでは「If〜Then」文を用います。書式は下記の通りです。
If 条件式 Then 処理
条件式は成立していれば「True」、そうでなければ「False」の値を取ります。条件式がTrueであれば、Thenの後の処理が実行されます。そうでなければ、何の処理も行われません。例として、下記コードを備品購入リストのVBAのイミディエイトウィンドウで実行してみましょう。
If Sheet1.Cells(2,3).Value >= 3 Then Debug.Print "数量は3以上"
イミディエイトウィンドウに「数量は3以上」と出力されます。2行目、3列目のC2に記載されている値は「5」ですから、Trueになります。一方で、下記を実行すると何も表示されません。
If Sheet1.Cells(2,3).Value < 3 Then Debug.Print "数量は3以下"
条件式が成立していませんのでFalseになり、結果としてThenの後の処理は実行されません。
今回、その条件式に「数値かどうか」という判定をする必要があります。数値かどうかを判定するには、「IsNumeric」関数を使います。関数というのは、与えられた入力(引数)に対して、何らかの出力(戻り値)をする機能のことをいいます。
IsNumeric関数では、以下のように括弧内に引数として値を指定すると、値が数値であればTrueを、そうでなければFalseを戻り値として返します。
IsNumeric(値)
例えば、下記コードを備品購入リストのVBAのイミディエイトウィンドウで実行してみましょう。
If IsNumeric(Sheet1.Cells(2, 3).Value) Then Debug.Print "数値"
イミディエイトウィンドウには「数値」と表示されます。「Cells(3,3)」にすると何も表示されなくなります。しかし、今回は「数値でない場合にセルの色を変更する」ので、条件式が逆です。その場合は、Not演算子を使うと条件式の結果を反転させることができます。以下のように、条件式の前にNotを記述します。
Not 条件式
条件式がTrueならばFalseに、FalseであればTrueに反転します。従って、下記コードが今回の目的に近いものとなります。
If Not IsNumeric(Sheet1.Cells(3, 3).Value) Then Debug.Print "数値ではない"
イミディエイトウィンドウに「数値ではない」と表示されますね。一方、「Cells(2,3)」にすると何も表示されません。
【4】セルの背景色を変更する
これで条件式は完成しましたので、条件式が成立したときの処理を作成します。セルの背景色を変更するときは、下記のように記述します。
Rangeオブジェクト.Interior.Color = 色
色は「RGB関数」を使ってR,G,Bの各値を指定する方法と、「vbYellow」「vbRed」などのあらかじめVBAで定義されている色定数を指定する方法があります。下記コードを備品購入リストのVBAのイミディエイトウィンドウで実行してみましょう。
Sheet1.Cells(3, 2).Interior.Color = vbBlack Sheet1.Cells(5, 4).Interior.Color = RGB(0,176,240)
図5のような結果になりました。
再度プロシージャ全体を確認
これで全ての命令についての解説が完了しました。再度プロシージャ「数値チェック()」の内容を確認してみましょう。
Sub 数値チェック() Dim i As Long For i = 2 To 6 If Not IsNumeric(Sheet1.Cells(i, 3).Value) Then Sheet1.Cells(i, 3).Interior.Color = vbYellow If Not IsNumeric(Sheet1.Cells(i, 4).Value) Then Sheet1.Cells(i, 4).Interior.Color = vbYellow Next i End Sub
次回はGoogle Apps Scriptで数値チェックをします
ワークシートの特定の範囲について数値かどうかをチェックするマクロを解説してきました。For〜Next文、If〜Then文などの基本構文、ワークシートやセルの操作など、VBAの基本を一通り学ぶことができたのではないでしょうか。Excel VBAでは数値のチェック以外にもさまざまな判定ができるので、ぜひ挑戦してみてください。
次回は、Google Apps Scriptで今回と同様の数値チェックをするツールを作っていきます。どうぞお楽しみに。
著者プロフィール
高橋宣成
プランノーツ 代表取締役
「ITを活用して日本の『働く』の価値を高める」をテーマに、ExcelやVBA、G Suite、Google Apps Script、クラウドなどによる企業または個人事業主向けのシステムおよびツールの開発やコンサルティング、セミナー講師などを務める。「IT×働き方」をテーマに運営するブログ「いつも隣にITのお仕事」は、開設2年弱で月間40万PV達成。
書籍紹介
高橋宣成著 秀和システム 1944円(税別)
動くコードが書けたその先、つまり「ExcelVBAを実務で使う」という目的に特化した実践書。ExcelVBAを楽に効果的に使いこなし続けるための知恵と知識、そしてそのためのビジョンと踏み出す勇気を提供する1冊。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- プログラム自動実行で仕事を楽に! APIでSlackなどと連携できる「Google Apps Script」とは
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、Googleが提供する数々のアプリケーションを操作できる「Google Apps Script」を紹介する。※ショートカットキーの解説あり - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり - Excel方眼紙をきめ細かい設定で簡単に作り印刷するには
業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。初回は範囲、列幅、行高、けい線の色を指定してボタン1つでExcel方眼紙を作成できるマクロの作り方を紹介します。余白も指定して印刷にも対応します。