複数条件の番号付けについて

このQ&Aのポイント
  • メーカーと商品の重複行には既存の番号を割り当てる
  • 販売可否が空白の場合は無視する
  • 同じメーカーが連続するように番号を振る
回答を見る
  • ベストアンサー

複数条件の番号付けについて

「メーカー」「商品」「販売可否」のある行に対し、以下の条件付きで番号を1から振りたいと考えています。 条件1: メーカー及び商品が重複した行があれば、既に振られた番号にする 条件2: 販売可否が空白の場合は無視する 条件3: 同じメーカーが連続するように番号を振る 条件4: 元の表は並び替えなどの加工は出来ない 一応、添付画像のような形で実現は出来ています。 以下のような式を使っています。 (1)G4:G21 =IF(COUNTIF(C$3:C3,C4)=0,MAX(G$3:G3)+1,VLOOKUP(C4,C$3:G3,5,FALSE)) (2)I4:I21 =IF(COUNTIF(D$3:D3,D4)=0,MAX(I$3:I3)+1,VLOOKUP(D4,D$3:I3,6,FALSE)) (3)K4:K21 =IF(E4<>"",G4*1000+I4,"") (4)M4:M21 =INT(IF($K4<>"",SUMPRODUCT(($K$4:$K$21<>"")*($K$4:$K$21<=$K4)/COUNTIF($K$4:$K$21,$K$4:$K$21)),0)) (4)で算出される値を得るために、(1)(2)(3)の行を使っています。 ちなみにこの(4)の値を使って、B24:D37の表を作っています。 ※画像では省略していますが、メーカー・商品ごとの台数・金額合計の表になります。 この表で使っている式は以下の通りとなります。 (5)B26:B37 =IF(MAX(B$25:B25)+1>MAX($M4:$M21),"",B25+1) (6)C25:C37 =IFERROR(INDEX($C$4:$E$21,MATCH($B25,$M$4:$M$21,0),1),"") (7)D25:D37 =IFERROR(INDEX($C$4:$E$21,MATCH($B25,$M$4:$M$21,0),2),"") 質問としては、(4)を求める為に4列使っているものを減らせられないか、理想は1列ですがせめて2列に纏められないかと思っております。 何卒、宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • Chiquilin
  • ベストアンサー率30% (94/306)
回答No.1

数式で手間と処理時間を掛けてやる必要がないと思います。 ■G4セル =IF(AND(E4="可",COUNTIFS(C$4:C4,C4,D$4:D4,D4,E$4:E4,"可")=1),MATCH(C4,C$4:C4,0)*1000+ROW(),"") G21セルまでコピー ■C24セル =IFERROR(INDEX(C:C,MOD(SMALL($G$4:$G$21,$B24),1000)),"") 縦横方向にコピー 外部データの取り込みでやるなら 範囲を名前定義しておいて 定義した範囲を接続 既存の接続データから指定して プロパティの接続文字列を SELECT Distinct メーカー, 商品 FROM 範囲 WHERE 販売可否 ="可" AND メーカー Is Not Null でおしまい。 というかこんな手間をかけなくても ピボットテーブルだけでも済みます。

chimitta
質問者

お礼

ご案内頂いた式を少し改良させて頂く事で、自己解決する事が出来ました。 =INT(IF($G4<>"",SUMPRODUCT(($G$3:$G$21<>"")*($G$3:$G$21<=$G4)/COUNTIF($G$3:$G$21,$G$3:$G$21)),0)) 大変助かりました。 有難うございました!

chimitta
質問者

補足

ご回答有難うございます! 仰る通りでして、実際にはかなりの行数になっている為、ACCESSにしてしまった方が楽なのですが、不特定多数の者が入力したり、閲覧したりする関係と、そもそもフォームがエクセル縛りという事から、どうにかエクセルでクリアする必要がありました。また集計シートも決まっている為、ピボットテーブルも使えないのです… ちなみにですが、G4セルの=IF(AND(E4="可",COUNTIFS(C$4:C4,C4,D$4:D4,D4,E$4:E4,"可")=1),MATCH(C4,C$4:C4,0)*1000+ROW(),"")を入力した場合、販売可否が可であっても、上の行に同メーカー及び同商品が存在する場合、ブランク表示となります。 これをブランクではなく、上の行の同メーカー及び同商品の時の算出した値をそのまま参照するようにしたいのですが、どのようにすれば良いでしょうか?

