連載
» 2015年04月09日 05時00分 UPDATE

VBA/マクロ便利Tips:数値判定、乱数発生、数値の丸めなど、数値に関する4つの関数の使い方

業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、数値かどうか判定するIsNumeric、乱数を返すRnd、指定された小数点位置で丸めた数値を返すRound、指定された値が含まれる範囲を計算し、その範囲を表すPartitionの使い方について解説します。

[薬師寺国安,PROJECT KySS]
「VBA/マクロ便利Tips」のインデックス

連載目次

※本Tipsの環境:Windows 8.1 Enterprise(64ビット)+Excel 2013


 今回のTipsも関数の使い方について解説する。今回は、「IsNumeric」「Rnd」「Round」「Partition」という「数値」に関する4つの関数の使い方だ。なお、関数の基本的な使い方については、Tips「コンパイルエラーにならない関数の使い方――括弧の有無、複数の引数、Callステートメント、戻り値、名前付き引数と順番」を参照してほしい。


数値かどうか判定するIsNumeric

 「IsNumeric」は、式が数値として評価できるかどうかを調べ、評価できる場合はTrueを、それ以外はFalseを返す関数だ。桁区切り文字や、全角の数字も数値として認識される。

IsNumeric関数の書式

IsNumeric(expression)


 「expression」には任意の式を指定する。

 「IsNumeric」という新しいシートを用意し、図1のように数値を入力するセルと「チェック」ボタンを配置しておく。

ExcelVBA5Tips_05.png 図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
リスト1 コード数値かどうかを判定するコード

 まず、ブール型変数「判定」を宣言する(2行目)。

 セル「C2」に値が入力されていない場合は、警告メッセージを表示して処理を抜ける(3〜5行目)。それ以外は6〜15行目の処理を行う。

 「IsNumeric」関数で、セル「C2」の値が、数値かどうかを判定して結果を変数「判定」に格納する(7行目)。

 もし変数「判定」がFalseなら、「数値ではない」旨のメッセージを発して処理を抜ける(8〜10行目)。それ以外なら「数値です!」と表示する(12行目)。

 VBE(Visual Basic Editor)を起動して[挿入]から[標準モジュール]を選択し、プロジェクト内に追加されるModule1内にリスト1のコードを記述する。このリスト1のマクロを「チェック」ボタンに関連付け実行した結果が図2だ。

ExcelVBA5Tips_06.png 図2 「IsNumeric」関数で入力した値が数値かどうか判定している

乱数を返すRnd

 「Rnd」は、乱数を返す関数だ。

Rnd関数の書式

Rnd (number)


 「number」は省略可能で、任意の有効な式を指定する(表1)。

表1 numberに指定する式
numberの値 戻り値
number<0 常に引数numberのシード値によって決まる同じ数値を返す
number>0 乱数系列の次の乱数を返す
number=0 直前に生成した乱数を返す
省略 乱数系列の次の乱数を返す
参考「Rnd 関数

 図3のように「乱数値」を表示させるセルと、「乱数発生」ボタンを配置しておく。

ExcelVBA10Tips_01.png 図3 「乱数値」を表示させるセルと、「乱数発生」ボタンを配置する

 各セルにはExcelのメニューから書式を設定している。各自が好きなデザインにしても構わない。

 「乱数発生」ボタンをクリックしてセル「C2」に「1」から「10」の間の乱数を発生させるコードはリスト2だ。

Option Explicit
Sub Rnd関数の使い方()
  Range("C2").Value = Int((10 - 1 + 1) * Rnd + 1)
End Sub
リスト2 「Rnd」関数で乱数を発生させるコード

 セル「C2」に、「1」から「10」までの乱数を発生させて表示する簡単なコードだ。

 VBEを起動して[挿入]から[標準モジュール]を選択し、プロジェクト内に追加されるModule1内にリスト2のコードを記述する。リスト2のマクロを「乱数発生」ボタンに関連付け実行した結果が図4だ。

