英文を配列に分割するには

英文には終端文字として.と?が使われます。1行の長い英文の場合、1行の中に.や?が複数使われることがありますが、英文を区切り文字ごとに分けたい場合もあります。

VBAでは文字列の分割にSplit関数を使うことがあります。ただ、Split関数は英文を分割するのにはあまり向いていません。なぜかというと、Split関数は分割する文字自体を残さないことと、複数の文字の種類を分割できないためです。

.や?のように2種類の文字で分割したい場合にSplitを使うと、.や?自体が英文から消えてしまいますし、そもそも2種類の分割が対応していません。

そこでここでは、英文の中にある.と?があれば配列に分割するマクロを紹介します。

.と?以外の文字で分割したい場合は、後述するマクロに文字を追加するだけで対応できるようにしています。

なお、Split関数については「VBA関数:指定文字で分割して配列にする(Split)」、Split関数で区切り文字を複数使う方法については「VBAのSplit関数で区切り文字を複数使う方法」をご参照ください。


英文を分割するマクロ

以下のSplitEnglish関数は、引数で渡された英文の文字列を.と?の部分で配列に分割して返します。

例えば、「aaa? bbb. ccc. ddd?」という英文の場合は、
[aaa?]
[ bbb.]
[ ccc.]
[ ddd?]
の4つの要素を持つ配列を返します。

各行の先頭の空白文字は元の英文を分解する機能に特化するためあえて残しています。先頭の空白を除去したい場合は、このSplitEnglish関数を呼び出す側でTrim関数で除去してください。後述する使い方でTrim関数を使っていますので参考にしてください。

処理の内容ですが、英文を1文字ずつループして、それが区切り文字の.か?であるかを判定して、そうであれば配列の要素を追加しています。



使い方

SplitEnglish関数に英文文字列を渡すと、.と?で配列に分解されて返されます。

SplitEnglish関数では区切り文字で分解しているだけのため、.や?の後ろに空白文字があるとそれが行の先頭文字として設定されています。

そのため、Debug.Printの出力ではTrim関数を使って分割後の英文の前後の空白文字を除去しています。

実行結果(3行で出力)
Are you having internet speed issues?
If you have problems, test your internet line speed.
Performs speed measurement and speed diagnosis, and displays the results.

Debug.PrintでTrimしなかった場合の出力(.の次の空白が次の行の先頭に設定される)
[Are you having internet speed issues?]
[ If you have problems, test your internet line speed.]
[ Performs speed measurement and speed diagnosis, and displays the results.]