更新日:、 作成日:
VBA 数値を変換する
はじめに
Excel VBA マクロの数値 (Integer など) を文字列へ変換する方法を紹介します。
数値を文字列型 (String) に代入して、文字列に変換できます。
「Format 関数」から、数値の書式や形式を指定して文字列に変換できます。
数値を日付型 (Date) に代入して、日付に変換できます。
数値の 1 が 1 日を表します。時間は次のように計算できます。
- 1 時:1 / 24
- 1 分:1 / 24 / 60
- 1 秒:1 / 24 / 60 / 60
数値の型を変換する
数値を数値型 (Integer や Double など) に代入すると、その型に変換できます。
Dim i As Integer
Dim l As Long
i = 10
l = i ' Integer を Long に変換
i = l ' Long を Integer に変換
Integer などの整数型に小数を代入すると、偶数丸めされます。
Dim i As Integer
Dim d As Double
d = 1.5
i = d ' Double を Integer に変換
Debug.Print(i) ' 2
i = 2.5
Debug.Print(i) ' 2、偶数丸め
i = 3.5
Debug.Print(i) ' 4
i = 4.5
Debug.Print(i) ' 4、偶数丸め
オーバーフロー
数値型の範囲を超える値を代入すると「エラー 6 オーバーフローしました。」が発生します。
Dim b As Byte
Dim i As Integer
i = 256
b = i ' エラー、Byte の最大値は 255
次のような計算でもオーバーフローします。
Dim b1 As Byte
Dim b2 As Byte
b1 = 255
b2 = 1
Dim i As Integer
i = b1 + b2 ' エラー、結果が Byte の 256 のため
i = 255 + 1 ' OK、結果が Integer の 256 のため
通常であれば Integer に代入する数値は Integer に自動で変換されます。しかし、Byte と Byte を足し算した結果は Byte になります。結果を代入する前に Byte の 256 になるので、その時点でオーバーフローします。
CInt 関数
エラーが発生しないようにするには、代入する前に「CInt 関数」などで変換してから計算します。
Dim b1 As Byte
Dim b2 As Byte
b1 = 255
b2 = 1
Dim i As Integer
i = CInt(b1) + CInt(b2) ' OK
i = CInt(b1) + b2 ' OK、片方だけ変換しても大丈夫
Integer と Byte の結果は Integer になり、エラーになりません。
スポンサーリンク
数値を文字列に変換する
数値を文字列型 (String) に代入すると、文字列に変換できます。
Dim s As String
s = 123
Debug.Print(s) ' 123
s = 10.5
Debug.Print(s) ' 10.5
s = -100
Debug.Print(s) ' -100
数値がそのまま文字列になります。
Format 関数
「Format 関数」を使用して、数値の書式や形式を指定して文字列に変換できます。
引数には (値, 書式) を指定します。書式には次のものがあります。
- #:桁があればそれを表示します。
- 0:桁があればそれを表示します。ないときは 0 を表示します。
- %:数値を 100 倍し % 記号を表示します。
- \\:\ 記号を表示します。
- 文字:そのまま表示します。
Dim c As Currency
c = 1234567
Debug.Print(Format(c,"#,###,###")) ' 1,234,567
Debug.Print(Format(c,"0,000,000")) ' 001,234,567
Debug.Print(Format(c,"0")) ' 1234567
Debug.Print(Format(c,"#,###.00")) ' 1,234,567.00
Debug.Print(Format(c, "0.00%")) ' 123456700.00%
Debug.Print(Format(c, "\\#,###")) ' \1,234,567
Debug.Print(Format(c, "#,###円")) ' 1,234,567円
書式に # や 0 を指定したときは、それより小さい桁で四捨五入されます。
Dim s As String
s = Format(1.5, "#")
Debug.Print(s) ' 2
s = Format(2.5, "#")
Debug.Print(s) ' 3
s = Format(0.15, "0.0")
Debug.Print(s) ' 0.2
s = Format(0.25, "0.0")
Debug.Print(s) ' 0.3
紹介している書式は一部です。書式は Excel の表示形式とほぼ同じです。
数値を日付に変換する
数値を日付型 (Date) に代入すると、日付に変換できます。
数値の 0 が日付型の初期値 1899/12/30 になります。数値が 1 増えるごとに日付も 1 日増えます。
Dim d As Date
d = 1
Debug.Print(d) ' 1899/12/31
d = 0
Debug.Print(d) ' 0:00:00
d = -1
Debug.Print(d) ' 1899/12/29
d = d + 2 ' 1899/12/29 + 2
Debug.Print(d) ' 1899/12/31
0 が 0:00:00 になっているのは時刻を表すためです。例えば 1 時は正確には 1899/12/30 1:00:00 ですが、この日付は時刻を表すために省略されます。
小数を代入すると時刻になります。数値の 1 が 1 日になるので時間は次のように計算できます。
- 1 時:1 / 24
- 1 分:1 / 24 / 60
- 1 秒:1 / 24 / 60 / 60
Dim t As Date
t = (1 / 24) ' 1 時間
Debug.Print(t) ' 1:00:00
t = (1 / 24 / 60) ' 1 分
Debug.Print(t) ' 0:01:00
t = (1 / 24 / 60 / 60) ' 1 秒
Debug.Print(t) ' 0:00:01
Dim d As Date
d = 1
d = d + t ' 1 秒加える
Debug.Print(d) ' 1899/12/31 0:00:01
d = d + t ' 1 秒加える
Debug.Print(d) ' 1899/12/31 0:00:02
DateSerial, TimeSerial 関数
「DateSerial 関数」を使用して、年月日から日付を入力できます。
Dim d As Date
d = DateSerial(2000, 12, 31)
Debug.Print(d) ' 2000/12/31
「TimeSerial 関数」を使用して、時分秒から時刻を入力できます。
Dim d As Date
d = TimeSerial(1, 2, 3)
Debug.Print(d) ' 1:02:03
Dim d As Date
d = DateSerial(2000, 12, 31) + TimeSerial(1, 2, 3)
Debug.Print(d) ' 2000/12/31 1:02:03
スポンサーリンク