• ベストアンサー

excel subproduct 関数での不具合

生物実験で、シグナルをカウントし、その個数をDCOUNT、SUBPRODUCTを使って、分類していま。具体的には、一つの細胞に緑のシグナルが10個、赤のシグナルが20個、青のシグナルが30個、次の細胞には緑が15個、赤が20個、青が2個と細胞を順次数えていきます。 A B C D E 1細胞 緑 赤 青 個数 2 10 20 30 3 15 20 2 4 そこで、緑が5個以上、赤が10個以上、青が20個以上の細胞の個数は、SUBPRODUCT(($A$2:$AB$1000>=5)*($B$2:$B$1000>=10)*($C$2:$C$1000>=20))として求めてきました。 今回、シグナルのパターンで1個ずつバラバラにあるのと、シグナルが5個、10個と塊である分を生物学的に分けなければならなくなりました。 具体的には、20個のシグナルがある場合、それが一つずつバラバラである場合は、20とそのまま、5個の塊が1つ、10個の塊が1つ、そして、バラバラに5個がある場合は、5c+10c+5のように記載します。 塊がある分は、別途、集計するのですが、今までと同じように表で5c+10c+5と記載した分も、cを除いて、5+10+5=20として、緑が5個以上、赤が10個以上、青が20個以上の細胞の個数を求めたいのですが、F2=SUBSTITUTE(A2、"c"、"")として、あらたに変換しても、数式ではないので、5+10+5と文字として標識されるだけだし、これをVALUEで、式に戻るかと考え、VALUE(SUBSTITUTE(A2、"c"、""))としてもエラーとなります。 何か良い方法は無いのでしょうか? と前回質問し 標準モジュールに Function eval(s As String) eval = Evaluate(s) End Function を用意。セルに =eval(SUBSTITUTE(A2,"c","")) 回答を頂きました。 そして、excelでtool、macro、VBEとして、insertからmoduleとして、 Function eval(s As String) eval = Evaluate(s) End Function を入力しました。 そして、D2=eval(SUBSTITUTE(A2,"c",""))と入力すると上手く行かず、PERSONAL.XLS!eval(SUBSTITUTE(A2,"c",""))としたら、うまく行きました(どこかで、入力手順がおかしかったのでしょうか...)。さらに、空白セルに###とでるのを嫌い、=IF(A2="","",PERSONAL.XLS!eval(SUBSTITUTE(A2,"c","")))としました。これをD、E、F列に1から1000までコピー、ペーストしました。A、B、C列をそれぞれ、D、E、F列に返還して計算しました。これを用いて、Dが2個以上、F、Fが4個以上を =SUBPRODUCT(($D$2:$D$1000>=2)*($E$2:$E$1000>=4)*$F$2:$F$1000>=4))で求めると、個数が異様に多くなります。 おそらく、D、E、F列に上記のIF関数を用いてることが影響しているのだと思いますが、何かよい回避方法は無いでしょうか?

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

  • ベストアンサー
回答No.1

質問の要点をもっと短くまとめた方が回答がより多くつくと思うのですが・・・ >さらに、空白セルに###とでるのを嫌い、=IF(A2="","",PERSONAL.XLS!eval(SUBSTITUTE(A2,"c","")))としました 未入力のセルは「0」と同値ですが「""」は長さ0の文字列です。文字列なので数字より大きくなり、 >=SUBPRODUCT(($D$2:$D$1000>=2)*($E$2:$E$1000>=4)*$F$2:$F$1000>=4))で求めると、個数が異様に多くなります。 という結果を招きます。たとえば「=(""<9999)」という式をセルに入れてみれば判ります。 対応としては、 =IF(A2="",0,PERSONAL.XLS!eval(SUBSTITUTE(A2,"c",""))) として、必要なら書式設定で「0」を非表示にしてみてください。

excelganba
質問者

お礼

要点がまとまっていず、申し訳ありませんでした。 ご返答ありがとうございました。 うまく行きました。

その他の回答 (3)

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.4

