文字の中間の文字を抽出する
文章の中間部分を抜き出したい時の関数等を紹介します。
見本として電話番号に見立てて、A1に「090-1234-5678」とします。
Excel関数
関数で抽出する場合の書き方
=MID(対象セル,特定の文字の1つ後の数字,抜き出す文字数)
入力例
=MID(A1,FIND("-",A1)+1,4)
"特定の文字の1つ後の数字"
に今回もFINDの関数を使いました。
4文字目と決まっている場合などは良いのですが、
メールアドレスで"@"を起点に考える場合などは
"抜き出す文字数"も考慮しなければいけません。
=MID(対象セル,@の一つ後の数字,@から後ろの文字数)
@から後ろを抜き出したい場合
=MID(A1,FIND("@",A1)+1,LEN(A1)-FIND("@",A1))
ココで初めてLENが出てきました。
LENは対象の文字数を調べてくれる関数です。
関数が複雑になってきたので補足すると
"@の一つ後の数字"は
LENでA1の文字数を取得(見本では17文字)
FINDで@の文字数を取得(見本では5文字目)
それぞれの関数で取得した数値で
全体-@までを計算します。
数値化すると、17-5になるので、
"@の一つ後の数字"は12になります。
関数の厄介なところは一行で色々な事を書くとすごく分かりづらくなってしまいます。
FINDを2回使って同じ計算処理もしています。
そんな時は隣のセル等にLENやFINDで計算しておく事で同じ計算処理を省く事が出来るので、うまく組み合わせて使ってください。
ExcelVBA
VBAで抽出する場合の書き方
結果 = Mid(対象セル,特定の文字の1つ後の数字[,抜き出す文字数])
なぜかExcelVBAでは抜き出す文字数は任意となっており、
値を入れない場合は最終文字まで取得してくれます。
Sub 文字の中間から抽出()
'セルA1の左から半角スペースの一文字前までをセルB1に出力
Cells(1, 2) = Mid(Cells(1, 1), WorksheetFunction.Find("-", Cells(1, 1)) + 1, 4)
'確認用のメッセージボックス
MsgBox Cells(1, 2)
End Sub
動作としては問題ありませんが、
取得する"取得する文字数"が4文字固定とは限りません。
一つ目と二つ目の-(ハイフン)の場所を変数に記憶させて
中間数の文字数を計算するように修正します。
Sub 文字の右から抽出()
'変数名"x"、"y"、"z"をVariant方式で指定します
Dim x, y, z As Variant
'一つ目のハイフン
x = WorksheetFunction.Find("-", Cells(1, 1))
'二つ目のハイフン
y = WorksheetFunction.Find("-", Cells(1, 1), x + 1)
'一つ目と二つ目のハイフンの間の文字数を計算
z = y - x - 1
'セルA1の左から半角スペースの一文字前までをセルB1に出力
Cells(1, 2) = Mid(Cells(1, 1), x + 1, z)
'確認用のメッセージボックス
MsgBox Cells(1, 2)
End Sub
使用例としてはやはり電話番号でしょうか。
ハイフンの一つ目、二つ目を隣のセルに先に取得しておくことで
どこからどこまで文字を取得するかを楽に入力できます。
今まで紹介した関数を使って携帯電話の番号を分割して取得しています。
次回は特定文字をカウントするCOUNTIF関数を紹介したいと思います。