ExcelVBA10Tips_02.png 図4 「乱数発生」ボタンで「1」から「10」までの乱数を発生させた

指定された小数点位置で丸めた数値を返すRound

 「Round」は、指定された小数点位置で丸めた数値を返す関数だ。

Round関数の書式

Round(expression, numdecimalplaces)


 「expresssion」は必須項目で、丸めを行う数式を指定する。「numdecimalplaces」は省略可能で、丸めを行う小数点以下の桁数を表す数値を指定する。省略すると、「Round」関数は整数値を返す。

 図5のように、「科目」の平均点が入力されているセルと、「全体平均」を表示するセルと「実行」ボタンを用意しておく。

ExcelVBA10Tips_03.png 図5 「科目」の平均点が入力されているセルと、「全体平均」を表示するセルと「実行」ボタンを配置する

 「Round」関数を用いて、「全体の平均」を小数点以下2桁で丸めを行うコードはリスト3だ。

Sub Round関数の使い方()
  Range("C5").Formula = "=AVERAGE(C2:c4)"
  Range("C5").Value = Round(Range("C5").Value, 2)
End Sub
リスト3 「Round」関数を使ったコード

 セル「C5」に「Formula」プロパティで平均を求める数式を書き込む(2行目)。

 平均の求められたセル「C5」の値を「Round」関数で、小数点以下2桁で丸めて表示している(3行目)。

 VBEを起動して[挿入]から[標準モジュール]を選択し、プロジェクト内に追加されるModule1内にリスト3のコードを記述する。リスト3のコードを「実行」ボタンに関連付け実行した結果が図6だ。

ExcelVBA10Tips_04.png 図6 「全体の平均」が小数点以下2桁で丸めて表示された

指定された値が含まれる範囲を計算し、その範囲を表すPartition

 「Partition」は、指定された値が含まれる範囲を計算し、その範囲を表す文字列を返す関数だ。

 言葉で説明しても、少し理解しづらいかもしれないので、図8の実行結果を参照してほしい。

Partition関数の書式

Partition (Number,Start,Stop,Interval)


 引数は全て必須項目だ。

 「Number」は評価する整数を指定する。

 「Start」は対象となる範囲の開始する値を指定する。0以下の値の指定はできない。「Stop」は対象となる範囲の終了する値を指定する。

 「Interval」はStartとStopの間にある範囲の値を、何等分するかを指定する。1以下は指定できない。

 図7のように「Start」「Stop」「Interval」「Number」を入力させるセルと「Answer」を表示するセルと「OK」ボタンを用意しておく。

ExcelVBA9Tips_01.png 図7 各値を入力させるセルと「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
リスト4 各セルに値を入力して「OK」ボタンをクリックして「Answer」を表示するコード

 セル「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だ。

ExcelVBA9Tips_02.png 図8 範囲の値を指定して、何等分するかを指定し、指定した値がどの範囲に属するかを表示した

 「100」から「500」までの数値を「100」で等分して「150」がどの範囲に含まれているかを表示した。「150」の値は「100」等分した中で、「100〜199」の範囲に含まれていることになる。

まとめ

 「Rnd」関数の使い道は、日常の業務というよりは、Excel VBAでゲームなどを作れる強者に必要な関数かもしれない。業務に利用する場合は、「1000」までの重複をしない乱数を発生させて、任意の「ID」番号に使用するぐらいかもしれない。

 「Round」関数は、数値を丸める関数なので、使用されることは多々あるのではないだろうか。「小数点以下何桁まで丸めて表示」などは、学校でテストの平均点を算出する際などによく利用されるのではないかと思う。

 いずれにせよ、さまざまな使い道が考えられるので、ぜひ利用していただきたい。

 次回も引き続き、関数について解説する予定だ。お楽しみに。

著者紹介

薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所

kuniyasu.jpg

薬師寺国安事務所代表。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© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。