• 締切済み

sumproductの複数条件

=SUMPRODUCT((貼り付け用!$J$2:$J$15000="3")*(貼り付け用!$K$2:$K$15000={"3","4","5","6","7","8","9"})*(貼り付け用!$I$2:$I$15000={"通過","NG"}))とやると#N/Aと表示されますが、何が間違っているのでしょうか?

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

質問には、式だけ書くのでなく、そのやろうとしている内容・意味も併せて書いておくべきだと思う。 何万人の読者が、判っても、そうでなくても、読まされる仕組みだから。 ーー J列が3、  (A) K列が3から9 (B) I列が通過"か"NG (C) の3つをAND条件で判定したいということかと思う。 ーー Aは該当が1つの値で問題ないとして、比較値が複数の場合、配列では表現させてくれないようだ。 Bはたまたま連続値で(3より大)*(9より小)で2項に分ければよい。 cはOR条件なので、1つ1つ判別し、両者を加えて、全体を()で囲って1項の扱いにする。 指定の値が何十何百になれば式に書いてられないが10個ぐらいまでなら、列挙する方法があると、都合が良いと思うが、無いようだ。今回の既出ご回答の面々はエキスパートの方ばかりだが、解決策は上がってないようだ。 ーー 配列数式の場合 F列にデータがあるとしてF1:F10 通過 あ い 通過 NG あ NG 通過 う え ーー VLOOKUP用の検索表 J1:J2 通過 NG K1:K10を範囲指定して =IF(ISERROR(VLOOKUP(F1:F10,$J$1:$J$2,1,FALSE)),0,1) を入れて、SHIFT,CTRL,ENTERを押すと 結果 1 0 0 1 1 0 1 1 0 0 こういうのが使えないかと思ったが、まだ小生では未消化。 VLOOKUPの代わりにMATCH関数でも同じか。 配列数式やSUMPRODUCTは行数が増えると処理が重たくなるようなので その方面からは、即時反映を犠牲にしても、VBAでやることも考えられる。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 数字は、可変型だから、あえて、文字を入れなければ、引数は数値のままで良いはずです。また、数値を、文字列型の書式にしておくと、別の問題が発生します。だから、数値は数値して扱ったほうがよいです。 =SUMPRODUCT((貼り付け用!$J$2:$J$15000=3)*(貼り付け用!$K$2:$K$15000>=3)*(貼り付け用!$K$2:$K$15000<=9)*((貼り付け用!$I$2:$I$15000="通過")+(貼り付け用!$I$2:$I$15000="NG"))) なお、こういう数式で、15000行を使うなら、出来れば、データベース関数のほうがよいと思います。数式が軽くなります。また、この数式は、バージョンに依存します。

全文を見る
すると、全ての回答が全文表示されます。
noname#176215
noname#176215
回答No.2

「"3"」となっていますが J列や K列の数字は文字列なのですか? もし数値なら「""」は不要です。 それより気になるのは データ範囲です。もし本当に 15000行にデータが 埋まる可能性があるなら この数式は全く適していません。 重すぎて使い 物にならないでしょうから。 > 何が間違っているのでしょうか? 乗算している配列の数が一致しません。 =SUMPRODUCT(($J$2:$J$15000&$K$2:$K$15000={"33","34","35","36","37","38","39"}) *(($I$2:$I$15000="通過")+($I$2:$I$15000="NG"))) フリーズする可能性を考えるなら 範囲を減らした方がいいです。 あと 早い段階で数式と表を見直すことをお勧めします。

全文を見る
すると、全ての回答が全文表示されます。
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.1

