本ページには広告が含まれています。

Excel VBA Mid関数 指定位置から文字列を抽出する

Excel VBA Mid関数 指定位置から文字列を抽出する

Excel VBAの「Mid関数」について解説します。

スポンサーリンク

Mid関数とは

Excel VBA の Mid関数とは、対象文字列の指定位置から指定数分の文字列を返します。

※ 返される文字列は、バリアント型(内部処理形式 StringのVariant)の値です。

Mid 関数(Visual Basic for Applications リファレンス)

構文(引数と戻り値)

Excel VBAの関数を使いこなすには、関数の構文を正しく理解しておくことが重要です。

構文

Mid(string, start [, length])

引数

引数 説明
string【必須】元となる文字列(式)を指定します
start【必須】取り出す先頭位置を指定します
length【省略可能】start から取り出す文字数を指定します
※ 省略すると start から最後までのすべてが返ります

戻り値

戻り値 説明
文字列stringstart 位置から length 数の文字列が返ります
length 省略なら start から最後までのすべてが返ります
string に Null が含まれていた場合は、Null が返されます。
lengthstring の文字数以上が指定された場合は、length
省略されたとみなされます。

戻り値は、全角半角問わずに指定した文字数の文字列が返ります。(1文字2バイト)

string をバイトデータとして扱う場合は MidB 関数を使用します。
start および length には文字数ではなくバイト数で指定します。

解説(使用例)

では、ここからは簡単なサンプルコードを作成して使用例を解説していきます。

Mid関数とMidB関数 サンプル

元の文字列 string に対し start および length をいろいろ指定して結果を確認します。

Sub Mid_Sample01()
  Dim str As String, MStr As String
  str = "A234567890JQK"
  
  '「3」番目から「3」文字指定した場合
  MStr = Mid(str, 3, 3)
  Debug.Print (MStr)  '345
  
  '「3」番目から文字数指定しない場合
  MStr = Mid(str, 3)
  Debug.Print (MStr)  '34567890JQ
  
  '先頭から指定することも可能
  MStr = Mid(str, 1, 12)
  Debug.Print (MStr)  'A234567890JQ
  
  '元文字数以上の「20」を指定したの場合
  MStr = Mid(str, 3, 20)
  Debug.Print (MStr)  '34567890JQ
  
  'バイト数で指定する例
  MStr = MidB(str, 21, 4)
  Debug.Print (MStr)  'JQ
  
End Sub

実行結果のイミディエイトがこちらです。

Mid関数とMidB関数 のサンプルコード実行結果

1件(6行)目、元文字列「A234567890JQK」の「3」文字目から「3」文字分を抜き出しました。

2件(10行)目、同じ開始位置で length を指定しない場合、開始位置以降のすべてが返されます

3件(14行)目、開始位置を先頭「1」に指定した事例です。先頭から「12」文字が返りました。

4件(18行)目、length に元文字数以上を指定したの場合は、length を指定しない場合と同様に、開始位置以降のすべてが返されます

5件(22行)目は MidB関数 の例です。start および lengthバイト数で指定します。(1文字は2バイト)

セルデータを Mid 関数で分割取得する事例

セルのデータを加工して、必要なデータを抜き出す作業では、Right関数とLeft関数などの文字列操作関数を使いますが、Mid関数を使う事例についても紹介します。

次のサンプルコードは、A列の「氏名」データから「姓」の部分を抜き出してB列に、「名」の部分を抜き出してC列に書き出すサンプルです。姓名間には全角または半角のスペースが複数存在している設定です。

Sub Mid_Sample02()
  Dim str As String
  Dim s As Long, i As Long

  For i = 2 To 10
    '「姓」
    str = Cells(i, 1)
    s = InStr(1, str, " ", vbTextCompare)
    Cells(i, 2) = Mid(str, 1, s - 1)
    '「名」
    s = InStrRev(str, " ", -1, vbTextCompare)
    Cells(i, 3) = Mid(str, s + 1)
  Next

End Sub

実行結果のワークシート画像です。

セルデータを Mid 関数で分割取得するコードの実行結果画像

A列の「氏名」データの特徴は次のとおりです。

・「氏(姓)」と「名」の間にスペースがあるが「全角」「半角」が複数混在

・「氏(姓)」の字数が1~3のように不特定

文字列の前半部分を抜き出す

以上のことから、「姓」の length は最初の「スペース」の位置を、InStr 関数の全角/半角を区別しないモード vbTextCompare を使って取得します。

InStr(1, str, ” “, vbTextCompare)

Mid関数length には、取得できた値のひとつ前の(位置)数(s – 1)を指定しています。

文字列の後半部分を抜き出す

「名」の length は最後の「スペース」の位置は、InStrRev 関数の全角/半角を区別しないモード vbTextCompare を使って取得しています。

InStrRev(str, ” “, -1, vbTextCompare)

Mid関数length には、取得できた値のひとつ後ろの(位置)数(s + 1)を指定しています。

実行結果は上の画像のとおり、うまくいきました(^^)

特に、後半部分の「名」を取得するコードは Right関数 を使うよりも Len関数 を使わなくてよいので Mid関数の方が使いやすいかもしれませんね。

おわりに

Excel VBA「Mid 関数」で対象文字列の指定開始位置から指定の文字数を取得する方法について解説しました。

引数 start の指定が「0」や「負数」の場合は、引数が不正のため実行時エラーが発生します。

状況によって変化する「開始位置」や「文字数」を特定するために「Len関数」や「Instr関数」「InStrRev関数」など他の関数やメソッドを組み合わせて使ったりします。

以上、この解説が少しでもみなさまのお役に立てたなら幸いです(^^;

VBAの関数一覧はこちらです。

スポンサーリンク
スポンサーリンク

VBAサンプルファイルダウンロードページのご案内

このページで使用したサンプルファイルの登録はありません(^^;
ページ内のコードをコピーしてご利用ください。

ダウンロードページへのリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!