データの型変換

データ型の説明をする時に一緒に理解しておかなければならないのがデータ型の変換です。
「データ型変換関数」
VBAの世界ではVBA自身がこの「型変換」をある程度自動でやってくれます(「いらぬおせっかい」になることもあります)が、本来はデータ型の違う変数間で値の転記を行なう場合は、「データ型変換関数」を明示する必要があります。
「データ型変換関数」には以下のものがあります。
CBool ブール型(Boolean)へのデータ変換
CByte バイト型(Byte)へのデータ変換
CCur 通貨型(Currency)へのデータ変換
CDate 日付型(Date)へのデータ変換
CDbl 倍精度浮動小数点実数型(Double)へのデータ変換
CInt 整数型(Integer)へのデータ変換
CLng 長整数型(Long)へのデータ変換
CSng 単精度浮動小数点実数型(Single)へのデータ変換
CVar バリアント型(Variant)へのデータ変換
CStr 文字列型(String)へのデータ変換

「日付型」を例にしてみます。


'***************************************************************************************************
'   データ型変換のサンプル
'
'   作成者:井上治  URL:http://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
Option Explicit
Private Const g_cnsHiduke As String = "平成28年10月1日"     ' 元の日付

'***************************************************************************************************
'   元の日付に1を加える@
'***************************************************************************************************
Sub TEST1()
    '-----------------------------------------------------------------------------------------------
    MsgBox g_cnsHiduke + 1
End Sub

'***************************************************************************************************
'   元の日付に1を加えるA
'***************************************************************************************************
Sub TEST2()
    '-----------------------------------------------------------------------------------------------
    MsgBox CDate(g_cnsHiduke) + 1
End Sub

'***************************************************************************************************
'   元の日付に1を加えるB
'***************************************************************************************************
Sub TEST3()
    '-----------------------------------------------------------------------------------------------
    Dim HIDUKE As Date

    HIDUKE = g_cnsHiduke
    MsgBox HIDUKE + 1
End Sub

'------------------------------------------<< End of Source >>--------------------------------------


利用例として、文字列からの日付型(Date)への変換の例を挙げておきます。
プロシージャ「TEST1」は、文字列「平成28101日」に対する「翌日」を表示しようとする意図の記述ですが、文字列「平成28101日」はあくまで文字列であり、加減算の可能なデータ型として認知されず、

実行時エラー「型が一致しません。」

このように実行時エラーとなります。

このような場合には、文字列「平成28101日」を日付型として正しく認知させればよく、プロシージャ「TEST2」のように記述します。これを実行すると、

「2016/10/2」として正しく計算された。

このように101日のに1を加えて、102日と正しく日付が認識されて算出結果が得られます
CDate関数は日付と認識できる文字列から日付型への変換を行なうデータ型関数です。
※他頁でも説明していますが、日付型は内部が1日が1の増分値(日付未満の時刻は小数扱い)の「シリアル値」です。

プロシージャ「TEST3」は、「データ型変換関数」を使用せずに、型の違う変数に強制的に値を渡す例ですが、このサンプルではプロシージャ「TEST2」と同様に正しい結果が得られてしまいます。
ですが、これはExcel(VBA)がエラー救済として変換(暗黙の型変換?)してくれている結果と受け止めるべきだと思います。本来、「データ型変換関数」が存在する意味からして「データ型変換関数」を使用するのが本筋でしょう。このようにExcel(VBA)が救済してしまうのを、疑問も感じずにそのまま普通に利用してしまうのは、バージョンが変わった場合の不具合等にもつながる可能性があります。
なお、プロシージャ「TEST2」、「TEST3」はエラーにはなりませんが、転記元の文字列「平成28101日」が確かに日付なのかの問題が残ります。セルやユーザーフォームで文字列として入力されたものであれば、IsDate関数で入力値が日付として扱えるか判断した上で「データ型変換関数」に投入するようにして下さい。

さらに、数値の処理では端数の処遇に問題があります。
整数型(Integer,Long)に小数を含む値を変換させる場合、ちょうど「0.5」は「0」となり、「1.5」は「2」となります。これらは「最も近い偶数」になると説明されています。桁落ち部分の処理については「型変換」に先だって処理する必要があります。