はじめに例えば以下の図ようなことをしたい時がありませんか?顧客IDごと、あるいは、顧客の氏名・住所・TELごとに、何らかのリスト(購入品履歴など)を縦方向から横方向につなぎ変えたい場合です。SUMIF関数はある条件のもとに数値の合計はできますが、文字列の結合ができません。(Excelのことを知らないもんですからそれができる関数が無いと知って驚きましたけど・・・。考えたらAccessでも無いかもですね。VBAでやるほうが多分簡単な気がします。僕はSQLも音痴なので理解ができませんでした。関数、SQL、よりも、VBAのほうが簡単でした。)Webを色々と漁ってみたのですが、汎用的に使えるとか、書き換えができそうな、とかの小さなプログラムがありませんでした。関数だとすごくややこしくなって面倒くさいので、VBAでやることにしてみました。(複数の関数のかけあわせができる人、本当に尊敬します。)ここでは、あとで作り変えもできる、ちいさなプログラムを作ってみました。(素人なので美しくないコードですみません!)顧客IDごとに、B列の値が横に結合していき、C列の各顧客の最後の行(もとから1行しかなければその行)に、その結合された値を埋め込んでいくプログラムです。関数でやる方法を調べたら、例えばC列の全セルに値が表示されてしまう方法がとても多かったです。「B列の値が1つずつ結合されたものが上から順番にC列の全セルに埋め込まれてしまう方法」が多かったでした。それだと、最終的に「顧客名簿集約」を見据えたときに後の処理が面倒くさいです。結合された値が入っていれば」、上図のようにC列でオートフィルタを使って、購入製品履歴付の名簿が作成しやすいです。どの列に顧客情報が入っているかとか、どの列に、結合した値を埋め込むかは、最初のサンプルプログラムではA列、B列、C列、で決め打ちしてしまっていますが、2つ目のサンプルプログラムのように、ユーザーに問い合わせるように作り変えれば、どの列がどうでも、自由が利くと思います。モトデータが全部残っているほうが、のちにまた別の加工に使えるかもしれません。そんなこともあって、C列のすべてのセルに値を埋め込むことはやめてあります。以下、サンプルコードです。冒頭の図のように、1行目に「F01」~{F03」の列名を入れ、同様に値を入れてから、以下のコードを「標準モジュール」にコピペすれば動きを確認できると思います。1行目は列名なので、実データは2行目からとなるため、初期値を2としました。※実データが100行あれば、8を100に書き換えます。'変数にB列の値を代入するだけです。'C列にB列の横結合値を埋める処理は、次の分岐の中でやります。'理由は、2行目以降に行かないと、顧客IDが前行と同じかどうかの判断がつかないためです。'C列にB列の横結合値を埋める作業はこちらの分岐の中でやります。'次の行へ移動するために、カウンタをインクリメントします。」と書かなくてもOKです。一応コメントアウトしておきます。1行目は列名なので、実データは2行目からとなるため、初期値を2としました。※実データが100行あれば、8を100に書き換えます。Then'実データの1行目だけ、'1つ前のセルが列名になってしまうので以下の処理'変数にB列の値を代入するだけです。'C列にB列の横結合値を埋める処理は、次の分岐の中でやります。'理由は、2行目以降に行かないと、顧客IDが前行と同じかどうかの判断がつかないためです。LngStrtRow01)Else'列名以外の、実データの2行目以降は、以下の処理'C列にB列の横結合値を埋める作業はこちらの分岐の中でやります。'次の行へ移動するために、カウンタをインクリメントします。」と書かなくてもOKです。一応コメントアウトしておきます。モジュール」を押します。そのあとに、上記のコードをコピペして、実行します。実行は、プログラムのどこでもいいのでいったんクリックして点滅カーソルを表示させてから、下図の赤枠のボタンを押すか「F5」キーを押すと実行できます。※プログラムのどこでもいいのでいったんクリックすることで、そのプログラムを「選択した」という意味になります。それをしないと下図のような変なダイアログが出てきてしまいますのでご注意ください。前出の「YokoMargeTest01()」のプログラムを少し作り変えて、処理する列が変わってもいいように、自由に設定できるようにしてみました。エラー処理やいろんな処理をしてないのでユーザーに列を指定させるときに、キャンセルを選ぶとエラーになります。一応、最小限、動きますので、あと何を付け足したらエラーが出ないようになるかご自分でも考えてみてください。これも、前出のプログラム同様に、3列を保持するシートを作成し、標準モジュールにコピペして実行すれば、動作を確認できます。相変わらずに、レベルの低い、美しくないプログラムですが、VBA初心者の方のご参考になれば幸いです。'自由に設定できるように作り変えたものです。'ユーザーに列を指定させるときに、キャンセルを選ぶとエラーになります。'ご自分でも考えてみてください。'VBA初心者の方のご参考になれば幸いです。1行目は列名なので、実データは2行目からとなるため、初期値を2としました。'条件にしたい列での並べ替えが済んでるかのチェック。'並べ替えされてないと同一IDのかたまりがバラバラに存在して横結合されてしまうことがあるので。みなします」とあらかじめVBAの決まりで決まっています。みなします」とあらかじめVBAの決まりで決まっています。'何もしないでこのプロシージャの実行を終わる。'並べ替えが終わってないと、処理が正常にやれないので。'←このプログラムを終わる、の意味です。'そのほかの場合も、一応、終わっておく。'処理する列や行数なをユーザーに問い合わせます。そのエラーの回避のコードはご自分でもお考えになってみてください。InputBox("★01---どの列の値を比較しますか?「顧客ID」のような列の列番号を入力してください。A、B、C...などの列番号を半角英数で入力してください。A、B、C...などの列番号を半角英数で入力してください。A、B、C...などの列番号を半角英数で入力してください。半角の数字で入力してください。処理したい数よりも大きければOKです。※実データが100行あれば、8を100に書き換えます。以降の処理を繰り返します。」の行までの内容を繰り返します。'次の行へ移動するために、カウンタをインクリメントします。」と書かなくてもOKです。一応コメントアウトしておきます。処理する列が変わってもいいように、'自由に設定できるように作り変えたものです。'とはいえ、エラー処理やいろんな処理をしてないので'ユーザーに列を指定させるときに、キャンセルを選ぶとエラーになります。'でも一応、最小限、動きますので、あと何を付け足したらエラーが出ないようになるか'ご自分でも考えてみてください。'相変わらずに、レベルの低い、美しくないプログラムですが、'VBA初心者の方のご参考になれば幸いです。1行目は列名なので、実データは2行目からとなるため、初期値を2としました。'条件にしたい列のチェック'条件にしたい列での並べ替えが済んでるかのチェック。'並べ替えされてないと同一IDのかたまりがバラバラに存在して横結合されてしまうことがあるので。みなします」とあらかじめVBAの決まりで決まっています。みなします」とあらかじめVBAの決まりで決まっています。'つまり、並べ替えが終わっていないなら、'何もしないでこのプロシージャの実行を終わる。'並べ替えが終わってないと、処理が正常にやれないので。'←このプログラムを終わる、の意味です。Else'そのほかの場合も、一応、終わっておく。If'処理する列や行数なをユーザーに問い合わせます。そのエラーの回避のコードはご自分でもお考えになってみてください。InputBox("★01---どの列の値を比較しますか?「顧客ID」のような列の列番号を入力してください。A、B、C...などの列番号を半角英数で入力してください。A、B、C...などの列番号を半角英数で入力してください。A、B、C...などの列番号を半角英数で入力してください。半角の数字で入力してください。処理したい数よりも大きければOKです。※実データが100行あれば、8を100に書き換えます。以降の処理を繰り返します。」の行までの内容を繰り返します。'次の行へ移動するために、カウンタをインクリメントします。」と書かなくてもOKです。一応コメントアウトしておきます。Sub''''なお、もし「あたしゃ、どうしても書き込んだ列に空白を作りたくないんだよ!(さっきまる子ちゃん読んでたから感化されてしまいました)」という場合は、これらのプログラムにそういった処理を埋め込むよりは、別途に「次行以降の、次の異なる値までの空白はすべて現在の値で埋めるプログラム」を作って「Call」で呼び出したほうが、色んな場面で流用も効いて、共用部品として使えるので便利だと思います。「空白を同じ値で埋める」というのはよくある作業なので、それができるプログラムを何かのプログラムからCallするほかにも、メニューバーやリボンに「ボタン」として配置して呼び出せるようにしておけば、それもとても便利だと思います。「安全」な、Youtube動画のダウンロード方法6つ。挫折するオブジェクト式やプログラム(プロシージャ)の書き方、挫折しない書き方、の違い。Queryやピボットテーブルを使えるようにするために。「安全」な、Youtube動画のダウンロード方法6つ。挫折するオブジェクト式やプログラム(プロシージャ)の書き方、挫折しない書き方、の違い。送信メールが受信トレイに入ってしまうトラブルの回避、など。ODBCでQueryTableオブジェクトを自動作成するサンプルコード)。2000以降の全バージョンで使えると思います。~ついでに、セルの値で結果表示を自動で切り替える「パラメータクエリ」のVBAでの自動作成も。technology.。