スプレッドシートで文字数カウントを半角で

Googleスプレッドシートで文字数カウントを半角で行う方法ですが、こんな数式でできるのではないでしょうか?(誤りに気がつかれた方は、お手数ですが問い合わせフォームからお知らせいただけると幸いです)

=FINDB(RIGHT([セル番号]&”a”),[セル番号]&”a”,LEN([セル番号&”a”]))-1

A1セルなら、
=FINDB(RIGHT(A1&”a”),A1&”a”,len(A1&”a”))-1
です。
※コピペするとダブルクォート(“)が全角に変換されるので、その部分は半角に直してお使いください

スポンサーリンク


以下、数式の意味を知りたい方のための説明です。

FINDB([引数1],[引数2],[引数3])というのは、[引数2]の文字列の中で[引数1]の文字が最初に出てくるのは何バイト目か?を返す関数です([引数3]については後から説明します)
)。

例えば、A1セルが

あaaaい

という文字列で、FINDB(A1,”い”)という式([引数3]は省略できます)は、「6」を返します。最初の「あ」が2バイト、次に「a」が3つで3バイトですから、「い」が始まるのは6バイト目ですよね。

次に、RIGHT([引数1])という関数ですが、これは、[引数1]の一番右の文字を返します。先ほどのA1セルを用いるなら、RIGHT(A1)は「い」を返すということです。

ここまでの組み合わせで、文字列の一番後ろの文字が、先頭から何バイト目にあるか?

が分かれば、半角文字数のカウントにかなり近づいたと思いませんか?

ところが、これには弱点があります。それは、文字列の最後の文字が半角の場合は良いのですが、全角のときは、欲しいカウントよりも1バイト小さい数が返ってきてしまうのです。

A1セルが「あxxxb」の場合、FINDB(RIGHT(A1),A1)は、RIGHT(A1)が「b」ですから、「6」を返します。これは期待通りの答えです。

ところが、A1セルが「あxxxい」の場合、本当は「7」が返ってきてほしいところですが、やはり「6」が返って来てしまいます。

つまり、半角カウントしたい文字列の最後の文字が半角の場合は良いですが、全角のときは答えに1を足してやらないということです。しかし、そんな分岐を行うのは大変です。

そこで考えた方法が、最後が半角だろうが全角だろうが、強制的に半角にしてしまえば良いというものです。なんでも良いのですが、文字列の最後に半角の文字を結合してしまえば良いのです。

今回は分かりやすく、「a」を結合することにしました。

すると数式は、FINDB(RIGHT(A1&”a”),A1&”a”)となります。ただし、これだと追加した「a」の分1バイト余分にカウントされるので、最後にマイナス1してやる必要があります。

つまり、数式は

FINDB(RIGHT(A1&”a”),A1&”a”)-1

です。だいぶ答えに近づいてきました。これだと、A1セルが「あxxxb」のときは「6」、「あxxxい」のときは「7」が返ってきます。

あと一歩です。

実は、これでもダメな部分があります。A1セルを「あaaab」にしてみるとどうでしょう?

返って来てほしい数は「6」ですが、実際には「2」が返ってきます。

ここでやっと、最初に説明を省略した、FINDBの[引数3]の話が出てきます。この引数は、何文字目からを対象に検索するかを表します。省略した場合は「1」となり、文字列の一番左から検索します。

つまり、A1セルが「あaaab」の場合、2文字目が「a」のため、本来は「あaaab」の後ろに結合した「a」を検索してほしかったのに、先に2文字目の「a」にヒットして意図しない結果が返ってきたのです。

これを避けるには、FINDBの[引数3]で、検索の開始位置を、「一番最後の文字から」にしてしまえば良いです(ここで言う最後の文字とは、検索する文字列に結合した「a」のことです)。

使うのはLEN([引数])という関数です。これは、[引数]の文字数を返す関数です。今回は、A1セルの文字に「a」を追加した文字列の文字数がほしいですから、LEN(A1&”a”)という形にします。

ここで、疑問として、FINDBの[引数3]で先頭以外の文字を指定した場合に、返ってくるバイト数は、先頭から数えたものなのか、それとも[引数3]から数えたものなのか?というものがあります。答えは先頭からです。なので、これ以上手を加える必要はありません。

絶対に使われない半角文字があるのであれば、「a」の代わりにそれを用いることで、FINDBの[引数3]は省略できますが、なかなかそんな文字は無いと思うので、しっかり[引数3]まで使うのが良いでしょう。

スポンサーリンク