Chapter 7 データ型(テキスト)

イントロダクション コース

テーマ

 第6回目となる本稿のテーマは、「テキストを扱うデータ型を使う」です。

 前回までに整数と実数を扱うデータ型について解説してきました。今回はテキストを扱うデータ型について説明していきます。Excel 上で動作する VBA アプリは数値と同様、テキストデータを多く扱います。データがテキストである場合の他、ユーザーへ表示するテキストメッセージは対話型アプリケーションに必要不可欠な要素です。

データ型(テキスト)

データ型( String 型)

 それでは早速以下のコードを Sheet1 シートモジュールに記述してください。

Public Sub Chapter7()

    Me.Cells.ClearContents
    
    Dim defaultText As String
    Me.Cells(1, 1).Value = "String 型の初期値は"
    Me.Cells(1, 2).Value = defaultText
    
End Sub

 このマクロをマクロ一覧から実行するか、前回と行ったようにこのマクロのどこかにカーソルを移して F8 キーでステップイン実行してみましょう。

Dim defaultText As String

 この部分は変数の宣言ですね。As String としているので、この変数は String 型変数ということになります。この String 型変数こそが、テキストを扱うデータ型となります。このマクロは A2 セルの値に defaultText をセットしていますね。このときの defaultText 変数にはまだ何も代入されていませんから、String 型変数 defaultText の初期値が A2 に表示されます。

 A2 は空欄になっていると思います。つまり、String 型変数の初期値は空ということです。これを VBA では ナルストリング(または ヌルストリング )と呼び、空っぽの文字列という意味になります(文字列とは 0 文字以上の文字からなるテキストを意味しています)。

String 型変数はテキスト(文字列)を扱うデータ型であり、初期値は空文字(ナルストリング)です。

 ここまでは宜しいでしょうか?それほど難しくはないと思います。このマクロを以下のように修正してください。実際に文字列を入れてみます。

Public Sub Chapter7()

    Me.Cells.Clear
    
    Dim defaultText As String
    Me.Cells(1, 1).Value = "String 型の初期値は"
    Me.Cells(1, 2).Value = defaultText
    
    Dim familyName As String
    familyName = Application.InputBox("氏を入力してください。", "氏の入力", Type:=2)
    Me.Cells(2, 1).Value = "氏は"
    Me.Cells(2, 2).Value = familyName
    
    Dim givenName As String
    givenName = Application.InputBox("名を入力してください。", "名の入力", Type:=2)
    Me.Cells(3, 1).Value = "名は"
    Me.Cells(3, 2).Value = givenName
    
    Me.Cells(4, 1).Value = "氏名は"
    Me.Cells(4, 2).Value = familyName & " " & givenName
    
End Sub

 変数 familyName と givenName にそれぞれ InputBox で入力された氏と名を代入しています。InputBox メソッドのシグネチャを再度確認して引数をおさらいしておきましょう。

InputBox(Prompt As String, Title, Default, Left, Top, HelpFile, HelpContextID, Type) As Variant

 最初の引数に入力を促すメッセージ、次にタイトルを指定します。この二つ二つの引数は必須です。今回の例では Type に 2 を指定しています。引数 Type に 2 を渡すと戻り値が文字列になります。そして最後の行に

Me.Cells(4, 2).Value = familyName & ” ” & givenName

と記述しています。このコードは変数 familyName が保持している文字列に半角スペースと変数 givenName が保持している文字列を繋げて B4 セルの値として代入しているコードです。「 & 」は算術演算子の一つで、左右のオペランドを繋げる演算を行います。例えば familyName に 鈴木 、givenName に 太郎 が保持されているとき、

familyName & ” ” & givenName は 鈴木 太郎 と評価されます。

(ここにいう評価とは「式が演算されて結果を得ること」を意味しています。この式の場合 鈴木 太郎 という文字列が演算の結果得られ、それを「鈴木 太郎と評価される」と言います)

 このように、文字列は & オペレーターによって繋げることが出来ます。上記の例のように String 型変数と “” で囲われた文字を繋げることも出来れば、String 型変数同士を繋げることも出来ます。

