条件にあう複数のセルをまとめる
ステップ0 背景と条件
今回は顧客リストから、会社ごとの担当者あてのメールを送らなきゃいけない案件が発生しました。
顧客リストはこんな感じ。ざっと500行ぐらいあります。
顧客リストって、だいたいどこもこんな感じなんでしょうか?
VBAで扱いにくいですよね。
さて、皆さんならどうしますか?
いちばん基本的なやり方は、オートフィルターで社名で絞って、メールアドレスをコピーし、メーラーのTo欄に貼りつけるかな、と。
そのやり方でもいいんですよ。めんどくさいけど。
ただ、今回の案件では、
- 今後も毎月、同様のメールを送り続ける必要がある
- 担当者は変更になることがある
- 相手先の会社も増減になる可能性がある
といった条件があり、毎回、手作業でちまちまオートフィルタを操作するのはイヤだな、と。
まぁ、いろいろ方法はあるんでしょうけれど、今回オレがやったのを備忘録がてらに書いておきます。
当社は幸い、office365が導入されており、いわゆる新関数が使えます。
ステップ1 社名の一覧表を作成
とにかく、相手先の会社の数だけメールを送るので、社名の一覧がないと話にならんのですよ。
なので、とりあえず、社名一覧を作ります。
これには、新関数のUNIQUEが力を発揮します。
適当なセル(ここではH2)に
=UNIQUE(テーブル1[会社名])
と書くと、スピルが発動して、いきなり下図のようになります。スピルすげぇ。。
ついでにG2セルにも
=ROW(H2#)-1
と入れています。スピルについては、どこかでググってもらえればいいかと思いますが、リクエストがあれば説明します。
最後にVBA化することを見据えて、連番を入れたら社名が表示されるようにしておきましょう。
やり方はいろいろあると思いますが、今回はこんな感じにしておきました。
=OFFSET(H2,J2-1,0)
J2に手動で番号を入れると、該当する社名が表示されますね。
ステップ3 メールアドレス一覧を抜き出そう
さて、選択した社名に対する、メアド一覧を表示させます。
こんな時に力を発揮するのは・・・、Filterですね。こちらも適当に
=FILTER(テーブル1[メールアドレス],テーブル1[会社名]=J4)
とかで大丈夫です。J2セルを適当に手入力すれば、メアドの数だけスピルしてくれます。
ステップ4 複数のセルをつなげる
次のステップは、抜き出されたメアドをつなげることです。
残念ながら適当な関数は見つけられなかったので、仕方なく自作しました。
1 2 3 4 5 6 7 8 |
Public Function Fn文字をつなげる(c As Range, p As String) Dim r As Range Dim s As String For Each r In c s = s + r.Value + p Next r Fn文字をつなげる = s End Function |
こんな感じです。
第一引数でつなげたいセルを選んで、第二引数の記号で区切ってつなぐ、ってことにしました。メアドなので、";(セミコロン)"区切りにしてます。
ステップ5 最後はVBAで
ここまでできたら、あとはVBAで、会社名の数だけFor分を回して、メーラーを起動すれば、イケるっしょ(笑)
最後に
忘備録なので、解説とかがっつり端折っちゃってますが、「ここがわからん」「ここガダメ」などご意見、ご要望などありましたら、フォームからぜひ