先日ご質問をいただいたので、過去の記事を見てみたら・・・なかった! という
MID 関数を使うお話について。
B 列に入っているタイトルから、カッコ内の文字だけ取り出したい、とのこと。
これを今回は MID 関数と FIND 関数を使ってやってみます。
やりたいのは、「カッコの中を取り出したい」 = 「"(" の次の文字から、")" の手前までを取り出したい」です。
「=MID(B2,FIND("(",B2)+1,FIND(")",B2)-FIND("(",B2)-1)」 です。
って書いても、これをコピーしただけじゃ本質はわからないと思うし、それは私の本意ではないので、今回は、いくつかのステップに分けて仕上げていきます。
MID 関数とは
LEFT 関数や RIGHT 関数を使うと、セルの左端や右端から指定した数分の文字列を取り出せますが、逆に言うと、「何文字目から開始するのか」を指定できません。これを指定したいときに MID 関数を使います。
MID 関数は、文字列の任意の位置から指定された文字数の文字を返します。半角と全角の区別なく 1 文字を 1 として処理が行われます。
MID 関数の数式は、
=MID(文字列,開始位置,文字数)
です。
「文字列」には、取り出す文字列が含まれるセルを指定します。大元のデータはどこか?です。
「開始位置」には、何文字目をスタートとするかを指定します。 (左端なら 1 だけど、これなら LEFT でもいいから MID を使う必要なし)
「文字数」には、取り出したい文字数を 0 (ゼロ) より大きい値で指定します。
開始位置に 1 より小さい値を指定したり、文字数に負の数を指定したりするとエラー値 (#VALUE) が返ります。
作業1 開始位置と文字数を固定値で数式を作る
セル B2 の “Excel” という文字列を取り出したいので、「=MID(文字列,開始位置,文字数)」に当てはめてみます。
「文字列」はセル B2
「開始位置」は (左から) 10 (文字目)
「文字数」は (Excel だから) 5 (文字)
ということで、セル E2 に作成する数式は、「=MID(B2,10,5)」です。
ただし、この数式をほかのセルにコピーすると・・・こうなります↓
なぜこうなるかはわかりますよね?
たとえば、セル B11 の「表(Word)」の場合、そもそも全部で 10 文字もないのです。
これでは取り出せるわけがない。
ということで、つぎの作業でちょっと工夫してみます。
作業 2 開始位置と文字数をほかのセルに入れておく
タイトル (大元のデータ) によって、開始位置と文字数が違うのなら、それをほかのセルにて入力しておき、それを MID 関数で使うのも 1 つの方法です。
たとえば、こんな風に↓ C 列には開始位置を、D 列には取り出したい文字数をこつこつ手入力しました。
先ほど作った MID 関数の数式を、手入力した「開始位置」と「文字数」を参照するように修正します。
できた!
数式をコピーしても、E 列の数式がそれぞれの行の「開始位置」と「文字数」を参照しているので、問題なくアプリケーション名を取り出すことができます。
MID 関数としてはここまでで目的は達成しています。
しかーし、「開始位置」や「文字数」を手入力するのは現実的ではないですね。
ということで、次の作業では「開始位置」と「文字数」も数式で算出できるようにしてみます。
FIND関数とは
大元データの中になんらかの共通点を見つけて (もしくは事前に準備して)、数式で「開始位置」や「文字数」を求められるようにすると、効率よく正しい結果を得られます。
たとえば、今回はすべてのタイトルに "(" と ")" がある、という共通点があります。これを活かして、文字数を求めるための数式を作成するためには、"(" や ")" が左から何番目にあるかを調べる必要があります。
特定の文字列がセルのどこにあるのかを調べるには FIND 関数を利用できます。
FIND 関数は、指定された文字列を他の文字列の中で検索し、その文字列が最初に現れる位置が左端から数えて、何番目にあるのかの位置を返します。
FIND 関数の数式は、
=FIND(検索文字列,対象,[開始位置])
です。
「検索文字列」には、位置を知りたい (検索したい) 文字列を指定します。たとえば、「(」の位置を知りたいのなら、"(" のように半角ダブル クォーテーションで括って指定します。
「対象」には、検索文字列を含むセルを指定します。
「[開始位置]」には、検索を開始する位置を指定します。たとえば、左端から探すのではなく、10 文字目以降から探しなさい、といった指定ができます。この引数は省略でき、省略した場合は開始位置として 1 を指定したときと同じ結果が返ります。
作業 3 開始位置や文字数を数式で求める
"(" の位置を求めるために、「=FIND(検索文字列,対象,[開始位置])」に当てはめてみます。
「検索文字列」は 「(」 なので "("
「対象」はセル B2
「[開始位置]」は指定しないので省略
ということで、セル C2 に作成する数式は、「=FIND("(",B2)」です。
しかし、この段階では「( がどこにあるか」の位置を求めただけなので、「(」の次の文字を開始位置にするためには+1 しなければなりません。
+1 するように、数式を修正します。
作成した数式をコピーすると、それぞれのタイトルの開始位置が算出されます。
これ、手入力したときの値と同じですね。でも手入力と違って、効率がいいだけでなく、タイトルが変更になっても連動するといったメリットもあります。
同じように、
")" の位置を求めるために、「=FIND(検索文字列,対象,[開始位置])」に当てはめてみます。
「検索文字列」は 「)」 なので ")"
「対象」はセル B2
「[開始位置]」は指定しないので省略
ということで、セル C2 に作成する数式は、「=FIND(")",B2)」です。
「)」 の位置が算出されましたが、MID 関数の数式で考えると、「文字数」としてこの値 (15) が指定されているので「)」まで取れてしまいます。
「)」の位置 (15) から、「開始位置」(10) を引いたら、文字数 (5) が出ると思いませんか?
ということで、「開始位置」の値を引くように、数式を修正します。
作成した数式をコピーして完成!
おまけ
「開始位置」や「文字数」の列が邪魔なら、非表示にしておけばよいです。
今回はカッコの中の文字を取りましたが、たとえば LEFT 関数を使えば、メインタイトルの部分を取り出せます。
このとき、先ほど作った C 列の「開始位置」の値が、文字数を算出するために使えますね。
「開始位置」や「文字数」のような作業列は作りたくない!というのなら、全部がっちゃんこすれば 1 つの数式にできます。
この数式の意味をきちんと理解できるようになっていれば、今回やったことが理解できている、ということです。
ポイントは MID 関数の引数を区切るカンマがどこにあって、それぞれの引数内で処理されている値がいくつなのか、です。
ポイントがあるとするならば、第 3 引数の赤い下線の部分の計算の優先順位でしょうか。
前から順番に計算していくので、15 から 9 を引いて 6。そこから 1 引いて 5」という順序で計算されています。
「15-9-1=5」です。
計算の順序がわかりにくいのなら、こんな風に↓カッコでくくってもいいのではないでしょうか。
「15-(9+1)=5」です。
どの数式を使っても同じですが、大元のデータや作業列を削除したいとか、大元のデータと連動したくないなんていう場合は、数式によって算出した結果をコピーして、値だけ貼り付けておきましょう。
これは文字列の操作をする数式において必要な追加の作業ですね。
MID 関数とはなにか?ではなく、こんなことがしたい!という目的を達成するために MID 関数を使ってみました。
共通点はカッコじゃなくてスペースなんだけど。とか、ハイフン(-) で区切られてるなーなんていうケースは、検索文字列のところを置き換えて考えてみてください。
石田かのこ