解答No3です。 いろいろなケースがあるとのことがよく知りませんでした。お示しの場合でも適応できる式としてD2セルに入力する式としては次のようにしてください。 =IF(AND(LEN(A2)<=3,ISNUMBER(SUBSTITUTE(A2,"c","")*1)),SUBSTITUTE(A2,"c","")*1,IF(ISNUMBER(LEFT(SUBSTITUTE(A2,"c",""),2)*1),LEFT(SUBSTITUTE(A2,"c",""),2)*1,LEFT(SUBSTITUTE(A2,"c",""),1)*1)+IF(ISNUMBER(MID(SUBSTITUTE(A2,"c",""),FIND("+",SUBSTITUTE(A2,"c",""))+1,2)*1),MID(SUBSTITUTE(A2,"c",""),FIND("+",SUBSTITUTE(A2,"c",""))+1,2)*1,MID(SUBSTITUTE(A2,"c",""),FIND("+",SUBSTITUTE(A2,"c",""))+1,1)*1)+IF(ISNUMBER(RIGHT(SUBSTITUTE(A2,"c",""),2)*1),RIGHT(SUBSTITUTE(A2,"c",""),2)*1,RIGHT(SUBSTITUTE(A2,"c",""),1)*1)) なお、SUMPRODUCT関数で<>""と使っていますのは空白でない場合という意味で使っています。データの入力のない行は除くということになります。 ISNUMBER(範囲)でも間違ってはいませんね。

excelganba
質問者

お礼

情報を適切に表現できていず、申し訳ありませんでした。 長い式にも関わらずきっちり教えて頂き、ありがとうございました。 今回は勉強になりました。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.3

ちょっと気になるのですがSUBPRODUCTという関数はないでしょう。SUMPRODUCT関数の間違えですね。 ところで前の戻って恐縮ですが5c+10c+5のような結果が入力されていてそれの合計を出すのに苦労されているようですが、すべて関数で処理するようにしてはどうでしょう。A列が緑、B列が赤、C列が青、D列が合計になっていますがD列には修正後の緑、E列には修正後の赤、F列には修正後の青が関数でcの入ったデータを含めて数値として表示させるようにします。 それにはD2セルに次の式を入力してF2セルまでオートフィルコピーしたのちに下方にもオートフィルドラッグします。 =IF(A2="","",IF(ISNUMBER(A2),A2,(IF(ISNUMBER(LEFT(A2,2)*1),LEFT(A2,2)*1,LEFT(A2,1)*1)+IF(ISNUMBER(MID(A2,FIND("+",A2)+1,2)*1),MID(A2,FIND("+",A2)+1,2)*1,MID(A2,FIND("+",A2)+1,1)*1)+IF(MID(A2,LEN(A2)-1,1)="+",LEFT(A2,1)*1,LEFT(A2,2)*1)))) なお、この式では取り扱われている数値はすべて100以内の数値であるとしています。 そこでSUMPRODUCT関数ですがたとえば次のような式にすればよいでしょう。 =SUMPRODUCT(($D$2:$D$1000<>"")*($D$2:$D$1000>=5)*($E$2:$E$1000>=10)*($F$2:$F$1000>=20)) 最初に<>""を使うことでセルを""で空にしても問題はありません。

excelganba
質問者

お礼

ご返答ありがとうございました。 関数名が間違っていて申し訳ありませんでした。 5c+10c+5では20なるのですが、2c+5c+5では9、10c+2c+3cでは22、3cでは#valueとなってしまいます... しかし、このようにして、数字を抽出する方法があるのを教えて頂き、誠にありがとうございました。 パズルみたいでむつかしいですネ またSUMPRODUCT関数で、(範囲<>"")*はうまく行きましたが、勉強のためにどのような意味なのか調べましたが、分かりませんでした。もし宜しければ、教えて頂けないでしょうか? 調べると、同じような場合で=SUMPRODUCT(ISNUMBER(範囲)*。。。とする方法を見つけました。

回答No.2

文字を一度分解しないと式が長くなります。 0以上の数値が3つ含まれていることが条件としています。 A2=5c+10c+5とします。 F2=SUBSTITUTE(A2,"c","")=5+10+5 G2=MID(A2,1,SEARCH("+",F2,1)-1)=5 H2=MID($F2,SEARCH("+",F2,1)+1,SEARCH("+",$F2,SEARCH("+",$F2,1)+1)-(SEARCH("+",F2,1)+1))=10 I2=MID($F2,SEARCH("+",$F2,SEARCH("+",$F2,1)+1)+1,LEN(F2)-(SEARCH("+",$F2,SEARCH("+",$F2,1)+1)))=5 J2=G2+H2+I2=20 これでどうでしょうか?

excelganba
質問者

お礼

