Chapter 8 テキストの操作

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

テーマ

 第8回目となる本稿のテーマは、「テキストを操作する」です。

 前回学習したテキスト(文字列)型の変数や定数としての文字列を用いて、テキスト(文字列)の基本的な操作を学習します。テキスト(文字列)の操作に慣れることで、数値の計算だけでなく文字の抽出や検索などアプリケーションの作成に必要な基本的要素を身に付けることが出来ます。

テキストの基本操作

繋げる

 既にテキスト(文字列)を繋げる操作は、& オペレーターによって行うことを学習しています。今回はその復習も兼ねてマクロを作成してみましょう。以下のコードを Sheet1 シートモジュールへ記述してください。

Public Sub Chapter8()

    Dim familyName As String
    Dim givenName As String
    familyName = "鈴木"
    givenName = "太郎"
    
    Debug.Print familyName & givenName
    Debug.Print "姓:" & familyName
    Debug.Print "名:" & givenName
    
End Sub

 記述を終えたら F5 キーを押して実行します。イミディエイトウインドウには、以下のように出力されます。

鈴木太郎
姓:鈴木
名:太郎

 正しく表示されましたか?「 & 」オペレーターによってテキスト(文字列)型変数同士を繋げたり、定数としてのテキスト(文字列)とテキスト(文字列)型変数を繋げる、あるいはテキスト(文字列)定数同士を繋げるといった操作を行うことが出来ます。この部分を忘れてしまった方は前回の講義へ戻って復習してみてください。

文字数を数える

 プログラムの中で、テキスト(文字列)の文字数を数えることがしばしばあります。ユーザーが入力するテキスト(文字列)へ文字数制限をつけるときや、特定の語句がテキスト(文字列)の何文字目に現れるのかを知りたいときなどです。以下のコードを先ほどのマクロの最後の部分へ追記します。

    Debug.Print
    Dim length As Long
    length = Strings.Len(familyName)
    Debug.Print "姓の文字数は" & CStr(length)

 F5 キーを押して実行します。イミディエイトウインドウに以下のように出力されます。

鈴木太郎
姓:鈴木
名:太郎

姓の文字数は2

 コードを説明しましょう。

Strings.Len(familyName)

このコードは今回初めて使います。Strings はテキスト(文字列)を操作する機能を集めたクラスです。クラスという言葉が初めて登場しましたが、現時点では道具箱と考えておいてください。Strings クラスはテキスト(文字列)を操作する機能を集めた道具箱ということです。そして、Len() は Strings クラスのメソッドで、いわば道具です。この道具を使って () 内のテキスト(文字列)の文字数を取得することが出来ます。

 Excel の関数を思い出してみてください。=関数名(引数)という形でセルに入力しておくと関数がその結果を返してくれますね。VBA のメソッドもそれと似たような使い方をします。Strings.Len(familyName) とすれば、変数 familyName を引数として渡し、familyName が保持しているテキスト(文字列)の文字数を返してきます。familyName には 鈴木 というテキスト(文字列)が保持されていますので、Strings.Len(familyName) は整数の 2 を返します。その整数 2 を Long 型変数 length へ代入しています。続く 14行目では Cstr(length) によって整数 2 をテキスト “2” へ変換し、”姓の文字数は” & “2” によって最終的に “姓の文字数は2” というテキストを作成しています。このテキスト(文字列)を Debug.Print によってイミディエイトウインドウに表示しているということです。

 次は、テキスト(文字列)の中に指定した文字が何文字目にあるかを取得する方法を紹介します。以下のコードを上記マクロへ追記してください。

    Dim fullName As String
    fullName = familyName & " " & givenName
    Debug.Print fullName
    Dim position As Long
    position = Strings.InStr(1, fullName, "郎", vbTextCompare)
    Debug.Print position

 まず String 型変数 fullName に familyName & ” ” & givenName を代入します。& オペレーターを使って氏名のテキスト(文字列)を作成するということですね。折角ですのでこの式の右辺が評価され、左辺へ代入される流れを詳しく見ておきましょう。

fullName = familyName & " " & givenName ←この式は
fullName = "鈴木" & " " & givenName ←このように familyName から値を取得し
fullName = "鈴木" & " " & "太郎" ← givenName から値を取得し
fullName = "鈴木 " & "太郎"←最初の & の演算が行われ
fullName = "鈴木 太郎" ← 二つ目の & の演算が行われて
右辺の値が "鈴木 太郎" と評価されたのち
左辺の fullName への代入されます。

 慣れないうちは、このように演算の過程を一つ一つ丁寧に見ていくと、より理解しやすくなると思います。

 次は以下の部分ですね。

    Dim position As Long
    position = Strings.InStr(1, fullName, "郎", vbTextCompare)
    Debug.Print position

Strings.InStr(1, fullName, “郎”, vbTextCompare)

 このメソッドも今回初めて使いますので説明が必要ですね。InStr メソッドは、テキスト(文字列)を操作対象とするメソッドの一つです。操作対象がテキストなのでテキスト用の道具箱である Strings クラスに実装されています。このメソッドは、あるテキストの中に、探したいテキストが最初に現れる位置を調べるときに用い、その位置(何文字目)を取得出来ます。このメソッドのシグネチャを以下に示します。

InStr(start As Long, string1 As String, string2 As String, Optional compare As vbCompareMethod) As Variant(Long)

第一引数である start には、探し始める位置(何文字目から探すか)を指定し、第二引数へ検索対象となるテキストを指定、第三引数へ探したいテキストを指定します。そしてオプションとして第四引数に比較方法を指定することが出来ます。

 今回のコードの例で説明すると、「 fullName の 1 文字目から探し始めて、”郎” が最初に出現する位置をテキストとして比較して取得する。」という意味になります。つまり、「 “郎” という文字は “鈴木 太郎” の 1 文字目から数えて何文字目に最初に出現しますか?」という質問をするのと同じです。回答となる数値を返してくれます。実行してみましょう。

