【ExcelVBA】Mid関数の使い方とは?実務で使うテクニックも解説

いつもの仕事を楽に
スポンサーリンク

こんにちは、VBAエンジニアのやすこれです。

みなさんは、VBAでMid関数を使ったことがありますか?

  • VBAで任意の文字列から文字数を指定して一部を取り出したい
  • Mid関数の使いどころがわからない
  • 利用の仕方を実例付きで知りたい!
という方もいるのではないでしょうか。

そこで今回は、任意の文字列から開始位置と文字数を指定して一部を取り出せるMid関数の使い方と実務での応用方法をサンプルコード付きで紹介します。

スポンサーリンク

VBAでのMid関数の使い方

Mid関数の基本的な使い方

Mid関数は、任意の文字列から開始位置と文字数を指定して一部を取り出す関数です。

  1. 基本構文
Mid(文字列, 開始位置 [, 長さ])
  • [, 長さ]は省略可能(省略した場合は開始位置から文字列の終わりまでを返す)
  • 「開始位置」が文字数より大きい場合は、「””」(空白)を返す
  1. コード例
Mid("ABCDE", 2, 3)
文字列「ABCDE」の開始位置「2」から長さ「3」の文字列「BCD」を返します。
01_VBAMid関数返り値

MidB関数について

MidB関数は任意の文字列から開始位置とバイト数で指定した分だけ文字列を取り出す関数です。引数の指定方法はMid関数と同じです。

  1. 基本構文
MidB(文字列, 開始位置 [, 長さ])
  • [, 長さ]は省略可能(省略した場合は開始位置から文字列の終わりまでを返す)
  • 「開始位置」が文字列のバイト数より大きい場合は、「””」(空白)を返す
  1. コード例
MidB("ABCDE", 3, 6)
文字列「ABCDE」の開始位置「3」(バイト)から長さ「6」バイトの文字列「BCD」を返します。
02_VBAMidB関数返り値
  • 2バイトで1文字
  • 開始位置は「1, 3, 5, …」のように、文字の始まりのバイト数を指定しないと返り値が「?」となる

Mid関数の引数について

第三引数「長さ」を省略した場合

Mid関数では、第三引数の「長さ」が省略可能となっています。「長さ」を省略した場合は、「開始位置」で指定した位置から「文字列」の最後まで取得することができます。

  1. コード例
Mid("ABCDE", 3)
「長さ」を省略しているので、次の画像のように「3」文字目から最後までの文字列「CDE」を返します。
03_VBAMid関数長さ省略返り値

第二引数「開始位置」が文字数より大きい場合

Mid関数は、「文字列」の文字数より第二引数「開始位置」が大きい場合、「””」を返します。

  1. コード例
Mid("ABCDE", 6, 1)
「開始位置」が文字列「ABCDE」の文字数「5」より大きいので、「””」を返します。
04_VBAMid関数開始位置が文字数より大きい返り値

Mid関数の注意点と解決方法

Mid関数の注意点

便利なMid関数にも注意することがあります。それはエラーが起き、処理が中断されてしまうことです。

Mid関数のエラーは「開始位置」に不正な値を指定した時に発生します。具体的には次の場合にエラーが発生します。
  • 第二引数「開始位置」が「0」以下の場合

エラーが発生した際は、画像のように「プロシージャの呼び出し、または引数が不正です。」と表示されます。

05_VBAMid関数開始位置が0以下でのエラーメッセージ

Mid関数の注意点を解決する方法

Mid関数は「開始位置」に「0」より小さい値を設定するとエラーが発生します。

エラーが発生しないようにするために、「開始位置」には「0」より大きい値を使いましょう。

  • 第二引数「開始位置」は「0」より大きい値にする

Mid関数の実務での利用方法

住所から市区町村以下を取得

'市区町村以下を取り出す元となる住所を定義
Dim trgtAddress As String
trgtAddress = "東京都〇〇区"

'都道府県は「神奈川県」「和歌山県」「鹿児島県」のみ4文字でそれ以外は3文字
Dim endNum As Long
If InStr(trgtAddress, "県") = 4 Then
    endNum = 4
Else
    endNum = 3
End If

Dim trgtCity As String
trgtCity = Mid(trgtAddress, endNum + 1)

まず都道府県は「神奈川県」「和歌山県」「鹿児島県」以外はすべて3文字です。

つまり、3つの県に該当している、4文字目が「県」(「InStr(〇〇, “県”) = 4」)の場合は左端から4文字を取得して、3つの県に該当しなければ、左端から3文字を取得すれば都道府県を取り出すことができます。

