1. 概要
Mid
関数は、VBAにおいて文字列の一部を抜き出す(抽出する)ための関数です。
指定した位置から指定した文字数分だけ文字列を取り出すことができます。
文字列操作の中でも特に基本かつ重要な関数の一つであり、文字列の解析や加工に広く使われます。
2. 基本構文
Mid(string, start[, length])
引数名 | 説明 | 必須/省略 |
---|---|---|
string | 対象となる文字列(文字列型の式) | 必須 |
start | 抜き出し開始位置(文字単位、1から始まる整数) | 必須 |
length | 抜き出す文字数(整数、省略時は開始位置から最後まで) | 省略可 |
3. 引数の詳細
- string
抜き出し対象となる元の文字列を指定します。
文字列型の変数、定数、関数の戻り値などを指定可能です。 - start
抜き出しの開始位置を1文字目を「1」と数え、整数で指定します。start
が1なら先頭から、2なら2文字目から抜き出します。
1より小さい値を指定するとエラーになります。 - length
抜き出す文字数を整数で指定します。
省略するとstart
以降の文字列末尾まで全て抜き出します。length
が0や負の値の場合は空文字列が返されます。
指定文字数が元の文字列の残りの長さより大きくてもエラーにはならず、取り得る最大文字数分だけ返します。
4. 戻り値
- 抜き出した部分文字列(
String
型)を返します。 - 抽出範囲が0文字の場合は空文字列
""
が返ります。
5. 使用例
5-1. 基本的な部分文字列抽出
Dim s As String
s = "VBA Programming"
MsgBox Mid(s, 5, 3) ' 出力: " Pro" の5文字目から3文字 => " Pro"
MsgBox Mid(s, 1, 3) ' 出力: "VBA"
MsgBox Mid(s, 12) ' 12文字目から最後まで => "ing"
※先頭のスペースも1文字としてカウントされるため、例のように5文字目は半角スペースです。
5-2. length省略時は開始位置から最後まで抽出
Dim s As String
s = "Hello World"
MsgBox Mid(s, 7) ' 出力: "World"
5-3. lengthが大きすぎる場合
MsgBox Mid("Test", 2, 10) ' 出力: "est"
length=10
は文字列長を超えるが、エラーにはならず、取り得る限りの文字列を返す。
6. Mid関数の利用場面
- ファイルパスやファイル名から拡張子だけ抽出する
- データベースの文字列から特定の項目を切り出す
- フォーマットが決まった文字列から部分的にデータを取り出す
- ユーザー入力の一部を検査・操作する
7. Mid関数と他の文字列関数の比較
関数名 | 機能 | 備考 |
---|---|---|
Mid | 指定位置から指定文字数の部分文字列を取得 | 開始位置は1から |
Left | 先頭から指定文字数の部分文字列を取得 | |
Right | 末尾から指定文字数の部分文字列を取得 | |
Instr | 指定文字列が最初に現れる位置を取得 | 位置取得用(部分抽出はMidで) |
8. Mid関数のエラー例
start
が1未満の場合や、非整数の場合はRun-time error '5': Invalid procedure call or argument
が発生します。
MsgBox Mid("Test", 0, 2) ' エラー
- 文字列が空文字列の場合は空文字列が返ります。
MsgBox Mid("", 1, 1) ' 空文字列が返る
9. Mid関数の代入による文字列書き換え(プロシージャ内でのみ有効)
Mid
は関数としてだけでなく、文字列の特定位置を書き換える文法としても使用可能です。
Dim s As String
s = "Hello World"
Mid(s, 7, 5) = "Excel"
MsgBox s ' 出力: "Hello Excel"
この構文は文字列s
の7文字目から5文字分を”Excel”で置き換えています。
この機能はプロシージャ内の変数や文字列にのみ使え、定数や式には使えません。
10. マルチバイト文字対応
- VBAの文字列はUnicodeで扱われているため、日本語などのマルチバイト文字も問題なく扱えます。
- ただし、1文字=1文字として数えるため、絵文字やサロゲートペアなど特殊な文字の場合は注意が必要です。
11. 応用例:ファイルの拡張子抽出
Function GetExtension(filename As String) As String
Dim pos As Integer
pos = InStrRev(filename, ".") ' 右から"."を検索
If pos > 0 Then
GetExtension = Mid(filename, pos + 1)
Else
GetExtension = "" ' 拡張子なし
End If
End Function
使用例:
MsgBox GetExtension("test.xlsx") ' "xlsx"
MsgBox GetExtension("archive") ' ""
12. 応用例:電話番号の市外局番取得
Dim tel As String
tel = "03-1234-5678"
Dim areaCode As String
areaCode = Mid(tel, 1, InStr(tel, "-") - 1)
MsgBox "市外局番は " & areaCode
13. まとめ
ポイント | 説明 |
---|---|
機能 | 文字列の一部分を抽出 |
開始位置は1から | 1から数え、1は先頭の文字 |
length省略可能 | 省略時は開始位置から文字列末尾まで抽出 |
大きなlength指定OK | 実際に存在する文字数まで抽出し、エラーにはならない |
エラー | start が1未満や非整数は実行時エラー |
文字列の書き換え可能 | Mid(string, start, length) = "新しい文字列" の形で書換可能 |
Unicode対応 | 日本語などマルチバイト文字も扱えるが特殊文字は要注意 |
14. おわりに
Mid
関数は文字列処理の基本中の基本であり、多くのVBAプログラムで不可欠な役割を果たします。
部分文字列の抽出はデータ解析や文字列フォーマットの調整、ユーザー入力の検証など幅広く応用可能です。
さらにMid
の代入文としての使い方を覚えれば、文字列の直接書き換えも簡単に行え、効率的なプログラムが書けます。
何か具体的な活用例や応用方法、または関連する文字列関数との組み合わせ方法など知りたいことがあれば、ぜひ教えてください。