Excelのセルの値の結合は複雑になりがち
Excelを使用していて、複数のセルの値や関数を組み合わせて文字列を作りたい場面は結構あると思います。
例えば、以下のようなセルがある時

セルの値を利用して、「鈴木さんは10個のリンゴを買った」という文字列を作成したいとします。
その場合、以下のように関数式を作成します。

=A1&"さんは"&B1&"個の"&C1&"を買った"
この程度の簡単な関数式でも作成するのは結構面倒で、関数式のミスを出してイライラする事が多いです。
理由としては、文字列の間にダブルクォーテーションをいちいち挟まないといけないところですね。
文字列としてダブルクォーテーションを使用したいときは、ダブルクォーテーションを2つ打たないといけないので、更に複雑になります。
関数式が長くなってくると可読性が落ちてくるというのも難点です。
テンプレート文字列を使って見やすく書く
そこで自分は「VBAで自作関数を作成して見やすく結合できるようにする」という方法で結合をするようにしています。
具体的には以下のようなコードをVBAで作成します。
Public Function FORMAT_STR(format As String, ParamArray params() As Variant) As String
Dim i As Integer
For i = 1 To UBound(params) + 1
format = Replace(format, "$" + CStr(i), params(i - 1))
Next i
FORMAT_STR = format
End Function
これは、第一引数で与えられた文字列の中に「$1、$2…」という文字列があれば以降の引数に指定した文字列に置き換えるというコードになります。
具体的に以下のようにして使用します。

=FORMAT_STR("$1さんは$2個の$3を買った",A1,B1,C1)
第一引数で与えた「$1さんは$2個の$3を買った」という文字列に対して
$1をA1セル、$2をB1セル、$3をC1セルの値で変換した文字列を返却しています。
上記のテンプレート文字列関数を使うメリット
VBAを使わないといけないのはかなりのデメリットなのですが、メリットも大きいので、自分はこの方法で文字列を作成するようにしています。
メリットの1つ目は、前述しましたが「関数作成のミスが減る」ということです。
ダブルクォーテーションとアンパサンドを繰り返し使わないと行けないので、複雑な文字列を関数式だけで作っていくと結構ミスします。
このVBAの自作関数を使う方法なら、文字列の結合がなくなるのでシンプルに書くことができます。
2つ目のメリットは、書式を文字列としてセルに格納しておくことができる点です。
例えば以下のように書くこともできます。

A1に書式を表す文字列を格納しておき、それを第一引数に与えています。
仮に「買った」の部分を「売った」に変更が必要になった場合、A1のセルの値を変更するだけで対応できます。
Excel関数式を読み解かなくても変更できるので、お手軽で重宝しています。
また、文字列中にダブルクォーテーションが必要になった場合

A1のセルに値に直接ダブルクォーテーションを入力するだけで対応できます。(関数式の場合は、ダブルクォーテーションを扱おうとするとエスケープなどがあって面倒くさい)
以上のようなメリットがあるので、VBA使用というデメリットを考慮しても、この方式を採用するようにしています。
コメントを残す