- ベストアンサー
エクセルVBAで複数行の値を統合する方法
- エクセルVBAを使用して、複数行の値を統合する方法について教えてください。
- 区分ごとに複数行の値を統合するためのロジックについても教えてください。
- 統合後のデータの表示フォーマットについても教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
この手の質問(の仕方)もよく見かけるのですが、 例えばご提示の例を拝借して 【 統合前 】 |区分 |値1 |値2 |値3 | ------------------------------------------------ |区分A| 10 |(空白)|(空白)| |区分A|(空白)| 20 |(空白)| |区分B| 40 |(空白)|(空白)| |区分B|(空白)| 50 |(空白)| |区分A|(空白)| 30 |(空白)| こんな感じで「同じ区分・同じ値」が重複する可能性はありますか? この場合、区分Aの値2ですね。 > 値1~3は数値ではなく主に文字が入る とのことですが、上のようなケースがある場合の扱いはどうするのでしょう? 数値なら合計したり最大値を取ったり平均を出したりも容易ですが、 文字列を「統合」したいのであればそれなりに考えないといけません。 など、疑問がいくつかあります。 で、それがソコソコ重要だったりします。 さて、VBAでやるならどう組むか。 というより、手動でやるならどうするか?なのですが・・ 各行を読み、転記、次の行を読み、転記・・の繰り返しですね。 VBAでも同様に読んでは追記、読んでは追記をしてやればOKです。 あるいは、読んで記憶・・を繰り返して、 最後まで読んだら一気に転記、なんて方法もありかもしれません。 インターネットに多数のサンプルやヒントが落ちているはずですので、 その方向で探してみると良いかもしれませんね。 なお、「数値なら」なのですが、 エクセルにはズバリ「統合」という機能があります。 簡単な使い方としては、統合後の表を作成したい範囲の左上にカーソルを持って行き リボンの「データ」タブの真ん中あたりに「統合」をクリック ダイアログが出てきますので、 ・集計の方法を選択 ・集計する元の範囲を「追加」 ・統合の基準をチェック ・違うシートに作る場合は「元データとのリンク」も可能 それぞれ設定し、OK。 単純に「統合」するだけなら、ピボットテーブルよりお手軽です。 文字列にはやはり効果がないですけどね。 参考までにどうぞ。
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
回は、ロジックは、いわばソート法です。 (1)区分の列でソートする(VBAでもよいが、手動でやるのが簡単)Sheet2ができる。 行的に区分1は続いた行に集まる。その区分1の行の塊以外には区分1は現れない。 行的に区分2も区部区分1の下行に、続いた行に集まる。 以下はVBAになるが (2)それらのデータSheet2を上行から、1行ずつ読んで B列にデータがあれば、値1、C列にデータがあれば値2、D列にでーたがあれば値3としてSheet3のセル(列)に代入する。 (3)すべての行で、前の行の区分と比較して、区変われば、Sheet3の次の行に書き出す。(4)Sheet2の最終行まで繰り返し。 ソート処理時間以外は、全行を1度読むだけで、処理が終わるので処理速度は速いと思う。 ーー VBAコードはあえて書かないが、少しVBAの経験があるなら、のちの回答として補足しても良いが。 == ピボットテーブルでやってみた。 見出しも下記のようにすること。 例データ 区分 値1 値2 値3 区分A 10 ー - 区分A ー 20 ー 区分B 40 - - 区分B ― 50 - 区分A ー - 30 ーー 操作 データ範囲指定 A1:D6 見出しを含む範囲を指定 挿入ーピボットテーブル OK 行の枠に区分をマウスでD&D 値1をΣ値の部分にD&D 値2をΣ値の部分にD&D 値3をΣ値の部分にD&D 値1の「データの個数」の右の▼をクリックして「値フィールドの設定}の「合計」を選ぶ 値2の「データの個数」の右の▼をクリックして「値フィールドの設定}の「合計」を選ぶ 値3の「データの個数」の右の▼をクリックして「値フィールドの設定」の「合計」を選ぶ ピボットの表 行ラベル 合計 / 値1 合計 / 値2 合計 / 値3 区分A 10 20 30 区分B 40 50 総計 50 70 30
お礼
ありがとうございました。 参考にさせていただき解決しました。
- mt2015
- ベストアンサー率49% (258/524)
お礼
> 文字列を「統合」したいのであればそれなりに考えないといけません。 そうですよね。 数値なら重複しても対処法(合計・平均etc)が限られてくるので標準機能として用意されてるのでしょうね。 今回の場合は重複はない前提なので、結合しても、1件目を採用しても、最後を採用しても構わないです。 (追記)自己完結しました。 結局、(1)ソート、(2)文字データの統合、(3)重複の排除の順番で処理することにして、(1)と(3)はエクセル機能を利用、(2)はやりたい処理をそのままVBAロジックで記述しました。 速度については、シートを丸ごとVariant型にコピーして処理を行い、再びシートに戻すやり方であれば、そこそこ速くなったので解決としました。