VBA 文字列を変換する

はじめに

Excel VBA マクロの文字列 (String) を大文字小文字や数値に変換する方法を紹介します。

StrConv 関数」から、大文字小文字、全角半角などに変換できます。

CInt 関数」や「Val 関数」から、文字列を数値に変換できます。

CDate 関数」から、文字列を日付に変換できます。

互換性のある値は、そのまま数値型や日付型に代入しても自動で型変換されます。

Unicode と Shift_JIS を変換するには「文字コードを変換や判定する」をご覧ください。
数値を文字列に変換するには「数値を変換する」をご覧ください。
日付を文字列に変換するには「日付を変換する」をご覧ください。
  • 目次
    • 文字列の大文字と小文字を変換する
    • 文字列を数値に変換する
    • 文字列を日付に変換する

文字列の大文字と小文字を変換する

StrConv 関数」を使用して、文字列を「大文字と小文字、全角と半角、ひらがなとカタカナ」などに変換できます。

引数には (文字列, 文字種) を指定します。文字種には次のものがあります。

  • vbUpperCase:大文字に変換します。
  • vbLowerCase:小文字に変換します。
  • vbProperCase:各単語の先頭の文字を大文字に変換します。
  • vbWide:半角文字を全角文字に変換します。
  • vbNarrow:全角文字を半角文字に変換します。
  • vbKatakana:ひらがなをカタカナに変換します。
  • vbHiragana:カタカナをひらがなに変換します。
  • vbUnicode:システムの既定のコード ページを使って Unicode に変換します。
  • vbFromUnicode:Unicode からシステムの既定のコード ページ (Shift_JIS) に変換します。

Or を使って、文字種を組み合わせられます。

Dim s As String

s = StrConv("abc", vbUpperCase)      ' 大文字
Debug.Print(s) ' ABC

s = StrConv("abc def", vbProperCase) ' 先頭を大文字
Debug.Print(s) ' Abc Def

s = StrConv("ABC", vbWide)           ' 全角
Debug.Print(s) ' ABC

s = StrConv("あいう", vbKatakana)    ' カタカナ
Debug.Print(s) ' アイウ

s = StrConv("abc", vbUpperCase Or vbWide) ' 大文字と全角
Debug.Print(s) ' ABC 

Shift_JIS に変換

LenB 関数」から、文字のバイト数を取得できます。

VBA の文字コードは Unicode (UTF-16) です。1 文字 2 バイトで ABC は 6 バイトになります。

半角文字を 1 バイトとするには vbFromUnicode を指定して、Shift_JIS に変換する必要があります。

Dim i As Integer

i = LenB(StrConv("ABC", vbFromUnicode))
Debug.Print(i) ' 3

i = LenB(StrConv("ABC", vbFromUnicode))
Debug.Print(i) ' 6

i = LenB(StrConv("アイウ", vbFromUnicode))
Debug.Print(i) ' 3

i = LenB(StrConv("アイウ", vbFromUnicode))
Debug.Print(i) ' 6
VBA の文字コードについては「文字コードを変換や判定する」をご覧ください。

文字列を数値に変換する

文字列の数字を数値型に代入すると、その型に変換できます。変換できない文字列が含まれていると「エラー 13 型が一致しません。」が発生します。

Dim i As Integer
i = "123"
Debug.Print(i) ' 123

i = "1.5"
Debug.Print(i) ' 2、整数型なら偶数丸めされる

i = "32768"     ' エラー、オーバーフロー
Debug.Print(i) 

i = "123あいう" ' エラー、型が一致しません
Debug.Print(i)

Dim d As Double
d = "1.5"
Debug.Print(i) ' 1.5

CInt 関数

この方法は、文字列を数値型に代入したときと同じ結果になります。明示的に数値型に変換できます。

CInt 関数」などを使用して、指定した数値型 (Integer など) に変換できます。

  • CByte:Byte 型
  • CInt:Integer 型
  • CLng:Long 型
  • CSng:Single 型
  • CDbl:Double 型
  • CCur:Currency 型
  • CDec:Decimal 型