文字列と数値の違い

 続いて、文字列と数値の取り扱いの違いについて説明したいと思います。まずは簡単な例から紹介します。以下のコードを Sheet1 シートモジュールへ記述してください。

Public Sub Chapter7_1()
    
    Dim text1 As String
    text1 = "123"
    Dim text2 As String
    text2 = "456"
    
    Dim number1 As Long
    number1 = 123
    Dim number2 As Long
    number2 = 456
    
    Debug.Print "text1 & text2 は " & text1 & text2
    Debug.Print "text1 + text2 は " & (text1 + text2)
    Debug.Print "number1 + number2 は " & CStr(number1 + number2)
        
End Sub

 早速マクロを実行してみましょう。マクロの一覧から実行しても構いませんが、今回は「記述したマクロのどこかにカーソルを移動させてから F5 キーを押して実行します。F8 キーを押すとステップイン( 1行ずつ)実行出来ることは既に学習しました。F5 キーの場合はどうなりましたか?途中でエラーが起きない限りマクロの最後まで実行されたと思います。F8 キーによるステップイン実行と合わせて F5 キーによる実行も覚えておきましょう。

 さて、イミディエイトウインドウに以下のように表示されたと思います。イミディエイトウインドウが表示されていない場合は、Ctrl + G を押して表示させましょう。

text1 & text2 は 123456
text1 + text2 は 123456
number1 + number2 は 579

 コードの説明をします。まず String 型変数として text1 と text2 を宣言し、それぞれに “123” と “456” というテキスト(文字列)を代入しています。

    Dim text1 As String
    text1 = "123"
    Dim text2 As String
    text2 = "456"

次に、Long 型変数 number1 と number2 を宣言してそれぞれに 123 と 456 という整数を代入します。

    Dim number1 As Long
    number1 = 123
    Dim number2 As Long
    number2 = 456

先ほど String 型変数 text1 と text2 に代入した “123” や “456” は「文字」は「数字」ですが「数値」ではありませんでした。それらはテキスト(文字列)であったことに注目してください。したがって、

    Debug.Print "text1 & text2 は " & text1 & text2
    Debug.Print "text1 + text2 は " & (text1 + text2)

text1 & text2 は、text1 と text2 という変数が保持しているテキストを連結するので、”123456″ というテキストに評価されます。それを Debug.Print によってイミディエイトウインドウに表示しているわけですね。

text1 + text2 は、どうでしょうか?実は文字列同士の演算に + オペレーターを用いた場合、この + オペレーターは & と同じ意味になります。つまり、二つの文字列を連結する効果を持ちます。したがいまして、text1 + text2 も、text1 と text2 という両変数が保持しているテキストを連結するので、”123456″ というテキストに評価されます。( text1 + text2 ) のように括弧で括られているのは、その手前の & よりも先に括弧内の演算を行うためです。

    Debug.Print "number1 + number2 は " & CStr(number1 + number2)

 この行は、みなさんが想定している結果を表示していると思います。number1 と number2 はともに Long 型変数ですから、number1 + number2 は両変数が保持する整数を加算することになります。つまり、123 + 456 = 579 という計算結果を得ます。number1 + number2 が CStr() の括弧の中に記述されているのは、number1 + number2 という式の演算結果である 579 という整数をテキスト(文字列)に変換するために行っています。CStr() は括弧内の数値をテキスト(文字列)に変換する機能を持っているのです。そして、”number1 + number2 は ” というテキストと & によって連結することで

“number1 + number2 は 579” というテキストを作成し、Debug.Print によってイミディエイトウインドウに表示しています。

 ちょっとややこしいかもしれませんが、コードと実行結果を見比べながらコードの意味を理解するようにしてください。ここで一度学習した内容を整理しておきます。

& は、二つのテキストを連結することが出来る

+ は、その両サイドのデータ型が String 型であるとき、 & と同じようにそのテキストを連結することが出来る

CStr() は、() 内に指定した数値型(整数や実数)をテキストへ変換することが出来る

暗黙の型変換

 さらにテキストと数値の計算を見ていきます。以下のコードを Sheet1 シートモジュールへ追記してください。

Public Sub Chapter7_2()

    Dim textValue As String
    Dim longValue As Long
    
    textValue = "123"
    longValue = 123
    
    Debug.Print textValue & longValue
    Debug.Print textValue + longValue
    