関連するQ&A

  • INDEX関数SMALL関数を使って空白行を詰める

    シート1にINDEX関数SMALL関数を使って空白行を詰める表を作成したのですが詰めた表をシート2に表示することはできないのでしょうか。  =IF(COUNTIF($A4:$A4,0)=0,MAX(D$3:$D3)+1,"")  =IFERROR(INDEX(A:A,MATCH(ROW()-3,$D:$D, )),"")この表をシート2に表示する方法

  • COUNTIFの複数条件指定について

    Excelにて社内資料を作成しています。 COUNTIFの複数条件指定をしたいのですが難しく(汗) 詳しい方がいらっしゃいましたら教えてください。 【要望】 貼付の表の様に、 「A~Dは入力欄、J・H・IはA~Dに入った内容を持ってくる」 という内容にしたいです。 ◆A⇒Jはそのまま ◆B⇒Hもそのままです。 問題はIに入る内容です! Iには、 ⇒Dに「プラン」もしくは「キャンペーン」という表現が入ったらC+Dの内容を入れる ⇒Dに「プラン」もしくは「キャンペーン」が入らなければCの内容のみを入れる です! 【Dに「プラン」という表現が入ったらC+Dの内容を入れる】 という計算式は、 =IF(COUNTIF($D2,"*"&"プラン"&"*")>=1,CONCATENATE($C2,"※",$D2,),$C2)で設定できました。 「プラン」もしくは「キャンペーン」と設定する場合の方法を教えていただけますと幸いです。 よろしくお願いいたします。

  • エクセル関数について教えて下さい。

    仕入先の下(C3)の関数 =IF($D3>MAX($J$14:$J$135),"",INDEX($B$14:$B$135,MATCH($D3,$J$14:$J$135,0),MATCH(C$2,$B$13:$B$13,0)))&IF($D3>MAX($L$14:$L$135),"",INDEX($B$14:$B$135,MATCH($D3,$L$14:$L$135,0),MATCH(C$2,$B$13:$B$13,0)))&IF($D3>MAX($N$14:$N$135),"",INDEX($B$14:$B$135,MATCH($D3,$N$14:$N$135,0),MATCH(C$2,$B$13:$B$13,0))) 該当の関数 =IF($B$3=F14,"該当","") 連番の関数 =IF(I14="","",COUNTIF($I$14:I14,"該当")) 仕入先の担当者や特徴をまとめた表を作りました。 B3のドロップダウンリストから抽出したい項目を選択しますと、C3~C10に表から該当する「仕入先名」が抽出されます。 ~困り事~ 抽出された後に、抽出された一覧(C3~C10)の中の1つを選択クリックすると表の該当箇所に移動(飛ぶ)する事は可能なのかどうか。 または選択された該当箇所が表の一番上に表示(移動)可能かどうか。 皆さんのお知恵を拝借出来れば幸いです。 宜しくお願い致します。

  • 関数の複数条件について

    たびたびご協力をお願いしておりますが よろしくお願いいたします!>< エクセルのIF関数などを使って以下の条件を満たす数式を作っていたのですが、 条件が変更になってしまい困っております。 【状態】 ・B2:E2の中に【空白、◎、●、▲】のいずれかが入っている ・条件によりF2に【S,A,B,C,ネタ】が入る 【条件】 ・S⇒すべて◎ ・A⇒3回連続した◎がある ・B⇒◎3つ以上だが連続していない ・ネタ⇒●が1以下かつ、◎がない ・Cがそれ以外 【困】 ~が無い、~を含まない時、という関数がうまく作れず、調べても出てきませんでした。 NOTでは?という結論に至ったのですが少し違うような気も……; 以前の条件が A:◎3つ以上 B:◎2つ以上、残りが● C:●3つ以上 ネタ:それ以下 であったので、長いのですが =IF(COUNTIF(M2:P2,"◎")>=3,"A",IF(AND(OR(COUNTIF(M2:P2,"◎")=2,COUNTIF(M2:P2,"◎")=1),COUNTIF(M2:P2,"●")>=2),"B",IF(COUNTIF(M2:P2,"●")>=3,"C","ネタ"))) で何とか構成しておりました。 アドバイス、お待ちしております。 【追伸】 ~以上、~以下の表記もうまく使えなかったのでこういった長い形になっているのですが もしよろしければ合わせてお教えいただけると幸いです。

  • MATLABのデータ抽出についておたずねしたいことがあります。

    MATLABのデータ抽出についておたずねしたいことがあります。 MATLAB初心者ですが、以下のようなプログラムを現在書いています。 f = input('file name? ---> ','s'); m = csvread(f,66,2,[66,2,1089,3]); time=(0:0.002:2.046); t=reshape(time,1024,1); current=m(:,1)*1000; voltage=m(:,2)*10; m2=[t current voltage]; a=m2(1,2); b=m2(2:40,2); if a>max(b); g=a; end for I=2:1024; for J=1:1024; for K=39+I; if K>1024; K=1024; end c=m2(I,2); d=m2(J:I-1,2); e=m2(I+1:K,2); if c>max(e)&&c>max(d); g=c; else end end end end plotyy(t,current,t,voltage) ylim([0,700]) ifの条件を満たしたときに、m2の2列目の値だけでなく条件を満たしたその行の3列全てのデータを抽出し、条件を満たした行だけの新たな行列を作りたいのですが、どのような命令を書けばよいでしょうか。 お手数をおかけしますが、ご教授よろしくお願いいたします。

  • C言語の配列の使い方について質問です。

    以下のプログラムを配列を使って見やすくしたいのですが、どのように作ったら良いでしょうか? 宜しくお願いします。 #include<stdio.h> int main(void) { int a, b, c, d, e, f, g, h, i, j, k, l, m ,n, o; /*5段目の処理*/ for(a = 1; a <= 15; a++) { for(b = 1; b <= 15; b++) { if(a == b) continue; for(c = 1; c <= 15; c++) { if(a == c || b == c) continue; for(d = 1; d <= 15; d++) { if(a == d || b == d || c == d) continue; for(e = 1; e <= 15; e++) { if(a == e || b == e || c == e || d == e) continue; // printf("%d %d %d %d %d\n", a, b, c, d, e); ////4段目//// if(a>b){ f=a-b; } else if(a<b){ f=b-a; } if(b>c){ g=b-c; } else if(b<c){ g=c-b; } if(c>d){ h=c-d; } else if(c<d){ h=d-c; } if(d>e){ i=d-e; } else if(e<d){ i=e-d; } // printf(" %d %d %d %d \n", f, g, h, i); /////3段目//// if(f>g){ j=f-g; } else if(f<g){ j=g-f; } if(g>h){ k=g-h; } else if(g<h){ k=h-g; } if(h>i){ l=h-i; } else if(h<i){ l=i-h; } // printf(" %d %d %d \n", j, k, l); /////2段目//// if(j>k){ m=j-k; } else if(j<k){ m=k-j; } if(k>l){ n=k-l; } else if(k<l){ n=l-k; } // printf(" %d %d \n", m, n); /////三段目///// if(m>n){ o=m-n; } else if(m<n){ o=n-m; } // printf(" %d \n", o); if(a != b != c != d != e != f != g != h != i != j != k != l != m != n != o){ printf("%d %d %d %d %d\n", a, b, c, d, e); printf(" %d %d %d %d \n", f, g, h, i); printf(" %d %d %d \n", j, k, l); printf(" %d %d \n", m, n); printf(" %d \n", o); } } } } } } }

  • エクセルの条件範囲と合致したもの

    エクセルの条件範囲と合致したもの こんにちは。http://okwave.jp/qa/q5924759.htmlで質問していたのですが、 うまくいかないので、教えてください。 たとえば、同じシートで、 A1/B1/C1/D1・・・・・・←セル列 (スラッシュはセルだとします) A /1 /A /1 B /2 /B /2 D /3 /C E /4 /D /3 G /5 /E /4 I /6 /F / このように、列同士(A1の列とC1の列)が同じものがあった場合、A1の隣のセルであるB1のセルの数字をA4のセルに記載したい場合の数式を教えていただきたいです。D1に新たに追加されたものに関しては空白をしたいのです。 =IF(COUNTIF($A$1:$A$6,$C$1:$C$6)=0," ",IF(COUNTIF($A$1:$A$6,$C$1:$C$6)=1,B1)) この式を考えましたが、D1の列のDの部分の数字が"4"と記載されてしまい、本来なら"3"を 記載したいのですが、ずれてしまいます。 たぶん、条件の範囲のものとIFを合体させた数式になるのかなって思うのですが、 もし数式を教えていただければ幸いです。 何度も質問してすみません。。。よろしくお願いいたします。

  • 条件集計

    「条件式合計式」ウィザードを使って、3つの条件を与えた関数が以下のようになり、値が正しく返されるのですが、 自分で同じように記述しても、”{}”を記述すると関数と認識してくれません。 どうしてでしょうか。 {=SUM(IF($C$5:$C$2000=G5,IF($E$5:$E$2000=I4,IF($B$5:$B$2000=J3,$D$5:$D$2000,0),0),0))}

  • 条件付書式でMIN関数によるセルの色が

    いつもお世話になります。 WIN7 EXCELL2010 です。 添付図では 「K列 L列」のみ 最小値のセルに色が付きません。 A列~E列は手入力です。 それぞれのセルには F6 =IF(B6="","",SUM($B$6:B6)/$M6) G6 =IF(OR(B6="",C6=0),"",SUM($C$6:C6)/$M6) H6 =IF(D6="","",SUM($D$6:D6)/$O6) I6 =IF(OR(D6="",E6=0),"",SUM($E$6:E6)/$O6) J6 =IF(A6="","",INT((DAY(A6)+WEEKDAY($A$6,1)+5)/7)) K6 =SUM(B6,D6) L6 =SUM(C6,E6) M6 =IF(B6="","",COUNT($B$6:$B6)) N6 =IF(OR(K6="",L6=0),"",SUM($K$6:K6)/Y6) O6 =IF(D6="","",COUNT($D$6:$D6)) Y6 =IF(OR(K6=0,L6=0),"",COUNT($K$6:$K6)) K列の条件付書式には =K6=MIN($K$6:$K$32) L列を除く他の列は列こそ違え同じです。 なぜか K L列のみうまくゆきません。 どこかに不具合があってうまくゆかないんでしょうか。 恐れ入りますが御指導願えませんか。 よろしくお願いします。

  • 自動連番号について

    自動連番号について いつもお世話になります。 Windows XP EXCELL2003 です。 タイトルバーの各セルの色づけの意味は A B C D バックが黄色は数式入りでロックがかかっています。 E F G H その都度手入力です。 当然ロックはかかっていません。 A列は自動で連番をしています。 B列は「重複」表示をしている以外は値がない空白です。 A B C Dの各列には数式及び条件付書式が以下のようにあります A2 =IF(E2="","",COUNTA($E$2:E2)) B2 =IF(OR(COUNTIF($F$2:F2,F2)>1,COUNTIF($K$2:K2,K2)>1),"重複","") 条件付書式  値に等しい =”重複” C2 =MID(I2,1,1) D2 =MID(F2,1,1)&MID(F2,2,1) I2  =PHONETIC(G2) 以上です。 ここでご相談若しくはご指導を仰ぎたいのは B列に 「重複」とされた所は連番を飛ばしたいのですが何かいい方はないでしょうか。 例えは A2 0001 A3 A4 0002 A5 0003 という具合になれば良いのですが。 よろしく御願いします。

専門家に質問してみよう