変換できないときは「エラー 13 型が一致しません。」が発生します。

Dim i As Integer

i = CInt("123")
Debug.Print(i) ' 123、Integer

i = CInt("1,234")
Debug.Print(i) ' 1234

i = CInt("1 2 3")
Debug.Print(i) ' エラー、型が一致しません

i = CInt("123あいう")
Debug.Print(i) ' エラー、型が一致しません

Dim l As Long
l = CLng("123")
Debug.Print(l) ' 123、Long

"1,234" のようにカンマ区切りの数字も変換できます。

空白や数字以外の文字列が含まれるときはエラーになります。

IsNumeric 関数」を使用して、変換できるか判定できます。数値に変換できるときは True を返します。

Dim s As String
s = "123あいう"

Dim i As Integer

If IsNumeric(s) = True Then ' 変換できるときだけ数値にする
    i = CInt(s)
Else
    i = 0
End If

Debug.Print(i)

Decimal 型に変換するには「CDec 関数」を使用します。それ以外の方法で Decimal 型は使用できません。

Dim d As Variant
d = CDec("79,228,162,514,264,337,593,543,950,335")
Debug.Print(d) ' 79228162514264337593543950335、Decimal

Val 関数

Val 関数」を使用して、文字列を数値に変換できます。基本的に Double 型に変換されます。

数値に変換できないときは 0 になります。文字列の先頭が数字ならその数値に変換します。

Dim d As Double

d = Val("123")
Debug.Print(d) ' 123

d = Val("あいう123")
Debug.Print(d) ' 0

d = Val("123あいう")
Debug.Print(d) ' 123

d = Val("1,234")
Debug.Print(d) ' 1

d = Val("1 2 3")
Debug.Print(d) ' 123

エラーを発生させることなく、数値に変換できます。

空白を削除してから変換されます。

"1,234" のようにカンマ区切りの数字はカンマの前までを変換します。「CInt 関数」なら数値に変換できます。

まとめ

とにかく数値にしたいときや、数字以外の文字列が含まれる可能性があるときは「Val 関数」を使用します。

確実に数字のみのときは「CInt 関数」や直接数値型に代入します。

文字列が含まれているときに変換したくないときは「IsNumeric 関数」を使用して判定します。

文字列を日付に変換する

日付や時刻形式の文字列を日付型 (Date) に代入すると、日付に変換できます。変換できない文字列が含まれていると「エラー 13 型が一致しません。」が発生します。

Dim d As Date

d = "2013/1/31"
Debug.Print(d) ' 2013/01/31

d = "2013年1月31日"
Debug.Print(d) ' 2013/01/31

d = "1:2:3"
Debug.Print(d) ' 1:02:03

d = "2013/1/2 3:4:5"
Debug.Print(d) ' 2013/01/02 3:04:05

d = "一月三十一日"
Debug.Print(d) ' エラー、型が一致しません

CDate 関数

この方法は、文字列を日付型に代入したときと同じ結果になります。明示的に日付型に変換できます。

CDate 関数」を使用して、日付型 (Date) に変換できます。

変換できないときは「エラー 13 型が一致しません。」が発生します。

Dim d As Date
d = CDate("2013/1/2 3:4:5")
Debug.Print(d) ' 2013/01/02 3:04:05

d = CDate("一月三十一日")
Debug.Print(d) ' エラー、型が一致しません

IsDate 関数」を使用して、変換できるか判定できます。日付に変換できるときは True を返します。

Dim s As String
s = "一月三十一日"

Dim d As Date

If IsDate(s) = True Then ' 変換できるときだけ日付にする
    d = CDate(s)
Else
    d = 0 ' 日付の初期値
End If

Debug.Print(d)

文字列から "24:00:00" のような、24 時間を超えるときは、変換できません。

24 時間以上を時刻を入力するには「TimeSerial 関数」を使用します。