これを利用して、下記の部分で判定を行い、都道府県が対象の住所から何文字目までかを「endNum」に定義しています。
'都道府県は「神奈川県」「和歌山県」「鹿児島県」のみ4文字でそれ以外は3文字
Dim endNum As Long
If InStr(trgtAddress, "県") = 4 Then
    endNum = 4
Else
    endNum = 3
End If

あとは「Mid関数」を使って、対象の住所「trgtAddress」の内、都道府県の次の文字位置「endNum + 1」から最後まで文字列を取得すれば、住所から市区町村を取り出すことができます。
Dim trgtCity As String
trgtCity = Mid(trgtAddress, endNum + 1)
06_VBAMid関数市区町村取得イメージ
  • InStr(文字列1, 文字列2)
  • 対象「文字列1」の内、「文字列2」が始まる位置を返す
ex)InStr(“ABC”, “B”) → 2

InStr関数については、下記でも詳しく解説しているので、読んでみてください。

キーワードより右側の文字列を取得

'キーワード右側を取り出す元となる文字列を定義
Dim trgtDepartment As String
trgtDepartment = "営業部営業第一課○○係"

'キーワードを定義
Dim keyword As String
keyword = "営業部"

'キーワード位置を取得
Dim endNum As Long
endNum = InStr(trgtDepartment, keyword)

'キーワードから右側を取得
Dim trgtSection As String
trgtSection = Mid(trgtDepartment, endNum + Len(keyword))

まず、元となる文字列やキーワードを次の部分で定義します。
'キーワード右側を取り出す元となる文字列を定義
Dim trgtDepartment As String
trgtDepartment = "営業部営業第一課○○係"

'キーワードを定義
Dim keyword As String
keyword = "営業部"

つづいて、次の部分で、キーワード位置を取得します。
'キーワード位置を取得
Dim endNum As Long
endNum = InStr(trgtDepartment, keyword)
  • InStr(文字列1, 文字列2)
  • 対象「文字列1」の内、「文字列2」が始まる位置を返す
ex)InStr(“ABC”, “B”) → 2

最後に、取得したキーワード位置からキーワードの文字数分進んだ位置を開始位置として、それより右側を取得しています。この時、キーワードの文字数は「Len関数」を使って取得しています。
'キーワードから右側を取得
Dim trgtSection As String
trgtSection = Mid(trgtDepartment, endNum + Len(keyword))
07_VBAMid関数キーワード右側取得イメージ
  • Len(文字列)
  • 対象「文字列」の文字数を数値で返す
ex)Len(“ABCDE”) → 5

InStr関数については、下記でも詳しく解説しているので、読んでみてください。

名字と名前を分ける

'フルネームを定義
Dim fullName As String
fullName = "田中 太郎"

'名字と名前を分ける位置を取得
Dim borderNum As Long
borderNum = InStr(fullName, " ")

'名字を取得
Dim lastName As String
lastName = Left(fullName, borderNum - 1)

'名前を取得
Dim fastName As String
fastName = Mid(fullName, borderNum + 1)

まず「InStr関数」を使って、名字と名前の間にある「スペース」の位置を取得して、「borderNum」に定義しています。
'名字と名前を分ける位置を取得
Dim borderNum As Long
borderNum = InStr(fullName, " ")
08_VBAInstr関数任意の文字列位置取得イメージ
  • InStr(文字列1, 文字列2)
  • 対象「文字列1」の内、「文字列2」が始まる位置を返す
ex)InStr(“ABC”, “B”) → 2

次に「Left関数」と先ほど定義した「borderNum」を使って「スペース」の手前までの文字列(名字)を取得しています。
'名字を取得
Dim lastName As String
lastName = Left(fullName, borderNum - 1)
09_VBALeft関数文字列取得イメージ
  • Left(文字列, 数値)
  • 対象「文字列」を「数値」で指定した文字数だけ左から取り出す
ex)Left(“ABCDE”, 3) → “ABC”

最後に「Mid関数」と「borderNum」を使って「スペース」の後ろから最後までの文字列(名前)を取得しています。
'名前を取得
Dim fastName As String
fastName = Mid(fullName, borderNum + 1)
10_VBAMid関数名前取得イメージ
InStr関数Left関数については、下記でも詳しく解説しているので、読んでみてください。

VBAでのMid関数まとめ

今回はVBAでのMid関数の使い方と実務での使用方法を紹介いたしました。

VBAMid関数の実務での利用方法

  • 住所から市区町村以下を取得
  • キーワードより右側の文字列を取得
  • 名字と名前を分ける

第三引数「長さ」の省略や「開始位置」には1以上の値を設定しなければならないことについても覚えておきましょう。まずは実例通り使ってみると、理解が深まり応用が効くのでおすすめです。

ぜひ使ってみてください。