配列の大きさが相違する為です。 貼り付け用!$K$2:$K$15000={"3","4","5","6","7","8","9"}はn行×7列、貼り付け用!$I$2:$I$15000={"通過","NG"}はn行×2列になるからです。 仮に数式を成立させたいのであれば、"通過"、"NG"で数式を2つに分けて加算したら如何でしょうか。 SUMPRODUCT((貼り付け用!$J$2:$J$15000="3")*(貼り付け用!$K$2:$K$15000={"3","4","5","6","7","8","9"})*(貼り付け用!$I$2:$I$15000="通過")) + SUMPRODUCT((貼り付け用!$J$2:$J$15000="3")*(貼り付け用!$K$2:$K$15000={"3","4","5","6","7","8","9"})*(貼り付け用!$I$2:$I$15000="NG"))

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SUMPRODUCT関数を使った条件分岐ができない

    エクセル2010を使っておりますが、IFとSUMPRODUCTを使った関数のことで伺います。 旅費の精算をしておりまして、I列に氏名、J列に出発日、K列に到着日が入っております。 (1行と1つの出張について入力してあります) 同じ氏名で、他の出張と出発日又は到着日が一部、又は全部重なる場合は「重複」、帰ってきた翌日から出張の場合は「連日」、両方の条件を満たすときは「重複、連日」と表示されるようにしたく、以下の関数式を組みました。 しかし、「重複、連日」と「連日」がうまく表示されません。 連日に関しては、I列に氏名が複数入力されていれば表示されてしまいます。 どこをどう直せば、意図するように表示されるのか、教えていただけないでしょうか。 長文の関数で大変申し訳ないのですが、よろしくお願いいたします。 =IF(AND(SUMPRODUCT((I$6:INDEX(I:I,1000)=I6)*(J$6:INDEX(J:J,1000)<=K6)*(K$6:INDEX(K:K,1000)>=J6))>1,OR(SUMPRODUCT((I$6:INDEX(I:I,1000)=I6)*(K$6:INDEX(K:K,1000)=J6-1))>=1,SUMPRODUCT((I$6:INDEX(I:I,1200)=I6),(J$6:INDEX(J:J,1200)>=K6+1))>=1)),"重複、連日",IF(SUMPRODUCT((I$6:INDEX(I:I,1000)=I6)*(J$6:INDEX(J:J,1000)<=K6)*(K$6:INDEX(K:K,1000)>=J6))>1,"重複",IF(SUMPRODUCT((I$6:INDEX(I:I,1000)=I6)*OR((K$6:INDEX(K:K,1000)=J6-1),(J$6:INDEX(J:J,1000)>=K6+1)))>1,"連日","")))

  • エクセル IF関数 条件を満たす行に印をつける

    A1:J30までにランダムな数値が入力されている表があります。M1:N4には検索値を入力できる箇所があり、条件に該当する行があればK列に○を付ける、ということがしたいです。その条件は、 (1)M1かN1に該当する (2)M2かN2に該当する (3)M3かN3かM4かN4に該当する この3条件のすべてを満たす行があればK列に○です。 いろいろ調べて、IF関数とsumproductを組み合わせてやってみたのですが、正しい結果にならずお手上げ状態です。(ちなみにこれ↓長すぎなのもネック。。。) =IF(AND(SUMPRODUCT((A1:J1=$M$1)+(A1:J1=$N$1))>=0,SUMPRODUCT((A1:J1=$M$2)+(A1:J1=$N$2))>=0,SUMPRODUCT((A1:J1=$M$3)+(A1:J1=$N$3)+(A1:J1=$M$4)+(A1:J1=$N$4)>=0)),"○","") IF関数でなくてもできれば何でも良いので、教えてください。 よろしくお願いいたします。

  • SUMPRODUCT関数の使い方

    いつもお世話になっております。SUMPRODUCT関数の使い方が解らず困っています。 どなたか、教えてください。 I列(3~1034)に101と入力されており、F列(3~1034)に○と入力されているセルの数を数えたくて、 SUMPRODUCT関数を使いましたが、答えが0になるか、NAME?になるかで、正答が表示されません。 関数が苦手なので、SUMPRODUCTは、関数の表示ダイアログボックスを使って作成しています。 すると、配列1、配列2、配列3と出てくるので、 配列1に I3:I1034=101 配列2に F3:F1034=○ (絶対参照して)入力すると =SUMPRODUCT($I$3:$I$1034=101,$F$3:$F$1034=○) となり、答えは #NAME? と出てしまいます。 また、やり方が解らないのですが、他の質問の回答をみて、SUMPRODUCT関数を手入力し、 =SUMPRODUCT(($I$3:$I$1034=101)*($F$3:$F$1034=○)) と修正入力すると、答えは 0 になってしまいます。 (だいたい、どうして * が出てくるのかも理屈が解りません。) 101や○を””でくくっても、うまくいきません。 もはや何がどう良くないのかわかりません(泣) どなたか、素人の私にも解るようにご解説お願いいたします。

  • エクセルのSUMPRODUCT関数についての質問

    SUMPRODUCT関数を使って、1列おきにカウントさせる式をつくっていて、 セルの指定方法について疑問をもちましたので質問させていただきます。 A1からJ1に数字がはいっているとして、偶数列だけカウントします。 =SUMPRODUCT((MOD(COLUMN(A:J),2)=0)*(A1:J1<>0)) =SUMPRODUCT((MOD(COLUMN(A:J),2)=0)*((A1:J1)<>0)*1) 上の式で答えはでるのですが、*以降の指定の違いがわかりません。 どなたかお分かりになる方おられましたら、よろしくお願いします。

  • ピボット選択がどのように行われてるか確かめたいので

    ピボット選択がどのように行われてるか確かめたいので 関数pivotを呼び出す前と呼び出して式を入れ替えた後のakk,ak+1k,...,ankを調べたいのですが どうすればいいのでしょうか? int gauss(double *x, double *a, double *b, int n) { int i,j,k; double tmp,p,sum; /* step 1: 前進消去 */ for(k=0; k<n-1;k++){ printf("---- Step %d ----\n",k+1); /* ピボットの選択 */ /*** 追加(2):ピボット選択前,選択して式を入れ替えた後それぞれの * a(k,k), a(k+1,k), ... , a(n-1,k) * を表示して,ピボット選択がどのように行なわれたか調べる. ***/ /*--- ピボット選択前の位置 ---*/ printf("-- before --\n"); /* a(k,k), a(k+1,k), ... , a(n-1,k) を表示させる.*/ /*----------------------------*/ j = pivot(a,n,k); /* j: ピボットとして選ばれたa(j,k)の行番号 */ if(j == ERROR) { return ERROR; } else { if(j != k) { /* ピボットにはa(k,k)ではなくa(j,k)が選ばれた.式の入れ替えが必要 */ /* Aのk行とj行の入れ替え.*/ for(i=0; i<n; i++){ tmp = a[n*k+i]; a[n*k+i] = a[n*j+i]; a[n*j+i] = tmp; } /* b[k] と b[j] の入れ替え */ tmp=b[j]; b[j]=b[k]; b[k]=tmp; } } /*--- ピボット選択をし,式の入れ替えをした直後の位置 ---*/ printf("-- after --\n"); /* a(k,k), a(k+1,k), ... , a(n-1,k) を表示させる. /*------------------------------------------------------*/ /* x[k] の消去 */ for(i=k+1; i<n; i++){ p=a[n*i+k]/a[n*k+k]; for(j=0; j<n; j++){ a[n*i+j]=a[n*i+j]-p*a[n*k+j]; printf("a[%d %d]=%lf",i,j,a[n*i+j]); } b[i]=b[i]-p*b[k]; printf("b[%d]=%lf\n",i,b[i]); } /*--- 追加(1):第k段によって x[k] を消去した後の,各式の状態を表示する. ---*/ /* a(1,1),a(1,2),...,a(1,n),b(1); a(2,1),a(2,2),... a(2,n),b(2), ... */ printf("k=%d\n",k); /*--------------------------------------------------------------------------*/ }/* step 2: 後退代入 */ for(k=n-1; k>=0; k--){ if(fabs(a[n*k+k]) < EPS) return(ERROR); sum=0.0; for(j=k+1; j<n; j++) sum+=a[n*k+j]*x[j]; x[k]=(b[k] - sum)/a[k*n+k]; } return 0; } int pivot(double *a, int n, int k) { int i,m; double d; /* ピボットの探索 */ m = k; d = fabs(a[k*n+k]); for(i=k+1; i<n; i++){ if(fabs(a[n*i+k]) > d){ m = i; d = fabs(a[n*i+k]); } } if(fabs(d) < EPS) { return ERROR; } else { return m; } }

  • SUMPRODUCTについて

    A~Dのデータがすべて一致したらE列を合計する関数をつくりました。 C列にはVLOOKUP関数が入っており、合計のE列にもただの足し算が入っております(#N/Aと出てるデータもあります)。 別シートに =SUMPRODUCT((マスター!A2:A100="10A")*(マスター!B2:B100="H")*(マスター!C2:C100="A5")*(マスター!D2:D100=8)*マスター!E2:E100) と入れたら#N/Aと出ます。 条件範囲のエラー値をどうにかしなければだめなのでしょうか? それとも根本的に数式が間違ってるのでしょうか? よろしくお願いいたします。

  • SUMPRODUCT関数について

    こんにちは! ついさっきですが、AとBとCとDを数える方法を質問したところ、 =SUMPRODUCT((A1:A10={"a","b","c","d"})*1) という回答を頂きまして、それは解決したのですが その範囲をB4:M4にしたとたん、エラー#N/Aになりました なぜでしょうか?

  • 複数回答×複数回答のクロス集計について

    複数回答×複数回答のクロス集計を行いたく、質問番号:1198621で回答者様が提案されているEXCEL関数「SUMPRODUCT」「INDIRECT」を用いた方法を行ったのですが上手くいきません。 どうかお知恵をお貸しください。 エクセルの作業画面を添付します。 問題点 「問A-1×問B-1」や「問A-2×問B-2」というように同じ選択番号の組み合わせは数値が出るのですが「問A-1×問B-2」といったものは♯VALUEと表示されます。 数式は「=SUMPRODUCT(INDIRECT(K$1&"2:"&K$1&"50"),INDIRECT($J2&"2:"&$J2&"50"))」 となっています

  • 上三角行列の解を出力するプログラム

    /*下記のプログラムで”1回目”という部分以降の繰り返し計算がうまくいきません.エラーは出ませんが,何が間違っているか,お気づきの点を教えてください,よろしくお願いします(..) */ #include <stdio.h> #include <stdlib.h> #include <math.h> int main(){ FILE *fp; //*fp fopen("kadai2.dat","w"); //数値結果エラー表示 if((fp=fopen("kadai2.dat","w"))==NULL){ printf("error\n"); exit(1); } int i,j,k; double r=2,ta=1000,tb=0;//r,ta,tb const int N=10;//N const int T=1;//N const int m=N-1;//mは(N-1)とりあへず一定にしないと定まらないみたい const int n=N-1;//n=N-1 とりあへず一定にしないと定まらないみたい const int t=T;//n=N-1 とりあへず一定にしないと定まらないみたい //行列定義aa,xx double a[m+2][n+2],**aa,a1,x1; double x[n+2][t],**xx; aa=( double **) malloc((unsigned) m*sizeof(float*)); for(i=0;i<=m-1;i++){ aa[i]=a[i]; } xx=( double **) malloc((unsigned) n*sizeof(float*)); for(i=0;i<=n-1;i++){ xx[i]=x[i]; } //xx[n][t]初期化 x[0][],x[10][]以外 for(i=1;i<=n+1;i++){ x[i][0]=0; } //huyou double b[n+2][t],**bb; bb=( double **) malloc((unsigned) m*sizeof(float*)); for(i=0;i<=m-1;i++){ bb[i]=b[i]; } //************************************ 入れなおしでx完成 //kの繰り返し開始 for(k=0;k<=T;k++){ //aaに初期値 初期化 for(j=0;j<=N;j++){ for(i=0;i<=N;i++){ a[j][i]=0; } } //aaに値代入 for(i=0;i<=N-1;i++){ a[i][i]=1+2*r; a[i+1][i]=-r; a[i][i+1]=-r; } //xx[n][t]初期化 x[0][],x[10][] x[0][k]=ta; x[10][k]=tb; //xx[n][t]値代入 j x[1][k]=x[1][k]+r*x[0][k]; x[N-1][k]=x[N-1][k]+r*x[10][k]; //************************************計算部 //printf("*********************** %d\n",k); //1回目 for(j=1;j<=N-2;j++){ for(i=1;i<=N-1;i++){ a[j+1][i]=a[j+1][i]-a[j][i]*a[j+1][j]/a[j][j]; } x[j+1][k]=x[j+1][k]-x[j][k]*a[j+1][j]/a[j][j]; } for(j=1;j<=N-1;j++){ for(i=1;i<=N-1;i++){ printf("%4.2fl",a[j][i]); } printf("\n"); } //2回目 for(j=1;j<=N-2;j++){ for(i=1;i<=N-1;i++){ a[N-1-j][i]=a[N-1-j][i]-a[N-j][i]*a[N-1-j][N-j]/a[N-j][N-j]; } x[N-1-j][k]=x[N-j-1][k]-x[N-1-j][k]*a[N-1-j][N-j]/a[N-j][N-j]; } //3回目 for(i=1;i<=N-1;i++){ x[i][k]=x[i][k]/a[i][i]; } //答え出てきたら //ファイルに結果放り込む※時間変化表示 n x t for(i=0;i<=N;i++){ fprintf(fp,"%d %10.5fl %d\n",i,x[i][k],k); //printf("%d %10.7g %d\n",i,x[i][k],k); } //出てきたxを次の時間用に入れなおし for(i=0;i<=8;i++){ x[i][k+1]=x[i][k]; } }//kの繰り返し終了 fclose(fp); return 0; }

  • ループの終了条件について。

    すいません。もう1問質問したかったのですが 800字以上になってしまいましたので再度質問します。 2つの整数i,jを入力し、iをjで割った商と余りを出力するプログラム。 条件1・・・jに0が入力された場合は"0では割れません"と表示し、割り算を実行しないようにする事。 条件2・・・余りが0の時は商のみを表示すること。 条件3・・・このプログラムはi,jともに0を入力するまで繰り返されるようにすること。 #include <stdio.h> main() {      int i,j,k,l;      do      {           printf("整数i:");           scanf("%d",&i);           printf("整数j:");           scanf("%d",&j);           if(j==0)                printf("%d/%d=0では割れません \n",i,j);           else           {                k=i/j;                l=i%j;                if(i%j==0)                     printf("%d/%d=%d \n",i,j,k);                else                     printf("%d/%d=%d余り%d \n",i,j,k,l);          }      }while(!(i==0) && !(j==0)); } これで実行してもiかjのどちらかに0を入力したら終わってしまいます。 両方0の時だけループ終了するとしているつもりなのですが・・・。 長々と質問してすいません。 教えていただけると助かります。m(-_-)m

専門家に質問してみよう