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 から最後までのすべてが返ります |
戻り値
戻り値 | 説明 |
---|---|
文字列 | string の start 位置から length 数の文字列が返ります ※ length 省略なら start から最後までのすべてが返ります |
※ length に string の文字数以上が指定された場合は、length が省略されたとみなされます。
戻り値は、全角半角問わずに指定した文字数の文字列が返ります。(1文字2バイト)
解説(使用例)
では、ここからは簡単なサンプルコードを作成して使用例を解説していきます。
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
実行結果のイミディエイトがこちらです。
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
実行結果のワークシート画像です。
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関数の方が使いやすいかもしれませんね。
おわりに
VBAの関数一覧はこちらです。
VBAサンプルファイルダウンロードページのご案内
このページで使用したサンプルファイルの登録はありません(^^;
ページ内のコードをコピーしてご利用ください。
ダウンロードページへのリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!
Excel VBA「Mid 関数」で対象文字列の指定開始位置から指定の文字数を取得する方法について解説しました。
引数 start の指定が「0」や「負数」の場合は、引数が不正のため実行時エラーが発生します。
状況によって変化する「開始位置」や「文字数」を特定するために「Len関数」や「Instr関数」「InStrRev関数」など他の関数やメソッドを組み合わせて使ったりします。
以上、この解説が少しでもみなさまのお役に立てたなら幸いです(^^;