先日ご質問をいただいたので、過去の記事を見てみたら・・・なかった! という
MID 関数を使うお話について。

B 列に入っているタイトルから、カッコ内の文字だけ取り出したい、とのこと。
これを今回は MID 関数と FIND 関数を使ってやってみます。

やりたいのは、「カッコの中を取り出したい」 = 「"(" の次の文字から、")" の手前までを取り出したい」です。

「=MID(B2,FIND("(",B2)+1,FIND(")",B2)-FIND("(",B2)-1)」 です。
って書いても、これをコピーしただけじゃ本質はわからないと思うし、それは私の本意ではないので、今回は、いくつかのステップに分けて仕上げていきます。


01.png
 

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)」です。


02.png

 

ただし、この数式をほかのセルにコピーすると・・・こうなります↓
なぜこうなるかはわかりますよね?

03.png
 

たとえば、セル B11 の「表(Word)」の場合、そもそも全部で 10 文字もないのです。
これでは取り出せるわけがない。
ということで、つぎの作業でちょっと工夫してみます。

04.png
 

作業 2 開始位置と文字数をほかのセルに入れておく

タイトル (大元のデータ) によって、開始位置と文字数が違うのなら、それをほかのセルにて入力しておき、それを MID 関数で使うのも 1 つの方法です。

たとえば、こんな風に↓ C 列には開始位置を、D 列には取り出したい文字数をこつこつ手入力しました。
05.png

先ほど作った MID 関数の数式を、手入力した「開始位置」と「文字数」を参照するように修正します。
06.png
 

できた!
数式をコピーしても、E 列の数式がそれぞれの行の「開始位置」と「文字数」を参照しているので、問題なくアプリケーション名を取り出すことができます。

07.png
 

MID 関数としてはここまでで目的は達成しています。
しかーし、「開始位置」や「文字数」を手入力するのは現実的ではないですね。
ということで、次の作業では「開始位置」と「文字数」も数式で算出できるようにしてみます。

 

FIND関数とは

大元データの中になんらかの共通点を見つけて (もしくは事前に準備して)、数式で「開始位置」や「文字数」を求められるようにすると、効率よく正しい結果を得られます。

たとえば、今回はすべてのタイトルに "(" と ")" がある、という共通点があります。これを活かして、文字数を求めるための数式を作成するためには、"(" や ")" が左から何番目にあるかを調べる必要があります。

特定の文字列がセルのどこにあるのかを調べるには FIND 関数を利用できます。
FIND 関数は、指定された文字列を他の文字列の中で検索し、その文字列が最初に現れる位置が左端から数えて、何番目にあるのかの位置を返します。

FIND 関数の数式は、

=FIND(検索文字列,対象,[開始位置])

です。

「検索文字列」には、位置を知りたい (検索したい) 文字列を指定します。たとえば、「(」の位置を知りたいのなら、"(" のように半角ダブル クォーテーションで括って指定します。

「対象」には、検索文字列を含むセルを指定します。
「[開始位置]」には、検索を開始する位置を指定します。たとえば、左端から探すのではなく、10 文字目以降から探しなさい、といった指定ができます。この引数は省略でき、省略した場合は開始位置として 1 を指定したときと同じ結果が返ります。

 

作業 3 開始位置や文字数を数式で求める

"(" の位置を求めるために、「=FIND(検索文字列,対象,[開始位置])」に当てはめてみます。
検索文字列」は 「(」 なので "("
対象」はセル B2
[開始位置]」は指定しないので省略
ということで、セル C2 に作成する数式は、「=FIND("(",B2)」です。

08.png

しかし、この段階では「( がどこにあるか」の位置を求めただけなので、「(」の次の文字を開始位置にするためには+1 しなければなりません。

+1 するように、数式を修正します。
09.png

作成した数式をコピーすると、それぞれのタイトルの開始位置が算出されます。
これ、手入力したときの値と同じですね。でも手入力と違って、効率がいいだけでなく、タイトルが変更になっても連動するといったメリットもあります。
10.png
 

同じように、
")" の位置を求めるために、「=FIND(検索文字列,対象,[開始位置])」に当てはめてみます。
検索文字列」は 「)」 なので ")"
対象」はセル B2
「[開始位置]」は指定しないので省略
ということで、セル C2 に作成する数式は、「=FIND(")",B2)」です。

「)」 の位置が算出されましたが、MID 関数の数式で考えると、「文字数」としてこの値 (15) が指定されているので「)」まで取れてしまいます。

11.png
 

「)」の位置 (15) から、「開始位置」(10) を引いたら、文字数 (5) が出ると思いませんか?
ということで、「開始位置」の値を引くように、数式を修正します。

12.png


作成した数式をコピーして完成!
13.png
 

おまけ

「開始位置」や「文字数」の列が邪魔なら、非表示にしておけばよいです。
14.png

今回はカッコの中の文字を取りましたが、たとえば LEFT 関数を使えば、メインタイトルの部分を取り出せます。
このとき、先ほど作った C 列の「開始位置」の値が、文字数を算出するために使えますね。
15.png
 

「開始位置」や「文字数」のような作業列は作りたくない!というのなら、全部がっちゃんこすれば 1 つの数式にできます。
この数式の意味をきちんと理解できるようになっていれば、今回やったことが理解できている、ということです。
ポイントは MID 関数の引数を区切るカンマがどこにあって、それぞれの引数内で処理されている値がいくつなのか、です。

ポイントがあるとするならば、第 3 引数の赤い下線の部分の計算の優先順位でしょうか。
前から順番に計算していくので、15 から 9 を引いて 6。そこから 1 引いて 5」という順序で計算されています。
「15-9-1=5」です。

16.png
 

計算の順序がわかりにくいのなら、こんな風に↓カッコでくくってもいいのではないでしょうか。
「15-(9+1)=5」です。

17.png
 

どの数式を使っても同じですが、大元のデータや作業列を削除したいとか、大元のデータと連動したくないなんていう場合は、数式によって算出した結果をコピーして、値だけ貼り付けておきましょう。

これは文字列の操作をする数式において必要な追加の作業ですね。

018.png

 


MID 関数とはなにか?ではなく、こんなことがしたい!という目的を達成するために MID 関数を使ってみました。

共通点はカッコじゃなくてスペースなんだけど。とか、ハイフン(-) で区切られてるなーなんていうケースは、検索文字列のところを置き換えて考えてみてください。

石田かのこ