カッコ"("や角括弧"["などの記号で囲まれた(くくられた)文字列から記号を省いた中身の文字列だけ抽出するVBAの関数(ファンクションプロシージャ)のサンプルプログラムを覚書。
例えば、(abc)という文字列からabcだけを抽出することができるようにする関数のプログラム。
abc(DEF)ghiだったらDEFが抽出できる。
サンプルプログラムは、ExcelのVBAでFunctionプロシージャとして作っているので、普通にワークシート関数として利用できるようになっているけど、AccessのVBAでも同じように作成すればクエリーの式の中でも使用できる。
記号で囲まれた文字列の中身だけを取り出すVBAのサンプルプログラム
このプログラムの考え方は以下のとおり。
例としてカッコ"("で囲まれた文字列の抽出を例として説明しています。
- 囲み開始のカッコ"("の文字位置を検索して見つかった場合はその文字位置を表す数値を変数1に代入する。
- 囲み終了のカッコ")"の文字位置を囲み開始のカッコ"("以降の文字列から検索して見つかった場合は、その文字位置を表す数値を変数2に代入する。
- "("、")"の両方が文字列中にある場合のみ(変数1、2の両方が0でない)中身の文字列を抽出する処理をさせたいのでIf文で条件判断をさせる。(Instr関数は対象文字列に指定した文字がない場合0を返す)
- 抽出する文字列は"("の後からの文字列となるので、変数1の文字位置に+1した値を変数1に代入し直す。
- Mid関数を使用して、変数1の文字位置から「変数2 - 変数1」数分文字列を抽出して、抽出した文字列を関数の返り値として返す。
- "("と")"のどちらか、あるいは両方がなかった場合は処理をせずに長さ0の文字列を返す。
VBAのサンプルプログラム
以下文字列を取り出すサンプルプログラム。
Function ExtractionStrings(rngValue)
Dim startNum As Integer, endNum As Integer
startNum = InStr(rngValue, "(")
endNum = InStr(startNum + 1, rngValue, ")")
If startNum <> 0 And endNum <> 0 Then
startNum = startNum + 1
ExtractionStrings = Mid(rngValue, startNum, endNum - startNum)
Else
ExtractionStrings = ""
End If
End Function
ワークシート関数として使う場合の使い方
例えば、セルA1に"(abc)"と入力されていて"abc"だけを抽出してセルB1に入力する場合は、セルB1に以下のように記述する。
=ExtractionStrings(A1)
囲み記号をワークシート関数の中で指定したい場合のVBAのサンプルプログラム
上記に紹介したプログラムだと囲んでいる記号がプログラムの中で指定している1種類のみに限定されている。
例えば、"(XXXXX)"とか"[xxxxx]"とか、囲んでいる記号が複数の種類になっている場合、いちいち関数のプログラムを増やしていくのは現実的ではないのでワークシート関数として使うときに囲んでいる記号を関数の引数として指定できるようにした。
変更したVBAのサンプルプログラムコード
囲み記号を任意の記号に設定できるように改版したプログラム。
Function ExtractionStrings(rngValue As String, strDemilitter1 As String, strDemilitter2 As String)
Dim startNum As Integer, endNum As Integer
startNum = InStr(rngValue, strDemilitter1)
endNum = InStr(startNum + 1, rngValue, strDemilitter2)
If startNum <> 0 And endNum <> 0 Then
startNum = startNum + 1
ExtractionStrings = Mid(rngValue, startNum, endNum - startNum)
Else
ExtractionStrings = ""
End If
End Function
ワークシート関数として使う場合の使い方
ワークシート関数として使用するときの関数の引数の指定の仕方は以下のとおり。
=ExtractionStrings(対象セル,"囲み開始記号","囲み終了記号")
例えば、"("と")"で囲まれた文字列から中身を抽出するときは、ワークシート関数として使うときには以下のように式を入力する。
=ExtractionStrings(A1,"(",")")
"["と"]"で囲まれた文字列から中身を抽出する場合は以下のようになる。
=ExtractionStrings(A1,"[","]")
"(ダブルクォーテーション)で囲まれた文字列から抽出するときの例
"(ダブルクォーテーション)で囲まれた文字列を抽出する際は、引数の指定に少し注意が必要です。
関数の引数として囲み記号を"(ダブルクォーテーション)でくくる仕様になっているので、"(ダブルクォーテーション)を"(ダブルクォーテーション)でくくる場合は以下のように指定してください。
=ExtractionStrings(A1,"""","""")
"を"でくくる場合""で"を表すルールになっています。
わかりづらいですね。
コメント