はじめに

今回は組み込み関数の中の文字列関数を扱いたいと思います。人にわかりやすく表示するためには文字が必要です。文字の並び(文字列)を表示したい形にするための便利な関数です。文字列関数1回目として、文字列の変換(Format、Str、Val)、文字列の検索(Len、InStr、InStrRev)、文字列の切り出し(Left、Right、Mid)について説明したいと思います。

ゼロからはじめるVBA - 基本編
ゼロからはじめるVBA - VBA事始め編
ゼロからはじめるVBA - セル操作編
ゼロからはじめるVBA - 条件による分岐編
ゼロからはじめるVBA - 繰り返し処理編
ゼロからはじめるVBA - ユーザーフォーム編
ゼロからはじめるVBA - マクロの記録を使った例題編
ゼロからはじめるVBA - 数値関数編

文字列の変換

数値や日付も人が見える形で表現したい時は、文字に変換して表します。VBAは数値、文字、日付の表現が初心者に優しくなっていて、厳密に考えなくても、表示するものは、Excel側で文字列にしてくれます。しかし、「変数には数値、文字列などの形があって、一つの処理をする場合は同じ形のもの同士でないといけない。」ということを頭の隅に置いておくと、見つかりにくいバグに遭遇する機会を減らせると思います。

文字列などの型変換用の関数を以下に示します。数値や日付/文字列を表示したい形で文字列に変換するFormat関数、数値を文字列に変換するStr関数、文字列を数値に変換するVal関数があります。それぞれ説明します。

Format関数

数値や日付/文字列を、表示形式を指定して文字列に変換します。

[構文]Format関数

Format(value, format)
    value:変換する値  format:表示形式

以下に、具体的な用例を示します。

(1)数値→文字列に変換

まずは、数値を文字列に変換してみます。

以下説明するリストはsample.lzhの中に収録しています。サンプルとしてご活用ください。

[リスト1]Rei_Format1(文字列の変換.xlsm)

Sub Rei_Format1()
    a = 158692
    MsgBox (Format(a, "#,###"))   '(1)結果:158,692
    MsgBox (Format(a, "#,##0"))   '(2)結果:158,692
    a = 0
    MsgBox (Format(a, "#,###"))   '(3)結果:
    MsgBox (Format(a, "#,##0"))   '(4)結果:0

    a = 15.789
    MsgBox (Format(a, "#.000"))   '(5)結果:15.789
    MsgBox (Format(a, "0.000"))   '(6)結果:15.789

    a = 0.12
    MsgBox (Format(a, "0.000"))   '(7)結果:0.120
    MsgBox (Format(a, "0.###"))   '(8)結果:0.12
    MsgBox (Format(a, "#.###"))   '(9)結果:.12

    a = 0.1235
    MsgBox (Format(a, "0.000"))   '(10)結果:0.124
    MsgBox (Format(a, "0.###"))   '(11)結果:0.124
    MsgBox (Format(a, "#.###"))   '(12)結果:0.124

End Sub

表示形式には、「#」と「0」を使います。カンマ区切り用は「,」小数点は「.」を使用します。「#」と「0」の違いは、その場所に書かれるものが0の時で、小数点以上は上の桁がなく、小数点以下は下の桁がない時、「#」は空白になり、「0」は0が表示されるというものです。

(1)(2)は数値158692をカンマ区切りをつけて表示しています。今回の数値は0より大きいので、最後の桁の表示形式を「0」にしても「#」にしても同じ表示になります。

(3)(4)で表示する数値を0にしてみました。(3)はなにも表示しません。(4)は0を表示します。

(5)(6)は小数点表示です。「.000」の表示形式なので、小数点以下3桁まで表示します。数値が1以上なので、「0.」「#.」のどちらの表示形式でも同じ表示になります。

(7)(8)(9)で1未満の数値の表示を見てみましょう。(7)は「0.000」とすべて0なので、「0.」と表示され、小数点以下は3桁に固定されます。「0.12」の数値でも「0.120」と表示します。(8)で「0.###」と指定すると「0.12」と小数点3ケタ目の数値は表示されません。すべて「#.###」と「#」を書くと「.12」となります。

(10)(11)(12)は小数点以下4桁の数値をセットしてみました。表示形式は小数点以下3桁までの指定なので、最後の桁は四捨五入されて表示されます。

(2)日付を、表示形式を指定して文字列に変換

以下に、具体的な用例を示します。

[リスト2]Rei_Format2(文字列の変換.xlsm)