ご返答ありがとうございました。 実験結果は、数字だけや10cだけのように数値の個数にバリエーションがあるんです... しかし、このようにして、数字を抽出する方法があるのを教えて頂き、誠にありがとうございました。

関連するQ&A

  • excel 文字の計算

    生物実験で、シグナルをカウントし、その個数をDCOUNT、SUBPRODUCTを使って、分類していま。具体的には、一つの細胞に緑のシグナルが10個、赤のシグナルが20個、青のシグナルが30個、次の細胞には緑が15個、赤が20個、青が2個と細胞を順次数えていきます。 A B C D E 1細胞 緑 赤 青 個数 2 10 20 30 3 15 20 2 4 そこで、緑が5個以上、赤が10個以上、青が20個以上の細胞の個数は、SUBPRODUCT(($A$2:$AB$1000>=5)*($B$2:$B$1000>=10)*($C$2:$C$1000>=20))として求めてきました。 今回、シグナルのパターンで1個ずつバラバラにあるのと、シグナルが5個、10個と塊である分を生物学的に分けなければならなくなりました。 具体的には、20個のシグナルがある場合、それが一つずつバラバラである場合は、20とそのまま、5個の塊が1つ、10個の塊が1つ、そして、バラバラに5個がある場合は、5c+10c+5のように記載します。 塊がある分は、別途、集計するのですが、今までと同じように表で5c+10c+5と記載した分も、cを除いて、5+10+5=20として、緑が5個以上、赤が10個以上、青が20個以上の細胞の個数を求めたいのですが、F2=SUBSTITUTE(A2、"c"、"")として、あらたに変換しても、数式ではないので、5+10+5と文字として標識されるだけだし、これをVALUEで、式に戻るかと考え、VALUE(SUBSTITUTE(A2、"c"、""))としてもエラーとなります。 何か良い方法は無いのでしょうか?

  • エクセルについて

      A  B  C  D  E 1 赤  青  黄  緑   2    ○        青 3       ○     黄 4 ○           赤 5       ○     黄 以上のような表からE2~E5のセルに同一行の○が付いた名前を出したいのですがどのような関数を使用すればいいのでしょうか。宜しくお願いいたします。

  • EXCELの関数について教えてください。

         A      B    C    D    E    F 1   氏名   お皿白 お皿赤 お皿青 お皿緑   2   佐藤    ●    ●         ● 3   伊藤    ●         ● 4   山田          ●    ● 5   木村    ●    ●         ● 6   内藤    ●         ●    ● 7    上記のような表で、佐藤さんはお皿白、赤、緑を、伊藤 さんはお皿白、青を注文しています。 B7のセルに「お皿白」を注文しているのが佐藤、伊藤、 木村、内藤と表示されるようにしたいのですが、可能で しょうか? もし出来るなら教えてください。お願いします。 OSはWIN98 EXCELは2000です。

  • Excelでの文字列編集(再質問です)

    Excel2003での再質問です。 今、A列~E列に以下の文字が入っています。 A  B  C  D  E 1あ い う え お  2あ   う 上記の内容を「・」で区切りを入れて、F列に結合させたいのですが  F 1あ・い・う・え・お 2あ・う この質問に対しては、以下のご回答をいただき、解決することが出来ました。 =SUBSTITUTE(TRIM(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1&B1&C1&D1&E1,A1,A1&" "),B1,B1&" "),C1,C1&" "),D1,D1&" "))," ","・") このたび、3列増やし、A~Hまでの計算式を以下で行ったところ、 =SUBSTITUTE(TRIM(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1&B1&C1&D1&E1&F1&G1&H1,A1,A1&" "),B1,B1&" "),C1,C1&" "),D1,D1&" "),E1,E1&" "),F1,F1&" "),G1,G1&" "))," ","・") 計算式がエラーとなります。ご教示いただけますでしょうか? よろしくお願いします。

  • Excel置換関数を用いて複数の文字列を置換したい

    上手く置換ができずに困っています。よろしくお願いします。 文字を入力した列の隣に、数値化する列を作成しようと思っています。 置換項目を6つ設定しようと思っているのですが、 A=4 B=3 C=2 D=1 E=0 F=0 の条件です。 =SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A2,"A","4"),"B","3"),"C","2"),"D","1"),"E","0"),"F","0") これではできませんでした...。 どなたか、わかる方がいらっしゃいましたら、ご教授願います。

  • SUMIFの関数で合計を合算したいのです。

      A   B     C    D    E    F    1 赤 300円  青 200円  赤   ---円 2 青 100円  青 400円  青   ---円 3 赤 100円  赤 100円   合計  ---円  の表でF1の赤計の演算式をAとBの列だけなら =SUMIF(A1:A3,E1,B1:B3)で赤400円と出来るのですが CとDの合計もF1に出したいので赤の計500円としたいのですが 無知なので=SUMIF(A1:A3,E1,B1:B3)+(C1:C3,E1,D1:D3)としたらダメでした。 列の分かれたBとDの赤合計をF1に合算して出すには どういう演算式にしたらいいのか教えて下さい。 宜しくお願い致します!   

  • エクセルの関数での処理方法

    下記のようなデーターベースがあります  列 A   B   C  D   E    F 行  4/1 4/10 4/20 1   青  100 青 1100 青 11000 2  黄色  200 黄色 1200 黄色 12000 3 緑  300 緑 1300 緑 13000 4  赤  400 赤 1400 赤 14000 5  紫  500 紫 1500 紫 15000 6  黒  600 黒 1600 黒 16000 7  白  700 白 1700 白 17000 8  茶  800 茶 1800 茶 18000 9  水色  900 水色 1900 水色 19000 10 朱色 1000 朱色 2000 朱色 20000 上の図では分かりにくいかも知れませんが、 A列には上から4/1、青、黄・・・ B列には上から空白、100、200・・・  C列には上から4/10、青、黄・・・ D列には上から空白、1000、2000・・・  E列には上から4/20、青、黄・・・ F列には上から空白、10000、20000・・・と並んでます。 4/1の項目は4/9までの値段 4/10の項目は4/19までの値段 4/20の項目は4/30までの値段になります。 4/5、4/10/、4/15、4/25の白の値段を調べるにはどのようにすればいいでしょうか? 4/5、4/10、4/15、4/25のそれぞれに VLOOKUP関数の式を入れて調べるんではなく ひとつの式を入れて調べる日付のセルの値だけが 変わるだけで 全部同じ式で反映されるようにしたいんですが・・・ できますか? VOOLUP関数やIF関数を組み合わせてやってるんですが うまくいきません。 それともマクロでないとできないですか? よろしくお願いします。

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

    現在ある表を元に、見積書を作っています。 すごい効率が悪く、困っています。 A1~G3に表があります。(実際にはもっと多いです) 1行目に商品名 2行目に金額 3行目に個数 G3 に合計 1・2行目は、元々商品名・金額が入っており 3行目に個数を入れていきます。 G3に合計が入るようにしています。 B2、350円  C2、320円  D2、400円  E2、500円  F2、550円  G2 B3、 1    C3、      D3、 1    E3、       F3、      G3、750円  (現在のG3に入っている数式) =F3*F2+E3*E2+D3*D2+C3*C2+B3*B2 項目が多い為、数式がすごい事になっています。 もっといい方法はないでしょうか? わかる方おられましたら、教えて頂けませんか? よろしくお願いします。

  • エクセルの、関数教えてください!

    エクセルで、下記の様な表を作っています。 1 氏名(A)  期間(B)  A金額(C)   3ヶ月未満(D)   3ヶ月以上(E)   B金額(F) 2  赤     3ヶ月以上   5000     2000         4000(E-2)   5000(F-2) 3  黄     3ヶ月未満   8000     3000(D-3)      5000       2000F-3) 期間が、3ヶ月以上の場合間E2列の金額とF2の列の金額を比較して、オーバーしていたらセルに、カラー表示する様にしたいのです。 また、3ヶ月未満の場合はD3とF3を比較してオーバーしたらカラー表示。 誰か、教えてください。よろしくお願いします

  • エクセルの関数について教えてください

    こんにちは。 エクセル関数について教えてください。 (OS:WIN2000、エクセル2003) こんな表があって、別のシートの A1=200 A2=D A3=2・・・1行目D列の項目 と入力したときに A4に「はな」と表示させたいのですが Index関数とMatch関数の組み合わせだと思うんですが どうしたらいいですか? A列 B列 C列 D列 E列 1行 --- --- 1 2 3 2行 100 A いぬ くり 赤 3行 200 B ねこ いも 青 4行 300 C ぞう ねぎ 緑 5行 200 D とら はな 黄 6行 100 E うし みそ 朱 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・

専門家に質問してみよう