End Sub

 コードの記述を終えたら、F5 または F8 キーを押して実行してみてください。イミディエイトウインドウへ以下のように出力されるはずです。

123123
 246 

 さて、このような出力結果となる理由を説明します。このコードは、String 型変数 textValue にテキスト “123” を代入しています。また、Long 型変数 longValue へ 123 という整数を代入しています。

    Debug.Print textValue & longValue

この行を実行した結果、イミディエイトウインドウには 123123 が表示されました。先ほど & は二つの文字列を連結させることが出来ることを確認しましたが、このコードでは & の左側に String 型変数、右側に Long 型変数を記述しています。このように、String 型 & Long 型の計算、即ちテキストと数値を & で演算させると、結果として二つをテキストとして連結します。つまり、本来数値であるはずの longValue がテキストとして評価され、textValue と連結されたのです。このように自動的に数値をテキストとして評価することを暗黙の型変換かたへんかんと呼びます。暗黙の型変換が行われた原因は & にあります。& は二つのテキストを連結する演算子(オペレーター)であるため、& の両サイドにある値をテキストであると判断するのです。その結果、longValue は 123 という数値から “123” というテキストへ変換され、& の演算によって textValue と連結されました。

    Debug.Print textValue + longValue

続いてこの行の実行結果を見てください。イミディエイトウインドウには 246 が表示されています。一つ前の行との違いは & が + になっているだけですが、その実行結果は大きく異なりますね。このコードもまた、暗黙の型変換が行われています。+ オペレーターが、その両サイドにあるテキストを連結する機能を持つことは既に述べました。しかしながら、+ オペレーターは本来数値を加算するための演算子です。つまり、+ オペレーターのオペランドのうち、一つでも数値があるならば + オペレーターは数値の加算という本来の機能を実行します。その際、いずれか一方のオペランドがテキストであるならばそのテキストを数値へ自動的に変換し、数値同士を加算します。つまり、123 + 123 が行われるのです。このようにテキストが自動的に数値へ変換される作用もまた、暗黙の型変換と呼ばれます。

 このように、暗黙の型変換を伴なう式には注意が必要です。期待した結果と異なる結果が得られる可能性があり、それはバグを誘発します。そのため、暗黙の型変換は使用しないことをお勧めします。暗黙の型変換はコードの記述が簡単なためそれを用いたコードは良く使われていますが、本来は「記述の容易さ」よりも「誰が見ても期待通りの結果を得ること」が優先されるべきです。よって、上記のコードであれば以下のように記述します。上記マクロを以下の記述へ修正してください。

Public Sub Chapter7_2()

    Dim textValue As String
    Dim longValue As Long
    
    textValue = "123"
    longValue = 123
    
    Debug.Print textValue & CStr(longValue)
    Debug.Print CLng(textValue) + longValue
    
End Sub

textValue & longValue を textValue & CStr(longValue) へ修正することによって明示的に数値からテキストへの型変換を行います。同様に、textValue + longValue を CLng(textValue) + longValue へ修正することでテキストから数値への変換も明示的に行うように修正します。明示的な型変換は誰が見ても同じ結果を期待します。このような修正によって、当初のコードからバグを誘発する要素が消えました。

CLng() は、() 内に指定した値(例えばテキスト)を Long 型の数値へ変換することが出来る

まとめ

データ型サイズ初期値扱えるデータの範囲
String10 バイト
+ 文字列の長さ
vbNullStringテキストを扱います。文字数は使用可能なメモリーに依存し
64 bit の場合 0 文字からおよそ 21 億文字です。

 String 型の内容をまとめました。初期値が空文字であることを覚えておけば特に問題はありません。注意が必要となるのは、本来算術に使用する + オペレーターでの演算です。テキストとして扱う限り、+ オペレーターの演算は不要のはずですから & を用いて連結するようにしましょう。一方、データ型として String 型を用いていてもテキストではなく数値として扱うことで、 + や – / * といった算術演算子を用いた計算を行いたいケースがあります。その際は暗黙の型変換を用いるのではなく、明示的な型変換を用いるようにしてください。

タイトルとURLをコピーしました