Chapter 5 データ型(実数)

イントロダクション コース

テーマ

 第5回目となる本稿のテーマは「 実数のデータ型を使う 」です。

 前回は整数を扱うデータ型について解説しました。今回は実数を扱うことが出来るデータ型について理解を深めていきます。特に Excel 上で動作するアプリケーションの特性上、様々な数値を扱うことが想定出来ます。整数と実数、両方を理解することは VBA プログラミングの基本と言えるわけです。

データ型(実数)

データ型( Single 型)

 それではプロジェクトエクスプローラーの Sheet1 をダブルクリックして Sheet1 シートモジュールを表示させてください。モジュールの最後に以下のコードを記述します。

Public Sub Chapter5()
    
    Me.Cells.ClearContents
    Me.Columns(2).NumberFormatLocal = "#,##0.00_ "
    
    Dim weight As Single
    Me.Cells(1, 1).Value = "Single の初期値は"
    Me.Cells(1, 2).Value = weight
    
    weight = Application.InputBox("あなたの体重を kg で入力してください", "体重", Type:=1)
    Me.Cells(2, 1).Value = "あなたの体重は"
    Me.Cells(2, 2).Value = weight
    Me.Cells(2, 3).Value = "kg"

End Sub

 上記コードを早速マクロ一覧から実行してください。実行すると体重の入力を促すダイアログが表示されると思いますので、ご自身の体重を小数点を含めて入力してみてください(実数を扱うデータ型の説明ですのでなるべく整数ではなく小数点以下まで入力してみてください)。体重の入力を終え「 OK 」ボタンをクリックしたら Sheet1 に表示された内容を確認してください。

 それでは順を追って説明していきます。まず最初の行にある

Me.Cells.ClearContents

この ClearContents は、「 内容を消去する 」という意味で、セルの値を消去するという動作をしてくれます。いつものようにこの行を最初から読んでみましょう。

自分自身全てのセル内容を消去する 」と読みます。このモジュールは Sheet1 シートモジュールですから自分自身とは Sheet1 のことでした。つまり、「 Sheet1全てのセル内容を消去する 」という意味ですね。

Me.Columns(2).NumberFormatLocal = “#.##0.00_ “

 次はこの行を説明します。Columns はカラム(列)の英語で複数形となっていますね。複数形ですから単一の列ではなく全ての列を意味しています。上記コードのように Columns(2) とすると、全ての列のうち 2列目という意味になり、つまり B列を指していることになります。NumberFormatLocal は Excel のセルの書式設定 – 表示形式を設定するプロパティです。この例では、小数点第二位まで表示し、数値の右側に半角スペースを入れる設定となっています。この書式記号は VBA の機能ではなく Excel の機能ですので書式記号の詳細についての説明は割愛します。書式記号を復習されたい方は「 Excel 書式記号 」で検索してみてください。

 この行は「 自分自身 の 全ての列のうち 2列目 の 表示形式に #,##0.00_ を代入する 」と読むことが出来ます。実際にその通りに動作しますので B列のいずれかのセルの書式設定を確認してみてください。

 続く 3行は、Single 型として変数 weight を宣言し、A1 の値として「 Single の初期値は 」という文字を代入し、A2 には何も代入していない weight を代入しています。A2 に表示された数値が Single 型の初期値ということになり、それは 0 です。

weight = Application.InputBox(“あなたの体重を kg で入力してください”, “体重”, Type:=1)

 この Application は現在起動している(今操作している)Excel を指しています。そして InputBox は Application のメソッドで、Excel の関数と同じような書き方をし、() の中には引数を指定して呼び出しています。この InputBox メソッドは、下の画像のような簡易的な入力ダイアログを表示します。

InputBox( Prompt, Title, Default, Left, Top, HelpFile, HelpContextID, Type) As Variant

これが InputBox メソッドのシグネチャ(メソッドの名前、引数の数と順序およびデータ型、戻り値のデータ型を示したもの)です。必ず渡さなければいけない引数は最初の二つで、入力を促すメッセージとタイトルです。今回のコードではさらに Type:=1 として入力されるデータの種類を渡しています。引数 Type に 1 を渡すと戻り値が数値となり、Type に 2 を渡すと戻り値はテキストとなります。今回のケースでは 1 を渡しているので戻り値は数値となります。そして、その戻り値を Single 型変数である weight へ代入しています。

 続く 3行により、A2 セルに「 あなたの体重は 」と表示され、B2 セルにはあなたが入力した体重が表示されます。C3 には体重の単位である kg が表示されます。

 それでは一度まとめておきましょう。

