Powered By Blogger

暇がない。自力じゃ無理な人はこちらへ。

2015年8月21日金曜日

範囲内の文字列を結合するには?

問題?

範囲内の文字列を結合と言っているのは、














みたいな表があって、

  地名リスト:福岡県&熊本県&熊本市&佐賀県&佐賀市&長崎県&大分市

とセル内の文字列を結合して表示するような場合のことだ。

文字列の結合には、ご存知のように、&演算子、CONCATENATE関数が使える。
しかし、上のようにセパレータで区切ったり、数が多いと結構大変だ。

数値の場合、SUM関数のように範囲指定して演算をするような関数は用意されているので、範囲指定して、SUM関数等を使えばいいだけ。
しかし、文字列の場合、こんな風に範囲指定できる関数は用意されていないようだ。

文字列の場合、1個づつ&演算子やCONCATENATE関数で結合するしかないのか?
まあこれでも目的を果たせるならいいが、結合する範囲が変わったり、途中に行や列が挿入されたら?
という訳で、今回は範囲内の文字列の結合。

考え方:

文字列の結合には結局のところ&かCONCATENATEを使う必要がある。
途中にセルが挿入されても、数式のコピペで対応できるようにする。

ということで、採用したのが単純な方法。
隣のセルと結合した結果をそのまた隣と結合していくチェーン方式。

実際の数式:

計算用セルを横に追加する。(通常は非表示)


















D4が最終結果となる。

D4の式:
=IF(OR(B4="",OFFSET(C4,-1,0,1,1)=""),"",$E$3)
 &IF(OFFSET(C4,1,0,1,1)="",T(B4),B4&OFFSET(D4,1,0,1,1))

C4の式(結合対象範囲を判断するために使用):
=ROW(C4)

D4式の解説
 基本処理:
  (セパレータ$E$3)と(現在行のB列)と(下の行のD列)を結合。
  文字列結合には&演算子を使用(CONCATENATE関数でもOK)。

 前方にセパレータを追加しない条件:
  B列が空欄または、一番上の行。

 最下行の処理:
  下の行と結合しない。

*)上下のセルをC3やC5と直接指定せずに、OFFSET関数を使っているのは、途中に行を追加した場合に正しく直下や直上のセルを指定できるようにするため。
*)T関数は最下行のB列が空欄だった場合に0ではなく空欄("")とするために追加。
*)C列の上下は空欄にする。

これで完成。途中に行を挿入しても行コピーでOKだ。
さらに応用として、IFを追加して、条件にあう場合だけ結合というのもできるだろう。

今回のねた、範囲内の文字列を結合するなんていう場合は稀だとは思うが、たまたま別件で必要になったので考えてみた。
以上、終了。

1 件のコメント: