• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:難解 条件に合えば〇を付ける 関数 )

難解な条件を満たす関数の作成方法を教えてください

このQ&Aのポイント
  • 質問者は、4つのグループにおいて、特定の条件を満たす関数を作成したいと考えています。
  • 条件は、各グループに必ず1つ以上の特定の文字列が含まれることと、4つのグループに異なる特定の文字列が1つずつ含まれることです。
  • 質問者はすでに試みた方法がうまくいかなかったため、助けを求めています。

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

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

今更出すのもどうかと思いますが せっかく思いついたので…… =REPT("○",AND((LEN(SUBSTITUTE(MMULT((A2:P2>"")*(INT(COLUMN(D:S)/4)<>{1;2;3;4})*10^(MOD(COLUMN(D:S),4)),1^ROW($1:$16)),0,""))>2)*MMULT((A2:P2>"")*(INT(COLUMN(D:S)/4)={1;2;3;4}),1^ROW($1:$16)))) Ctrl + Shift + Enterで確定 久々に数式で楽しめました。ありがとうございます。

honeybeans
質問者

お礼

できました。すごく難しいですが、シンプルな数式にしていただいてありがとうございます。

その他の回答 (9)

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.9

回答No.7で論理式のチェック範囲について誤りが有りました。 また、4つのセルに"A"、"B"、"C"、"D"の何れも含まれないグループ内のチェックが漏れていました。 下記数式で再度試してください。 =IF(AND((SUMPRODUCT(N((COUNTIF(E2:H2,S$2:S$5)+COUNTIF(I2:L2,S$2:S$5)+COUNTIF(M2:P2,S$2:S$5))>0))>2)*SUMPRODUCT(COUNTIF(A2:D2,S$2:S$5)),(SUMPRODUCT(N((COUNTIF(A2:D2,S$2:S$5)+COUNTIF(I2:L2,S$2:S$5)+COUNTIF(M2:P2,S$2:S$5))>0))>2)*SUMPRODUCT(COUNTIF(E2:H2,S$2:S$5)),(SUMPRODUCT(N((COUNTIF(A2:D2,S$2:S$5)+COUNTIF(E2:H2,S$2:S$5)+COUNTIF(M2:P2,S$2:S$5))>0))>2)*SUMPRODUCT(COUNTIF(I2:L2,S$2:S$5)),(SUMPRODUCT(N((COUNTIF(A2:D2,S$2:S$5)+COUNTIF(E2:H2,S$2:S$5)+COUNTIF(I2:L2,S$2:S$5))>0))>2)*SUMPRODUCT(COUNTIF(M2:P2,S$2:S$5)),SUMPRODUCT(N(COUNTIF(A2:P2,S$2:S$5)>0))>3),"○","") 結果的には回答No.6より複雑になっているかも知れません。

honeybeans
質問者

お礼

何度もありがとうございます。

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.8

>私のやり方がおかしいかもしれませんが、正しい結果にならないです。 論理式の誤りが有るかも知れませんので、再チェックのためにデータの配置を提示してください。 当方はExcel 2013です。 貼付画像のようなデータで検証しました。

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.7

回答No.6の数式改変です。 =IF(AND(SUMPRODUCT(N((COUNTIF(E2:H2,S$2:S$5)+COUNTIF(I2:L2,S$2:S$5)+COUNTIF(M2:P2,S$2:S$5))>0))>2,SUMPRODUCT(N((COUNTIF(A2:D2,S$2:S$5)+COUNTIF(I2:L2,S$2:S$5)+COUNTIF(M2:P2,S$2:S$5))>0))>2,SUMPRODUCT(N((COUNTIF(A2:D2,S$2:S$5)+COUNTIF(E2:H2,S$2:S$5)+COUNTIF(M2:P2,S$2:S$5))>0))>2,SUMPRODUCT(N((COUNTIF(A2:D2,S$2:S$5)+COUNTIF(E2:H2,S$2:S$5)+COUNTIF(M2:P2,S$2:S$5))>0))>2,SUMPRODUCT(N(COUNTIF(A2:P2,S$2:S$5)>0))>3),"○","") 前回の数式は論理式が複雑なのでシンプルな方法に変更してみました。 考え方としては4つのグループの内3つのグループに"A"、"B"、"C"、"D"の内3種類以上含まれるか否かをチェックします。 組み合わせは4種類です。 グループ2とグループ3とグループ4(グループ1を除く) グループ1とグループ3とグループ4(グループ2を除く) グループ1とグループ2とグループ4(グループ3を除く) グループ1とグループ2とグループ3(グループ4を除く) すべての組み合わせで3種以上の検出が有れば"○"とします。 他に全グループ一括でチェックし、4種類が含まれていることも論理式に含めます。

honeybeans
質問者

補足

私のやり方がおかしいかもしれませんが、正しい結果にならないです。

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.6

