- ベストアンサー
エクセルでの集計
A列に下記のようなデータが千件くらい入っています。 例:C-100/50/5/5 A-200/100/50/5 B-100/100/10/10 C-100/50/5/5 A-200/100/50/5 D-300/50/50 ・ ・ かなり重複もあります。 C列にA列のデータを以下の様に集計したいと思います。 例:A-200/100/50/5 B-100/100/10/10 C-100/50/5/5 D-300/50/50 ・ ・ 重複している場合は1行とし抜き出し、順番に集計したいのですが、 マクロか関数でする場合、どのような記述になるのでしょうか? よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
数値データが最大999である(4桁になることはない)ということが確実なら、現在お使いの関数に手を加え A- の次に(4-数値データの個数) の値を付け加える 数値データはすべて3桁にそろえる ということをやったあと、これをキーにして並べ替えるとお望みの順に並び変わります。 具体的に書き換えてみると =IF(A3="","",A3&4-COUNT(B3:E3)&"-"&IF(B3="","",TEXT(B3,"00#")&IF(C3="","","/"&TEXT(C3,"00#")&IF(D3="","","/"&TEXT(D3,"00#")&IF(E3="","","/"&TEXT(E3,"00#")))))) これだと B3に50 C3に100 D3に50が入っている場合 B-1-050/100/050 となります。 この場合並べ替えはオートフィルターを使えばよいでしょう。
その他の回答 (3)
- bass_001
- ベストアンサー率75% (3/4)
条件はだいたいわかりました。すべてを説明するのは膨大な量となるのでいくつか説明して、またわからなければ聞いていただくことにします。また、今回のデータ1回きりの作業なのか、今後同様の作業が何度もあるのでデータさえ入れ替えればすぐ結果がでるものをつくろうとされているのかによってもかわってきます。 以下は、「関数だけでやる」という「美学」にこだわって私ならこうやるというものです。 まず、データを分解して表示させるためにA列の横の列を利用します。 (したがって並べ替えの結果はもっと右の列に表示することにします。) A2のセルにある A-100/100/50/5 から A- を抜き出すのは =mid(A2,1,2) 次にスラッシュの位置(左から何文字目)を探します。 1個目のスラッシュを単純に探すなら =SEARCH("/",$A2,1) でできます。(スラッシュが全角か半角かに留意してください。) ただし、スラッシュがない場合もありますのでエラーがでたときはブランク になるように書くと =IF(ISERROR(SEARCH("/",$A2,1)),"",SEARCH("/",$A2,1)) 同様に2個目のスラッシュは、1個目のスラッシュの位置の結果がセルD2 に入っているとすれば =IF(ISERROR(SEARCH("/",$A2,D2+1)),"",SEARCH("/",$A2,D2+1)) このようにして3個目のスラッシュの位置も調べます。 DからFの列にスラッシュの位置が数字で表示されます。 これができるとスラッシュの数は =COUNT(D2:F2) 次に1個目の数字を抽出します。スラッシュの位置がわかっているので =mid( ) を使えば数字の部分の文字列を抜き出すことができます。 文字列を数値に変換するのは =value() です。 1個目の数字を抽出し、数値に変換するには =VALUE(MID(A2,3,D2-3)) です。 2個目以降の数字は、もし数字がなかった場合の対応が求められます 上記のスラッシュの例を参考にご自身で工夫してみてください。 スラッシュの数がわかり、数字が数値として抽出できれば、あとは 並べ替えるだけです。 並べ替えの方法として何を選択するかはこれが今回限りの作業かどうか などでかわってくるでしょう。 関数を組み合わせるだけでもできますが、さらにややこしくなります。
補足
毎回言葉足らずで本当に申し訳ありません。 現在はA-100/100/10/5というデータを 一つのセルにしているのですが元々は、 A列に『A-』 B列に『100』 C列に『100』 D列に『10』 E列に『5』 という感じで入力しおり、セルの書式設定でB~D列に数字の 後ろに『/』をユーザー定義で表示されるようにしていたのですが、 いざ集計、並び替えをする際、非常にややこしい事になるのかもと思い、 他人に作ってもらった下記の関数で別の行に一つのセルになるようにしていました。 =IF(A3="","",A3&IF(B3="","",B3&IF(C3="","","/"&C3&IF(D3="","","/"&D3&IF(E3="","","/"&E3))))) もし元々のデータで集計、並び替えが出来るのあればお教え願いたいのですが、 説明等が膨大、複雑になる場合は無視して下さい。 エクセルの基本的な事もいまいち分かっていない未熟者でして、 せっかくご説明して頂いても私の頭が着いて行けないので… 今回の作業は今後も必要となる作業ですので、今回で雛形として作成し 今後も使う事が出来ればなぁと思っています。 何度も本当にすいません、よろしくお願いします。
- bass_001
- ベストアンサー率75% (3/4)
条件によってやりかたが変わってきます。 マクロか関数で ということですのでA列のデータは現状のまま残す(A列を並べ替えたりしない)という想定で考えます。 もし同じアルファベットならその後の部分は同じという前提があるなら 簡単です。 A列のデータの先頭の文字を読み取ってAならC1、BならC2に移していく という手順のマクロを書くことになります。 そうでない場合はちょっとややこしい 問題は並べ替えの順序です A-100/50/30 というデータと A-50/50/30 というデータがある場合どちらを先にするかです。 Aのあとの100 と 50 をそれぞれ数字として認識すると A-50/50/30 の方を先に来るようにしなければなりません。 mshr1962 さんが答えてくださった方法だと文字列として認識されます ので、A-100/50/30 の方が先にきます。 100を百と認識するか壱零零と認識するかの違いです もし100を数字としてとらえて小さい順に並べるとすれば結構大変です。 まず A-100/50/30 という文字列の中から数字の部分を抽出するという 作業が必要となります。その上で並べ変えていくことになります。 特に数字の桁数がそろっていないので数字の部分の抽出は面倒です。 マイナスとスラッシュの位置を調べてその間の文字列を抜き出し、数字 に変換しなければなりません。 ということで 前提条件をもう少し詳しく教えていただくことが必要かと思います。
補足
ご回答ありがとう御座います。 前提条件を詳しくということなので、基本的なデータの種類として A-100/100/50/5 B-100/10/10 C-100/10 D-100 といった一定では無いデータが混在しておりまして、 並べ替えの優先順位でいいますと、 (1)頭の『A-』を揃える。 (2)『/』の数が多い順番に上から並べる。 (3)A-の後ろの数字を大きい順に上から並べる。 (4)1つ目の『/』の後ろの数字を大きい順に上から並べる。 (5)2つ目の『/』の後ろの数字を大きい順に上から並べる。 (6)3つ目の『/』の後ろの数字を大きい順に上から並べる。 ・ を基本的な決め事として、うまくに出来ればなぁと思っています。 よろしくお願いします。
- mshr1962
- ベストアンサー率39% (7417/18945)
並べ替えまで考えるならピボットテーブル使った方がいいと思いますけど... 他の方法だと A列の1行目に項目名を設定して選択 「データ」「フィルタ」「フィルタオプションの設定」で 「抽出先」を「指定した範囲」にして リスト範囲が「A列」 抽出範囲が「C列」 「重複するデータを無視する」にして「OK」 これで 項目名 C-100/50/5/5 A-200/100/50/5 B-100/100/10/10 D-300/50/50 になるので「データ」「並べ替え」を行えば希望通りです。 必要ならマクロの記録を行ってください。
お礼
無事に集計する事が出来ました、ありがとうございました。 あと、並べ替えなのですが、最初の1行だけうまく出来ないのですが、 どのように指定してやればいいのでしょうか?
お礼
回答ありがとうございます。 完璧です、思い通りの並びにする事が出来きました。 本当に助かりました、ありがとうございました。