Single 型は実数を代入できるデータ型であり、その初期値は 0 です。

データ型( Double 型)

 続いて Double 型を使用してみます。先ほどのマクロに以下のコードを追加してください。別マクロではなく同一のマクロの中に記述します。( Me.Cells(2, 2).Value = weight の次の行から以下のコードを入力するという意味です)

    ' 追加
    Dim height As Double
    Me.Cells(3, 1).Value = "Double の初期値は"
    Me.Cells(3, 2).Value = height
    
    height = Application.InputBox("あなたの身長を cm 単位で入力してください", "身長", Type:=1)
    Me.Cells(4, 1).Value = "あなたの身長は "
    Me.Cells(4, 2).Value = height
    Me.Cells(4, 3).Value = "cm"
    
    If height <= 0 Then Me.Cells(4, 2).ClearContents: Exit Sub
    
    Dim bmi As Double
    bmi = weight / (height / 100) ^ 2
    Me.Cells(5, 1).Value = "あなたの BMI は"
    Me.Cells(5, 2).Value = bmi   
    

 コードの追加が出来たらマクロ一覧から実行してみましょう。今回は体重に続いて身長の入力を促されます。cm 単位で入力しましょう。

 身長の入力を促すコードは、体重を促すコードとほぼ同じです。変数 height のデータ型が Double 型となっています。InputBox で入力された身長が変数 height に代入され、B3 セルに小数点第二位まで表示されます。

If height <= 0 Then Me.Cells(4, 2).ClearContents : Exit Sub

 このコードは、If 文と言われるもので Excel 関数の IF と似たような働きをします。If に続く式を評価し、その結果が True であれば Then のあとに続くコードが実行される仕組みです。いつものようにコードを読んでみましょう。

もし、height <= 0 であれば 自分自身の全てのセルの 4行目 2列目の内容を消去して Sub を出る 」と読みます。入力された身長が height に代入されていますので、その身長が 0 以下であればこのシートの B4 セルの内容を消去してこのマクロを抜けるという意味になります。マクロを抜けるのですからこれ以降の行は実行されません。0 より大きい数値が入力されればこの条件式は False となりますので、その時だけ次行以降のコードが実行されることになります。

 続いて変数 bmi を Double 型で宣言し、weight / (height / 100) ^ 2 を代入しています。この ^ は自乗を意味する演算子で、x ^ 2 とすると x * x と同じ意味になります。つまりこの式は weight ÷ (height ÷ 100) × (height ÷ 100) のことです。この式が評価され(計算され)、変数 bmi に代入されます。そして変数 bmi の値は最後の行で B4 セルに代入され、表示されます。

 このように、Single 型と Double 型の使い方は全く同じです。それぞれのデータ型が扱える実数の範囲が異なるだけです。Single 型は一般的に単精度浮動小数点数型と翻訳され、Double 型は倍精度浮動小数点数型と翻訳されます。浮動とは小数点以下の桁が固定されていないことを表しており、小数点第一位までの小数を代入することも出来れば、小数点第五位まである値を代入することも出来るという意味です。また、単精度と倍精度の単・倍という漢字は、Double 型が使用するメモリーサイズが Single 型の倍のサイズであることからこのような表現がされています。それでは精度についてもう少し詳しく見ていきましょう。

精度の違い

 次のマクロを新しく作成します。以下のコードを Sheet1 シートモジュールへ記述してください。

Public Sub Chapter5_1()

    Dim singleTest As Single
    singleTest = Excel.WorksheetFunction.Pi
    Dim doubleTest As Double
    doubleTest = Excel.WorksheetFunction.Pi
    
    Debug.Print singleTest
    Debug.Print doubleTest
    
End Sub

 実行する前にコードの説明をしておきます。上記マクロの 3行目で Single 型変数 singleTest を宣言して、次の行で Excel.WorksheetFunction.Pi を代入しています。これが何を意味しているのかを考えてみましょう。読んでみるとなんとなく予想は出来ると思いますが

