【VBA入門】Mid関数で文字列の抜き出し(Left、InStr関数も解説)

Mid,Left,InStr関数で 文字列を抽出する

Mid関数って使っていますか? ある文字列の中の指定位置から指定文字数分だけ抜き出す場合に使用します。InStr関数やLeft関数などと一緒に使われることも多いです。この記事ではMid関数の使い方やMidB関数の使い方という基本的な内容から、

  • Left関数、InStr関数との組み合わせ
  • 全角文字列を扱う方法
  • 参照設定でエラーが出たときの対処法
  • Midステートメントとの違い


など応用的な内容についても、わかりやすく紹介していきます!

目次

Mid関数の使い方

Mid関数は文字列内の指定した位置から文字数分の文字を含む文字列を返します。Mid関数は下記のように記述します。

Mid(string, start[, length])

引数の中で「[ ]」で囲まれた部分は省略することができます。引数の指定について表にまとめました。

引数説明
string対象となる元の文字列
start文字列を抜き出す先頭位置を指定
length抜き出す文字列の長さを指定

引数stringにNullが含まれている場合は、Nullを返します。startがstringの文字数より大きい場合は、長さ0(ゼロ)の空文字(“”)を返します。lengthを省略した場合はstartから文字列の最後までのすべての文字列が返されます。サンプルコードで確認しましょう。

Sub macro1()
    Dim str As String, str1 As String, str2 As String
    str = "Hello VBA"
    str1 = "Hello "
    
    str2 = Mid(str, Len(str1) + 1)
    
    MsgBox str2
End Sub

実行結果:
mid01

このサンプルコードでは、Mid関数を使って文字列strから文字列str1より後ろの文字列を抜き出しています。Mid関数の開始位置は、Len関数を使ってstr1の文字数を取得し、その値を使用しています。

Mid関数の引数lengthは省略しているので、文字列strの最後の文字まで抜き出されています。

MidB関数の使い方

MidB関数は文字列内の指定位置から指定したバイト数分の文字列を返します。MidB関数は下記のように記述します。

Mid(string, start[, length])

MidB関数はMid関数と比べて、指定したバイト数分の文字列を返すという部分が違うだけで、引数の指定方法はMid関数と変わりません。ですので、引数の指定についてはMid関数を参照してください。

サンプルコードで確認しましょう。

Sub macro2()
    Dim str As String, str1 As String, str2 As String
    str = "Hello VBA!"
    str1 = "Hello "
    str2 = "VBA"
    
    MsgBox MidB(str, LenB(str1) + 1, LenB(str2))
End Sub

実行結果:
mid01

このサンプルコードでは、Midb関数を使って文字列strから文字列str1より後ろの文字列をstr1のバイト数分だけ抜き出しています。MidB関数の開始位置は、LenB関数を使ってstr1のバイト数を取得し、その値を使用しています。MidB関数の引数lengthはLenB関数を使ってstr1のバイト数分の値を指定しています。

Left関数、InStr関数との組み合わせ

Mid関数はLeft関数InStr関数と組み合わせて使われることがよくあります。

InStr関数を使って指定文字列の位置を取得し、その指定文字列より前の部分を抜き出すためにLeft関数を使い、後ろの部分を抜き出すためにMid関数を使うといった使い方です。Left関数は文字列の先頭から指定文字数分だけ文字列を抜き出します。

サンプルコードで確認しましょう。

Sub macro3()
    Dim str As String, del As String
    str = "Hello VBA"
    del = " " ' 半角スペース
    
    MsgBox Left(str, InStr(str, del) - 1) & ", " & Mid(str, InStr(str, del) + 1)
End Sub

実行結果:
mid02

このサンプルコードでは、InStr関数を使って文字列strの中の半角スペースの位置を取得していますInStr関数で取得した位置より1文字前までLeft関数を使って抜き出しています。

またMid関数の開始位置の指定をInStr関数で取得した位置より1文字後で指定して抜き出しています。Left関数やInStr関数の使い方については、こちらで詳しく解説しています。ぜひ参考にしてください。

全角文字列を扱う方法

お伝えしてきたようにMid関数は引数で文字数を扱います。これまでのサンプルコードでは対象とする文字列は半角の英数字でした。