Sub Rei_Format2()
    a = DateTime.Now    '現在の日付
    MsgBox ("Format(a, "yyyy/mm/dd hh:nn:ss"))   '(1)結果:2010/01/01 12:00:00
    MsgBox ("Format(a, "yy/mm/dd hh:nn:ss"))   '(2)結果:10/01/01 12:00:00
    MsgBox ("Format(a, "gggee年"))             '(3)結果:平成22年
                                     'たとえば現在が 2010/01/01の12:00:00の時
End Sub

「/」や「:」や「年」等はそのまま表示されます。西暦を和暦に変換して表示したり、和暦を西暦に変換して表示したりととても便利な関数です。

指定できる表示形式は、以下の通りです。

表示形式 説明
g 年号の頭文字を返します (M、T、S、H)
gg 年号の先頭の 1 文字を漢字で返します (明、大、昭、平)
ggg 年号を返します (明治、大正、昭和、平成)
e 年号に基づく和暦の年を返します。1 桁の場合、先頭に 0 が付きません
ee 年号に基づく和暦の年を 2 桁の数値を使って返します。1 桁の場合、先頭に 0 が付きます
y 1 年のうちで何日目に当たるかを数値で返します (1 ~ 366)
yy 西暦の年を下 2 桁の数値で返します (00 ~ 99)
yyyy 西暦の年を 4 桁の数値で返します (100 ~ 9999)
h 時間を返します。1 桁の場合、先頭に 0 が付きません (0 ~ 23)
hh 時間を返します。1 桁の場合、先頭に 0 が付きます (00 ~ 23)
n 分を返します。1 桁の場合、先頭に 0 が付きません (0 ~ 59)
nn 分を返します。1 桁の場合、先頭に 0 が付きます (00 ~ 59)
s 秒を返します。1 桁の場合、先頭に 0 が付きません (0 ~ 59)
ss 秒を返します。1 桁の場合、先頭に 0 が付きます (00 ~ 59)

Format関数の日付の表示形式

(3)文字列を、指定した表示形式に変換

以下に、具体的な用例を示します。

[リスト3]Rei_Format3(文字列の変換.xlsm)

Sub Rei_Format3()
    b = "abcdefg"
    MsgBox (Format(b, ">"))   '(1)結果:ABCDEFG
    b = "HIJKLMN"
    MsgBox (Format(b, "<"))   '(2)結果:hijklmn
End Sub

(1)の「>」はすべての文字を大文字に変換すると言うことです。「<」は小文字に変換すると言うことです。

Str関数

表示形式を指定するのでなく、そのままの数値データを文字列化したい時、Str関数を使用します。表示形式は指定しないので、そのままの数値を表示します。VBAの場合、Excelのほうである程度、現在使用しているものが、数値表現か文字表現かを、判断してくれるので、あまり出番はないかもしれません。

数値を入れている変数が数値変数宣言されていて、その変数を文字列の一部に組み込みたい時などに使います。以下に、具体的な用例を示します。

[リスト4]Rei_Str(文字列の変換.xlsm)

Sub Rei_Str()
    a = 12.3
    MsgBox ("[" & Str(a) & "]") '結果:[ 12.3]
    a = -12.3
    MsgBox ("[" & Str(a) & "]") '結果:[-12.3]
End Sub

Str関数で数値を文字列にした時は、先頭に符号を表示するためのスペースが確保されます。スペースはプラスの意味です。マイナスの数値を指定してStr関数を使用した時は先頭にマイナス符号が確保されます。

Val関数

Str関数の逆で、文字列を数値に変換します。あたりまえですが、数式で計算をする場合、数値でないとできません。文章のなかの数値文字列を数値に変換して計算式に入れるときに使用します。Str関数の時にも書いたように、Excelのほうである程度、現在使用しているものが、数値表現か文字表現かを、判断してくれて、計算の場合は数値に変換して計算をしてくれるので、やはりあまり出番がないかもしれません。

数値文字列を入れている変数が文字列宣言されていて、その変数の値を計算に使用したい時などに使います。

通常の使い方は、変換する文字列変数には数値文字のみいれて行います。初めてVAL関数を覚えたとき、ちょっとした疑問が生まれます。「変換する数値文字列に数値以外が入っていたらどうなるのだろう」と。以下の例題で確認してみましょう。

[リスト5]Rei_Val(文字列の変換.xlsm)

Sub Rei_Val()
    s = "123ABC"
    a = Val(s)
    MsgBox ("[123ABC] = " & a)  '(1)    '結果:123

    s = "ABC123"
    a = Val(s)
    MsgBox ("[ABC123] = " & a)  '(2)    '結果:0

    s = "01.000"
    a = Val(s)
    MsgBox ("[01.000] = " & a)  '(3)    '結果:1

    s = "1 2 3 4 5"
    a = Val(s)
    MsgBox ("[1 2 3 4 5] = " & a)   '(4)    '結果:12345
End Sub

(1)は数値が先にきています。数値部分のみ変換します。(2)は文字が先にきています。変換できないということで、「0」を返します。(3)は数値「1」に前後「0」をつけました。ちゃんと「1」に変換してくれます。(4)は数値の間にスペースをいれました。スペースは無視をして、数値をつなげてくれました。

関数を覚えたとき出てきた疑問はすぐ例題を書いてみて確認してみると、より頭に入ってくると思います。実際にプログラムを組む場合、VAL関数に指定する変数に、数値以外が入っていたら困ることが多いので、VAL関数で変換する前に、エラーチェックの処理で確認をしてVAL関数を使うことが多いです。