★特定の文字数を数える...の巻
問)下のようにセルに英文が入力されている。単語数を求めなさい。



(●`ε´●):英単語はスペースで区切られているから、スペースの数を数えてそれに+1してやれば英単語の数になる。簡単だな。

【´・ω・`】:その考えでいいと思うけど具体的にどうやってスペースの数を数えるんだ?

(●`ε´●):決まっているだろ。COUNT系の関数を使うんだよ!

【´・ω・`】:甘いな!COUNT系の関数はセルの個数を数えるんだよ。セル内に入力されている特定の文字を数えるのには不向きだよ。

(●`ε´●):簡単そうに見えて結構難しいな。

【´・ω・`】:スペースの数をまじめに数えるなら2つ方法がある。ひとつは循環参照を利用する方法....。

(●`ε´●):循環参照か。おまえの大好きなやつだな。たしかPOKER SLOTでも使っていたな。で、もうひとつは?

【´・ω・`】:補助セルを使う。例えば上の例で言えばFind関数、Mid関数、Len関数を使ってセルB2の文字列の左端からスペースまでの文字数を数え、その部分をセルBの文字列から切り捨てていく。

(●`ε´●):?

【´・ω・`】:順序立てて言うと

 1.Find関数を使い文字列(B2)の左端からスペースまでの文字数を数える。具体的には8になる。式は=FIND(" ",B2)だな。

 2.Len関数で文字列(B2)の長さを数える。具体的には34になる。式は=LEN(B2)だな。

 3.Mid関数で文字列(B2)から、スペースまでの文字を切り捨てる。具体的には下の式になる。
 
=MID(B2,8+1,34-8)

【´・ω・`】:1,2の式を3の式に代入して、ひとつにまとめれば下の式になる。

=MID(B2,FIND(" ",B2)+1,LEN(B2)-FIND(" ",B2))

(●`ε´●):具体的には「Nothing is as important as health.」が「is as important as health.」になるというわけだな。

【´・ω・`】:そう。

(●`ε´●)::で?

【´・ω・`】:それを何回か繰り返していくと、文字列はだんだん短くなっていき、調べるべきスペースが無くなる。するとエラー「#VALUE!」になるから、何回目の操作で「#VALUE!」になったかを調べればスペースの数がわかる。そのスペースの数に1を加えれば単語の数が求められる。

 ★サンプルファイルはこちら

(●`ε´●):かったるいやり方だな。じゃ、もうひとつのやり方、循環参照を使うほうは?

【´・ω・`】:循環参照を使う方はそのうちに取り上げるよ。ここでは発想を変えて違うやり方を考えてみよう。べべちゃん、「Nothing is as important as health.」の文字数はいくつだ?

(●`ε´●):え〜と。ピリオドまで入れて29文字だ。

【´・ω・`】:本当か?

(●`ε´●):ああ、よ〜く数えたんだから間違いない!

【´・ω・`】:じゃあ、文字数を数えるLEN関数で確かめてみてくれ。

(●`ε´●)………あれ、???

【´・ω・`】:どうしたんだ?

(●`ε´●):29にならない。34になってしまう。どうしてだ?!

【´・ω・`】:べべちゃんが文字数を数えたときは無意識のうちにスペースを除いて数えていた。だから文字数が29になった。しかし…。

(●`ε´●):しかし、LEN関数はスペースも文字として扱い、それを勘定に入れて数えていたから34になった。

【´・ω・`】:その通り!だから34から29を引いた5がスペースの数だ。

(●`ε´●)::そしてその5に1を足した6が単語の数だ!!

【´・ω・`】:ビンゴ!!それでは以下にスマートなやりかたの手順をしめそう。A1に元になる英文が入力されているとして…

1.B1に=LEN(A1)
  元になる英文の文字数を求める。先の例では34。

2.C1に=SUBSTITUTE(A1, " ","")
  半角スペースを消去。
 ※SUBSTITUTE関数の書式は以下の通り。この関数には置換機能がある。

=SUBSTITUTE(A1, "検索する文字列 ","置換したい文字列")
3.D1に=LEN(C1)
  スペース消去後の文字数を求める。先の例では29。

4.E1に=B1-D1
  元になる英文に含まれるスペースの数を求める。
  「元になる英文の文字数」−「スペース消去後の文字数」先の例では5。

5.F1にE1+1
  「元になる英文に含まれるスペースの数」+1。これが単語の数。先の例では6。

サンプルファイルはこちら。


★エラー対策

【´・ω・`】:さて、ここまでで基本的なことが終わった。

(●`ε´●):これから何をやるんだ?

【´・ω・`】:仕上げとしてエラー対策だ。

(●`ε´●):エラー対策?

【´・ω・`】:そう。例えば今作った式は
単語数= 「元になる英文に含まれるスペースの数」+1

という考えに基づいている。これには大きな落とし穴があるんだ。

(●`ε´●):落とし穴?

【´・ω・`】:うん。確かに大概の場合はこの式が成立する。しかし、英文の入力してある蘭を空欄にしてみて欲しい。

(●`ε´●):あっ!単語の数は当然、0にならなければいけないのに、1と表示されている!

【´・ω・`】:そう。これは明らかにおかしい。空欄の時は別扱いにしなければならない。

単語数= IF(空欄, 0, 「元になる英文に含まれるスペースの数」+1)
とするか
単語数=  「元になる英文に含まれるスペースの数」+IF(空欄, 0, 1)
とするのが基本かな。


サイトTOPへ  戻る