業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、数値かどうか判定するIsNumeric、乱数を返すRnd、指定された小数点位置で丸めた数値を返すRound、指定された値が含まれる範囲を計算し、その範囲を表すPartitionの使い方について解説します。
今回のTipsも関数の使い方について解説する。今回は、「IsNumeric」「Rnd」「Round」「Partition」という「数値」に関する4つの関数の使い方だ。なお、関数の基本的な使い方については、Tips「コンパイルエラーにならない関数の使い方――括弧の有無、複数の引数、Callステートメント、戻り値、名前付き引数と順番」を参照してほしい。
「IsNumeric」は、式が数値として評価できるかどうかを調べ、評価できる場合はTrueを、それ以外はFalseを返す関数だ。桁区切り文字や、全角の数字も数値として認識される。
IsNumeric(expression)
「expression」には任意の式を指定する。
「IsNumeric」という新しいシートを用意し、図1のように数値を入力するセルと「チェック」ボタンを配置しておく。
「チェック」ボタンをクリックして入力された値が数値かどうかを判定するコードはリスト1になる。
Sub IsNumeric関数の使い方() Dim 判定 As Boolean If Range("C2").Value = "" Then MsgBox "データを入力してください。" Exit Sub Else 判定 = IsNumeric(Range("C2").Value) If 判定 = False Then MsgBox "残念ですが数値ではありません。" Exit Sub Else MsgBox "数値です!" Exit Sub End If End If End Sub
まず、ブール型変数「判定」を宣言する(2行目)。
セル「C2」に値が入力されていない場合は、警告メッセージを表示して処理を抜ける(3〜5行目)。それ以外は6〜15行目の処理を行う。
「IsNumeric」関数で、セル「C2」の値が、数値かどうかを判定して結果を変数「判定」に格納する(7行目)。
もし変数「判定」がFalseなら、「数値ではない」旨のメッセージを発して処理を抜ける(8〜10行目)。それ以外なら「数値です!」と表示する(12行目)。
VBE(Visual Basic Editor)を起動して[挿入]から[標準モジュール]を選択し、プロジェクト内に追加されるModule1内にリスト1のコードを記述する。このリスト1のマクロを「チェック」ボタンに関連付け実行した結果が図2だ。
「Rnd」は、乱数を返す関数だ。
Rnd (number)
「number」は省略可能で、任意の有効な式を指定する(表1)。
numberの値 | 戻り値 |
---|---|
number<0 | 常に引数numberのシード値によって決まる同じ数値を返す |
number>0 | 乱数系列の次の乱数を返す |
number=0 | 直前に生成した乱数を返す |
省略 | 乱数系列の次の乱数を返す |
参考「Rnd 関数」 |
図3のように「乱数値」を表示させるセルと、「乱数発生」ボタンを配置しておく。
各セルにはExcelのメニューから書式を設定している。各自が好きなデザインにしても構わない。
「乱数発生」ボタンをクリックしてセル「C2」に「1」から「10」の間の乱数を発生させるコードはリスト2だ。
Option Explicit Sub Rnd関数の使い方() Range("C2").Value = Int((10 - 1 + 1) * Rnd + 1) End Sub
セル「C2」に、「1」から「10」までの乱数を発生させて表示する簡単なコードだ。
VBEを起動して[挿入]から[標準モジュール]を選択し、プロジェクト内に追加されるModule1内にリスト2のコードを記述する。リスト2のマクロを「乱数発生」ボタンに関連付け実行した結果が図4だ。
「Round」は、指定された小数点位置で丸めた数値を返す関数だ。
Round(expression, numdecimalplaces)
「expresssion」は必須項目で、丸めを行う数式を指定する。「numdecimalplaces」は省略可能で、丸めを行う小数点以下の桁数を表す数値を指定する。省略すると、「Round」関数は整数値を返す。
図5のように、「科目」の平均点が入力されているセルと、「全体平均」を表示するセルと「実行」ボタンを用意しておく。
「Round」関数を用いて、「全体の平均」を小数点以下2桁で丸めを行うコードはリスト3だ。
Sub Round関数の使い方() Range("C5").Formula = "=AVERAGE(C2:c4)" Range("C5").Value = Round(Range("C5").Value, 2) End Sub
セル「C5」に「Formula」プロパティで平均を求める数式を書き込む(2行目)。
平均の求められたセル「C5」の値を「Round」関数で、小数点以下2桁で丸めて表示している(3行目)。
VBEを起動して[挿入]から[標準モジュール]を選択し、プロジェクト内に追加されるModule1内にリスト3のコードを記述する。リスト3のコードを「実行」ボタンに関連付け実行した結果が図6だ。
「Partition」は、指定された値が含まれる範囲を計算し、その範囲を表す文字列を返す関数だ。
言葉で説明しても、少し理解しづらいかもしれないので、図8の実行結果を参照してほしい。
Partition (Number,Start,Stop,Interval)
引数は全て必須項目だ。
「Number」は評価する整数を指定する。
「Start」は対象となる範囲の開始する値を指定する。0以下の値の指定はできない。「Stop」は対象となる範囲の終了する値を指定する。
「Interval」はStartとStopの間にある範囲の値を、何等分するかを指定する。1以下は指定できない。
図7のように「Start」「Stop」「Interval」「Number」を入力させるセルと「Answer」を表示するセルと「OK」ボタンを用意しておく。
各セルにはExcelのメニューから「書式」を設定している。読者の皆さんが好きなデザインにしても構わない。
各セルに値を入力して「OK」ボタンをクリックして「Answer」を表示するコードはリスト4になる。
Option Explicit Sub Partition関数の使い方() If Range("C2").Value = "" Or Range("C3").Value = "" Or Range("C4").Value = "" Or Range("C5").Value = "" Then MsgBox "未入力箇所があります。" Exit Sub Else Range("C6").Value = Partition(Range("C5").Value, Range("C2").Value, Range("C3").Value, Range("C4").Value) End If End Sub
セル「C2」「C3」「C4」「C5」が未入力の場合は警告メッセージを発して処理を抜ける(3〜5行目)。それ以外は6〜8行目の処理を行う。
7行目では、セル「C6」に「Partition」関数を使って、「Number」にセル「C5」の値を指定する。「Start」から「Stop」までに、「開始する値」と、「終了する値」を指定し、「Interval」で、指定した範囲(100〜500)の値を何等分するかを指定する。「Answer」に「Number」に指定した値が、どの範囲に含まれているかを表示する。
VBEを起動して[挿入]から[標準モジュール]を選択し、プロジェクト内に追加されるModule1内にリスト4のコードを記述する。リスト4のコードを「OK」ボタンに関連付け実行した結果が図8だ。
「100」から「500」までの数値を「100」で等分して「150」がどの範囲に含まれているかを表示した。「150」の値は「100」等分した中で、「100〜199」の範囲に含まれていることになる。
「Rnd」関数の使い道は、日常の業務というよりは、Excel VBAでゲームなどを作れる強者に必要な関数かもしれない。業務に利用する場合は、「1000」までの重複をしない乱数を発生させて、任意の「ID」番号に使用するぐらいかもしれない。
「Round」関数は、数値を丸める関数なので、使用されることは多々あるのではないだろうか。「小数点以下何桁まで丸めて表示」などは、学校でテストの平均点を算出する際などによく利用されるのではないかと思う。
いずれにせよ、さまざまな使い道が考えられるので、ぜひ利用していただきたい。
次回も引き続き、関数について解説する予定だ。お楽しみに。
薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。
1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。
2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。
Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。
Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。
Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。
Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。
Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。
Copyright © ITmedia, Inc. All Rights Reserved.