Excel.WorksheetFunction.Pi

 このコードは Excel ライブラリWorksheetFunction クラスPi メソッドを呼び出しています。つまり、円周率を返す Excel の関数を使っています。Excel シート上のセルに =PI() としたことがありますか?この PI() はこのメソッドを呼び出しています。この Pi メソッドは円周率を戻り値として返しますので、それを singleTest へ代入しています。

 さて、続く 2行もほぼ同じことをしていますが、変数 doubleTest は Double 型です。要するに Single 型の変数 singleTest と Double 型の変数 doubleTest の両方へ Pi メソッドの戻り値を代入しているわけです。

 最後の 2行を説明します。

Debug.Print singleTest

 これは、デバッグ時によく使用するメソッドで、Debug.Print のあとに変数を指定し、その指定された変数が保持している値をイミディエイトウインドウへ表示します。この 2行の場合、変数 singleTest と変数 doubleTest それぞれが保持している値をイミディエイトウインドウに表示するという動作になります。

 それでは実行してみます。今回はマクロの一覧からではなく VBE のデバッグ機能を利用してコードを実行してみましょう。

 VBE の画面にイミディエイトウインドウが表示されていない方は、キーボードで CTRL + G と操作してください。イミディエイトウインドウが表示されるはずです(下の画像と同じウインドウ)。

 そしてマクロ名( Chapter5_1 )の行にカーソルを合わせてから、VBE 画面の上方にある「デバッグ」メニューをクリックし、「ステップイン」をクリックします。

 すると、このようにマクロ名の行が黄色くハイライトします。これは次にこの黄色いコードを実行することを示しています。F8 キーを一回押してみてください。今度は singleTest へ Pi の戻り値を代入するコードが黄色くハイライトします。ここで、マウスカーソルを変数 singleTest の上へ持って行ってください。そうすると変数 singleTest が現在保持している値が表示されます。

singleTest = 0 という部分がそれです。現在このマクロは黄色くハイライトされた行を実行する直前でストップしている状態です。ですので変数 singleTest にはまだ何も代入されていない状態です。変数 singleTest には初期値である 0 が保持されていることが分かりますね。

 もう一度 F8 キーを押してください。次は doubleTest = Excel.WorksheetFunction.Pi の行がハイライトされます。現在のマクロの実行状況は、この黄色くハイライトされた行を実行する直前です。ですので変数 doubleTest をマウスでポイントすると doubleTest = 0 と表示されます。つまり、Double 型の初期値も 0 ということが分かります。

 さらに F8 キーを押すと、Debug.Print singleTest の行がハイライトされ、マクロはこの行が実行される直前でストップしています。続けてもう一度 F8 キーを押してください。この行が実行され、下の画像の状態となります。

 しつこいですが、現在のマクロの状態は黄色くハイライトされた行を実行する直前です。イミディエイトウインドウに表示された数値 3.141593 は Debug.Print singleTest によって変数 singleTest が保持している値をイミディエイトウインドウへ表示した結果です。つまり変数 singleTest は 3.141593 を保持しているということです。もう一度 F8 キーを押すと、End Sub が黄色くハイライトされ、イミディエイトウインドウには 3.14159265358979 が表示されます。Debug.Print doubleTest によって、変数doubleTest が保持している値をイミディエイトウインドウへ表示した結果です。つまり、変数 doubleTest は 3.14159265358979 を保持しているということです。もう一度 F8 キーを押してマクロを修了しましょう。

 変数 singleTest と変数 doubleTest には、Pi メソッドの戻り値として同じ値を代入したはずです。ですが、それぞれの変数が保持している値は異なりました。結論から述べますと、これが精度の違いです。Single 型変数よりも Double 型変数の方がより多くの桁を保持していましたね。これは Double 型変数の方が高い精度を持っていることを示しています。

まとめ

 本稿で学習した内容と追加の情報をまとめます。

データ型サイズ初期値扱えるデータの範囲精度
Single 型4 バイト0-3.40282×1038~3.40282×10387桁
Double 型8 バイト0-1.79769×10308~1.79769×1030815桁

 本稿では、実数を扱うデータ型である Single 型と Double 型について学習しました。二つのデータ型が使用するメモリーサイズと初期値は把握しておいてください。データの範囲と精度については今の段階では具体的な数字を覚える必要はありません。Single と Double では違いがあるという点だけ理解しておいてください。基礎コースにて再度この二つのデータ型について詳細を学習する予定です。

 それでは本稿はここで終了します、お疲れさまでした。また次回お会いしましょう。

タイトルとURLをコピーしました