では日本語の全角文字列を扱う場合は文字数はどのように数えられるのでしょうか?結論を言うと、英数字のような半角文字でも日本語のような全角文字でも数え方は変わりません

また、半角文字でも全角文字でも1文字はどちらも2バイトで数えられます。これはVBAでは文字コードはUTF-16が使われているからです。UTF-16では半角文字でも全角文字でも1文字のバイト数は2バイトです。

たとえば文字コードがUTF-8の場合は、英数字は1バイトで日本語の全角文字は3バイトなど、文字コードによっては英数字と全角文字のバイト数が異なる場合があります。また、C言語などは標準ではバイト数を数えるstrlen関数しかないので、文字数を数えるとなると半角英数字と全角文字の場合で数え方を変えるなど工夫をする必要があります。

これが原因で英数字と全角文字とで文字数の数え方が変わって、意図しない結果となることがC言語ではよくあります。

でもVBAの場合は文字コードにUTF-16が使われているので、英数字も全角文字も同じ2バイトで混同することはなさそうです。また文字数を数えるLen関数とバイト数を数えるLenB関数がそれぞれありますので、半角文字、全角文字の違いはあまり気にしなくてもよさそうです。

それではサンプルコードで確認していきましょう。

Sub macro4()
    Dim str As String, str1 As String, str2 As String
    str = "東京都千代田区"
    str1 = "東京都"
    
    str2 = Mid(str, Len(str1) + 1)
    
    MsgBox str1 & ":" & Len(str1) & "文字" & vbCrLf & str2
End Sub

実行結果:
mid03

このサンプルコードでは、Mid関数を使って文字列strから文字列str1より後ろの文字列を抜き出しています。Mid関数の開始位置は、Len関数を使ってstr1の文字数を取得し、その値を使用しています。

Len関数を使って取得したstr1の文字数を表示していますが、日本語の全角文字でも3文字と正しく取得できていることがわかります。

全角半角混在文字列を扱う方法

先ほど述べましたとおり、C言語などとは違いVBAでは全角半角混在文字列でも文字数の数え方を工夫する必要はありません。半角英数字でも全角文字でもLen関数で正しい文字数を取得することができます。

サンプルコードで確認しましょう。

Sub macro5()
    Dim str As String, del As String
    str = "100-0005 東京都千代田区"
    del = " " ' 半角スペース
    
    MsgBox Left(str, InStr(str, del) - 1) & ", " & Mid(str, InStr(str, del) + 1)
End Sub

実行結果:
mid04

このサンプルコードでは、InStr関数を使って文字列strの中の半角スペースの位置を取得しています。InStr関数で取得した位置より1文字前までLeft関数を使って抜き出しています。またMid関数の開始位置の指定をInStr関数で取得した位置より1文字後で指定して抜き出しています。

文字列Strは郵便番号部分が半角文字で住所部分は全角文字の全角半角混在文字列ですが、InStr関数で半角スペースの位置も正確に取得し、Left関数とMid関数で半角スペースの前後で文字列を正しく抜き出せています。

参照設定でエラーが出たときの対処法

VBAのMid関数やLeft関数などでコンパイルエラーが発生することがあるようです。

関数の前に「Strings.」をつけると解決するようです。

Strings.Mid(string, start[, length])

参照設定の不具合のようですので、こちらも参考にしてみてください。
https://msdn.microsoft.com/ja-jp/library/office/gg251321.aspx

Midステートメントとの違い

ここまではMid関数の使い方についてお伝えしてきました。VBAでは、Midステートメントというものもあります。Midステートメントは別の文字列の文字に置き換える場合に使用します。また、大量の文字列を結合する場合に使うこともあります。

Midステートメントを使って、あらかじめString型変数の領域を確保しておくことで、高速に処理することができます。詳しくはこちらで詳しく解説していますので、ぜひ参考にしてください。

まとめ

ここでは、Mid関数、MidB関数の使い方について説明しました。Mid関数はLeft関数、InStr関数と組み合わせて使うと、文字列の分割操作などもできるようになります。

使いこなすことができるように、この記事を何度も参考にして下さいね!

この記事を書いた人

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
info@sss-lab.com

目次