更新日:、 作成日:

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