回答No.2の訂正です。 回答No.3への補足に対応するには次の数式に変更する必要があります。 =IF(AND(SUM(N(MMULT((E2:H2=S$2:S$5)+(I2:L2=S$2:S$5)+(M2:P2=S$2:S$5),{1;1;1;1})>0))>2,SUM(N(MMULT((A2:D2=S$2:S$5)+(I2:L2=S$2:S$5)+(M2:P2=S$2:S$5),{1;1;1;1})>0))>2,SUM(N(MMULT((A2:D2=S$2:S$5)+(E2:H2=S$2:S$5)+(M2:P2=S$2:S$5),{1;1;1;1})>0))>2,SUM(N(MMULT((A2:D2=S$2:S$5)+(E2:H2=S$2:S$5)+(I2:L2=S$2:S$5),{1;1;1;1})>0))>2,(MMULT(N(A2:P2=S$2:S$5),{1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1})>0),SUM(MMULT(N(A2:D2=S$2:S$5),{1;1;1;1})),SUM(MMULT(N(E2:H2=S$2:S$5),{1;1;1;1})),SUM(MMULT(N(I2:L2=S$2:S$5),{1;1;1;1})),SUM(MMULT(N(M2:P2=S$2:S$5),{1;1;1;1}))),"○","") 検索値の"A"~"D"はS2:S5セルへ入力してあります。 もう少し簡略化できるかも知れませんが論理式を整理するには実証しながらデバッグしますので時間が掛かります。

  • mt2015
  • ベストアンサー率49% (258/524)
回答No.5

ANo.3です。 > ダメです。4グループにABCDがばらばらに入らないといけないです。 まぁ、そうですよね。 作業列を大量に使えばセル関数だけで出来ると思いますが面倒なのでマクロでやってみました。ABCDの全ての組み合わせ(24通り)を作って、Grがそのどれかに一致すれば○を表示しています。変数宣言もエラー処理も中途半端なサンプルですが、一応動きます。 Sub Sample()   Dim sData(23, 3)   nCount = 0   vData = Array("A", "B", "C", "D")      '全ての組み合わせを作成   For i = 0 To 3     For j = 0 To 3       For k = 0 To 3         For l = 0 To 3           nChk = Array(0, 0, 0, 0)           nChk(i) = 1           nChk(j) = 1           nChk(k) = 1           nChk(l) = 1           If WorksheetFunction.Sum(nChk) = 4 Then             sData(nCount, 0) = vData(i)             sData(nCount, 1) = vData(j)             sData(nCount, 2) = vData(k)             sData(nCount, 3) = vData(l)             nCount = nCount + 1             Exit For           End If         Next l       Next k     Next j   Next i   '全ての組み合わせをチェック   Columns("Q:Q").ClearContents   For m = 2 To 12 '2~12行目までを対象     For n = 0 To 23       nGR = 0       nGR = -1 * (WorksheetFunction.CountIf(Range("A" & m & ":D" & m), sData(n, 0)) <> 0)       nGR = nGR - (WorksheetFunction.CountIf(Range("E" & m & ":H" & m), sData(n, 1)) <> 0)       nGR = nGR - (WorksheetFunction.CountIf(Range("I" & m & ":L" & m), sData(n, 2)) <> 0)       nGR = nGR - (WorksheetFunction.CountIf(Range("M" & m & ":P" & m), sData(n, 3)) <> 0)       If nGR = 4 Then         Range("Q" & m) = "○"         Exit For       End If     Next n   Next m End Sub

honeybeans
質問者

お礼

まだ試してませんが、やってみます。ありがとうございました。

  • OKWavex
  • ベストアンサー率22% (1222/5383)
回答No.4

>4グループのそれぞれで空欄がない、かつ、1行(A~P列)に >4種以上の文字列がある場合は〇、という関数を作ったのですが、 >それでは、1グループに2種文字列があるときも〇になってしまいます >のでダメでした。 条件とちがうのだからダメなのは当たり前でしょう 1行(A~P列)に4種以上の文字列がある場合ではなくA~Dが1つずつ4グループに含まれる場合に〇にすればいいだけでしょう

honeybeans
質問者

補足

それが分からないから質問したのです。どうすればいいですか?

  • mt2015
  • ベストアンサー率49% (258/524)
回答No.3

結構難しいですね。 補足願います。 以下のような場合は○ですか? グループ1:A,B グループ2:C グループ3:D グループ4:D

honeybeans
質問者

補足

ダメです。4グループにABCDがばらばらに入らないといけないです。 グループ1:A,B グループ2:B グループ3:C グループ4:D ならOKです。

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.2

>4グループのそれぞれで空欄がない、かつ、1行(A~P列)に4種以上の文字列がある場合は〇、という関数を作ったのですが、それでは、1グループに2種文字列があるときも〇になってしまいますのでダメでした。 その考え方では(2)の条件のみです。 IF関数で条件式をAND関数とOR関数を使えば良いでしょう。 文字が含まれるか否かはCOUNTIF関数で良いと思います。 =IF(AND(OR(INDEX(COUNTIF(A2:D2,{"A";"B";"C";"D"}),0)),OR(INDEX(COUNTIF(E2:H2,{"A";"B";"C";"D"}),0)),OR(INDEX(COUNTIF(I2:L2,{"A";"B";"C";"D"}),0)),OR(INDEX(COUNTIF(M2:P2,{"A";"B";"C";"D"}),0)),INDEX(COUNTIF(A2:P2,{"A";"B";"C";"D"}),0)),"○","")

honeybeans
質問者

お礼

できました。Index関数がよく分からないですが、勉強してみます。ありがとうございました。

回答No.1

> (略)という関数を作った とのことですので、それをご提示ください。 その添削の方が話が早いかもしれませんよ。

関連するQ&A

専門家に質問してみよう