[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『集計』(りん)
コード4を基準としてコード番号ごとに 1・2・3列ごとに集計しています。列1の集計が同じものはそれぞれ相殺して行を削除しています。手作業のためよい方法あれば教えてください。お願いします。データは17列6000行あります NO 日 日 コード1 コード2 品目 品名 コード1 コード2 1 2 3 コード3 コード4 コード5 1 41 42 A1 111 A B A-1 A-2 11 0 11 A-3 A-4 A-5 1 41 42 A1 111 A B A-1 A-2 11 0 11 A-3 A-4 A-6削除 1 41 42 A1 111 A B A-1 A-2 7 0 7 A-3 A-4 A-7削除 1 41 42 A1 111 A B A-1 A-2 -7 0 -7 A-3 A-4 A-8削除 1 41 42 A1 111 A B A-1 A-2 -7 0 -7 A-3 A-4 A-9 1 41 42 A1 111 A B A-1 A-2 -11 0 -11 A-3 A-4 A-10削除 集計 4 0 4 1 41 42 A1 111 A B A-1 A-2 0 46 46 A-3 A-4 A-10 1 41 42 A1 111 A B A-1 A-2 -137 0 -137 A-3 A-4 A-11 集計 -137 46 4 ※右端の削除は削除したいデータです。 すみませんうまく表が表示できません。
レイアウトは下記であっていますか? [A] [B] [C] [D] [E] [F] [G] [H] [I] [J] [K] [L] [M] [N] [O] [1] NO 日 日 コード1 コード2 品目 品名 コード1 コード2 1 2 3 コード3 コード4 コード5 [2] 1 41 42 A1 111 A B A-1 A-2 11 0 11 A-3 A-4 A-5 [3] 1 41 42 A1 111 A B A-1 A-2 11 0 11 A-3 A-4 A-6 削除 [4] 1 41 42 A1 111 A B A-1 A-2 7 0 7 A-3 A-4 A-7 削除 [5] 1 41 42 A1 111 A B A-1 A-2 -7 0 -7 A-3 A-4 A-8 削除 [6] 1 41 42 A1 111 A B A-1 A-2 -7 0 -7 A-3 A-4 A-9 [7] 1 41 42 A1 111 A B A-1 A-2 -11 0 -11 A-3 A-4 A-10 削除 [8] 集計 4 0 4 [9] 1 41 42 A1 111 A B A-1 A-2 0 46 46 A-3 A-4 A-10 [10] 1 41 42 A1 111 A B A-1 A-2 -137 0 -137 A-3 A-4 A-11 [11] 集計 -137 46 4
とりあえず、整形と(表はエクセルから貼り付けると簡単ですよ。) 疑問点。 J列が 「 11」のもの A-5,A-6 「-11」のもの A-10 なぜA-10の対がA-5ではなく A-6なのですか?
それとも私の考え方がちがうのですかね?
>コード4を基準としてコード番号ごとに 1・2・3列ごとに集計しています。 ここの意味もちょっとわからないです・・・。 実際のデータは7行目までのコード4と、9・10行目のコード4は 違ったコードなんですかね?(1・2・3列も?ほかの所も?)
作業列を作ってABS関数で絶対値を表示させて オートフィルタで絞り込みながら削除していく ・・・とかじゃ駄目ですかね? 今回の例だと全ての行を表示した状態で「11」と「-11」を探すのではなく 一度絶対値「11」の行のみを表示して、プラスの物とマイナスの物を同行数削除する。 と言う手順です。
(HANA)
HANA さま
ありがとうございます。
すいません。誤った説明とデータでした。ごめんなさい。 下記にデータも書き直しました。(教えていただいたようにエクセルを貼りました) この並び順のD列のコード1のコードが同一、 計3で相殺して0 のデータは削除したいのです。 計3で相殺して0 のデータは削除したいのです。 ( L列に削除(又は×)と入力できればうれしいです。お願いします。 A B C D E F G H I J K L M L 1 NO 日1 日2 コード1 NO 担1 担2 担3 担4 計1 計2 計3 品 2 01 330 210 A7 7 a A あ k -3 0 -3 2 削除 3 02 330 210 A7 7 a A あ k 3 0 3 2 削除 4 03 330 310 A6 16 i I い k 0 2 2 5 削除 5 04 330 310 A6 16 i I い k -2 0 -2 5 削除 6 05 330 310 A6 16 i I い k 2 0 2 5 削除 7 06 330 310 A6 16 i I い k -2 0 -2 5 削除 8 06 330 310 A6 16 i I い k -2 0 -2 5 9 07 330 228 A6 90 u U う k -5 0 -5 4 削除 10 08 330 228 A6 90 u U う k 5 0 5 4 削除 11 09 330 318 A1 4 e E え k 8 0 8 4 12 10 330 318 A1 4 e E え k 5 0 5 4 13 11 330 215 A9 0 o O お k 0 4 4 6 14 12 401 216 A7 7 a A あ k 6 0 6 2 削除 15 13 401 216 A7 7 a A あ k 0 -6 -6 2 削除
>L列に削除(又は×)と入力できればうれしいです。 ・・・えっと、N列でいいですよね?
N2に =IF(L2="","",IF(OR( SUMPRODUCT(($D$2:$D$1000=D2)*($L$2:$L$1000=L2))<=SUMPRODUCT(($D$2:$D$1000=D2)*($L$2:$L$1000=L2*-1)), SUMPRODUCT(($D$2:$D$1000=D2)*($L$2:$L$1000=L2*-1))>=SUMPRODUCT(($D$2:D2=D2)*($L$2:L2=L2))),"削除",""))
と言う式を入れてやっちゃってみて下さい。 計算に時間がかかりそうな予感です。 上手く行くと良いのですが。
一応リスト範囲は1000行までです。 そんなに必要無い場合や、それでも足りない場合は式中の 「$D$1000」と「$L$1000」の部分 計6カ所を変更して下さい。
・・・何故かB列を見ていたので式を変更しました・・・。 (HANA)
HANAさん すごいエクセルありがとうございます。 気の遠くなるような作業だったので本当にうれしいです。今から使わせて頂きます。 もし宜しかったら 上記式の意味を教えて頂けませんか? 本当にすいません。
・・・使えましたかね?(良かったです。) 説明ですが、やりますが、その前に忘れそうなので 「文章の最後にはニックネーム(ご署名)をお願いします。」 自主的に書かないと入らないんですよね。
さて、本題。 SUMPRODUCT関数は分かりますでしょうか? http://www.excel.studio-kazu.jp/lib/e3h/e3h.html とりあえずリンクだけしておきます。 先に私が式を考えた手順を載せるので、まずは見て下さい。 実際に関数で何故その値が出るのかは、その後で。 リンク先をみて分からなかったらまたお訊ね下さい。
説明・・・と言っても大したことではないのですが 1.自分がそのグループの中で何回出現するか数える。(O) 2.相方が同じグループの中で何回出現するか数える。(P) 3.自分がそのグループの中で何回目に出現か数える。(Q) 「数えて比べて表示」しているだけです。
まず『数えて』みる式です。 Oの式が O2=SUMPRODUCT(($D$2:$D$1000=D2)*($L$2:$L$1000=L2)) Pの式が P2=SUMPRODUCT(($D$2:$D$1000=D2)*($L$2:$L$1000=L2*-1)) Qの式が Q2=SUMPRODUCT(($D$2:D2=D2)*($L$2:L2=L2))) OとPの式は最後が「L2」か「L2*-1」かの違いしかないですよね。 「自分自身」か、「その相方」かの違いしか無いからです。 (計算途中を見たければ、それぞれセルにコピーしてみて下さいね。)
つぎに『比べて』みる式です。 OとPの数が同じ場合は、その数が何個あっても“削除”ですよね。 OよりPの数が多い場合は、Oの数分は相殺出来るので“削除”ですよね。 式は R2=IF(O2<=P2,"削除","★")(R) OがP以下なら“削除”そうでないなら未定なので★を表示します。
問題は、OよりPの数が少ない場合です。 Pの数分だけOは“削除”なのですが、Pの数を超えると相殺ではありません。 それなら、Oが一番上から今までで何回出てきたかとPの数を見比べて Pの数を超えない分は“削除”にすればいいですね。 「Oが一番上から今までで何回出てきたか」数えるのがQの式です。 Qの値がPと同じかそれより小さい時に“削除”なので 式は S2=IF(P2>=Q2,"削除","★")(S)
・・・とここまで来て「おやおや?」ですね。 Qの値はOの値を超えることはないので、QとPを見れば OとPを見る必要がないですね・・・・。 最初の式は、「RとSのどちらかが“削除”なら削除だな」と思って OR関数に入れたのですが、Sの式だけで良いみたいでした。
よって、式が短くなりました。(笑) N2は =IF(L2="","", IF(SUMPRODUCT(($D$2:$D$1000=D2)*($L$2:$L$1000=L2*-1))>=SUMPRODUCT(($D$2:D2=D2)*($L$2:L2=L2)), "削除",""))
S2=IF(P2>=Q2,"削除","★")この式の 「P2」の所に現在P2に入っている式を 「Q2」の所に現在Q2に入っている式をいれて 「それ以外は削除じゃない!!」と分かったので「"★"」を「""」に変更しました。 さらに、式を多目にコピーしても余計なものが表示されないように、 「L2が空欄なら空欄表示」と言うIF関数でくくりました。
要するに、相方のトータル出現回数より、自分が今まで出てきた回数が同じか それより小さい場合が“削除”になります。
やっぱり、「ちゃんと確認しないと」ダメですね。
で、実際の計算の方は分からなかったらまたご質問下さい。 (もちろん上の説明で分からない部分もあればあわせて。)
(HANA)
NO2の(マクロでやっつける)方法。 (弥太郎) Option Explicit Sub 削除一発() Dim dic As Object, tbl, x Dim i As Long, data As Double
Set dic = CreateObject("scripting.dictionary") tbl = Range("a2").Resize(Range("a" & Rows.Count).End(xlUp).Row, 13).Value ReDim x(1 To UBound(tbl, 1), 1 To 1)
For i = 1 To UBound(tbl, 1) data = tbl(i, 12) * -1 If dic.exists(tbl(i, 4) & data) Then x(i, 1) = "削除" x(dic.Item(tbl(i, 4) & data), 1) = "削除" dic.Remove tbl(i, 4) & data Else dic(tbl(i, 4) & tbl(i, 12)) = i End If Next i
Cells(2, "n").Resize(UBound(tbl, 1) - 1) = x Set dic = Nothing
End Sub
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.