鈴木太郎
姓:鈴木
名:太郎

姓の文字数は2
鈴木 太郎
 5 

 このような結果が表示されます。”郎” の字は “鈴木 太郎” というテキスト(文字列)の 5 文字目にありますね。InStr メソッドが返してきた数値も 5 でした。正しいですね。

取り出す

 次はテキスト(文字列)の取り出しです。以下の新しいマクロを Sheet1 シートモジュールへ追記してください。

Public Sub Chapter8_1()

    Dim dateString As String
    dateString = "2022/3/23"
    
    Debug.Print "年:" & Strings.Left$(dateString, 4)
    Debug.Print "月:" & Strings.Mid$(dateString, 6, 1)
    Debug.Print "日:" & Strings.Right$(dateString, 2)
    
End Sub

 記述を終えたら F5 キーで実行してみましょう。以下のように表示されているはずです。

年:2022
月:3
日:23

 簡単に概要を説明します。String 型変数 dateString に “2022/3/23” という文字列を代入し、その変数から、年と月と日をあらわすそれぞれの文字を取り出して表示しています。

 このようにテキスト定数またはテキスト型変数から特定のテキスト(文字列)を取り出すときには Strings クラスに用意されているメソッドを利用できます。上から順に見ていきましょう。

Debug.Print “年:” & Strings.Left$(dateString, 4)

Strings.Left$ メソッドは、指定したテキストの左から数えて指定文字数分の文字を取り出すことが出来るメソッドです。シグネチャを確認しましょう。

Left$(ByVal text As String, ByVal length As long) As String

 第一引数に元のテキスト(文字列)を渡し、第二引数に文字数を渡します。すると渡したテキスト(文字列)の左から数えて、渡した文字数分のテキスト(文字列)を返してくれます。上のコード例で言えば、dateString は “2022/3/23” ですから、Strings.Left$(dateString, 4) は “2022” を返します。そして “年:” & でテキストを連結し、”年:2022″ というテキスト(文字列)を作成しています。そして最後に Debug.Print でこのテキスト(文字列) “年:2022” を表示させています。

Mid$(ByVal text As String, ByVal start As Long, Optional ByVal length As Long) As String

 これは Mid$ メソッドのシグネチャです。この Mid$ メソッドも Left$ メソッドと似た機能を提供します。

 第一引数に元のテキスト(文字列)を渡し、第二引数に数え始める文字位置を渡し、第三引数に取り出すテキストの長さ(文字数)を指定します。すると渡したテキスト(文字列)の、指定文字位置から数え始めて、指定した文字数分のテキスト(文字列)を返してくれます。上のコード例では、Strings.Mid$(dateString, 6, 1) としているので、6 文字目から 1 文字分のテキスト、即ち “3” を返してきます。年の時と同様、”月:” & で連結して “月:3” というテキストを作成して表示しています。

Right$(Byval text As String, Byval length As Long) As String

 Right$ メソッドのシグネチャです。上記二つのメソッドと使い方はほぼ同じです。第一引数に元のテキストを渡し、第二引数に取り出すテキストの長さ(文字数)を渡します。すると、渡したテキストの右から数えて、渡した文字数分のテキストを返してくれます。上のコード例で言えば、Strings.Right$(dateString, 2) は、”23″ というテキスト(文字列)を返してくれます。”日:” & によってテキスト(文字列)を連結し、”日:23″ というテキスト(文字列)を作成して表示していることになります。

 このように、Strings クラスにはテキスト(文字列)の基本操作を行うメソッドがたくさんありますので、テキスト(文字列)を操作したくなったらこのクラスを最初に調べてください。そして、本稿で学習したメソッドを何度もご自身で使い、練習してみてください。これはテキスト(文字列)の操作に限らないことですが、VBA に標準で用意されているクラスメソッドは数多くあり、とても便利な機能を提供しています。その種類や数が多い分、それらを自由に使いこなすには練習が必要です。使い方を暗記する必要はありませんが、何度も練習することで自分のものにすることが出来、必要になった時にすぐに思い出せるようになります。

まとめ

オペレーター演算の種類オペランド使用例演算結果
&テキストの連結両側“左側と文章” & “右側の文章” “左側の文章右側の文章”

 今回学習した算術演算子 & についてまとめておきました。使用頻度の高いオペレーターですのでマスターしてください。

 そして・・・

クラスメソッド用途使用例戻り値
StringsLenテキストの文字数を調べるStrings.Len(“5文字あり”)5
StringsInStrあるテキストの何文字目に
探したい文字があるか調べる
Strings.InStr(1,”あいうえお”, “い”)2
StringsLeft$テキストの左側から
指定した長さの文字を取り出す
Strings.Left$(“あいうえお”, 2)あい
StringsMid$テキストの指定位置から
指定した長さの文字を取り出す
Strings.Mid$(“あいうえお”, 3, 2)うえ
StringsRight$テキストの右側から
指定した長さの文字を取り出す
Strings.Right$(“あいうえお”, 2)えお

 こちらは今回使用したテキスト操作用の各メソッドです。今回使用したものは全てテキスト操作用の道具箱である Strings クラスに属しているメソッドですね。Strings クラスはこの他にも便利なメソッドを持っていますので、いずれ紹介したいと思います。今のところ、上記 5 つのメソッドを使いこなせるように練習してください。

 それでは本稿はここで終わりです、お疲れさまでした。また次回お会いしましょう。

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