• 締切済み

複数の条件に一致するセルの数値を返すためには

質問が分かりづらかったら申し訳御座いません。 複数の条件に一致するセルに打ち込まれた文字列を飛ばすにはどうすればよいですか? 下記の写真を参考にさせてもらいますと、 別シートのセルに【日付が3月15日が休の場合に該当者の名前】を自動的に飛ぶようにしたいです。 飛ばすセルも該当者を全て一つのセルに表示させるのではなく、該当者毎にセルを分け、横並びに表示をしたいです。 条件一致するセルの個数等は本で調べて分かったのですが、該当者の名前を飛ばすとなると分かりません。 宜しくお願い致します。

みんなの回答

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.5

 回答No.4のimogasi氏が仰っておられるimogasi方式とは、imogasi氏自身が「自称」と仰っておられる事からも判る通り、「imogasi方式」と呼んでいるのはimogasi氏だけであり、一般的には作業列を使った方法と呼ばれています。  作業列を使った方法はimogasi氏の専売特許などではなく、広く用いられている方式ですので、WEBで検索される場合には「imogasi方式」ではなく、「作業列」をキーワードにして検索される事を御勧め致します。

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

「飛ばす」という言葉は質問者の自己流でわかりにくい。 ーー 本件は、(エクセルの関数を使っての)条件を付けての「抽出」や「抜出し」問題です。 該当(行)は、複数ある場合である。 ーー データ例 Sheet1の A1:F6 A列  B列   C列 D列 E列 F列(該当番号の列)=作業列  氏名 担当 3月15日 3月16日 3月17日 該当番号 a 販売 b 設備 休 1 c 販売 d 仕入 休 2 e 販売 空いたセルに(D7に )=MATCH(DATEVALUE("2016/3/15"),$A$1:$J$1) と入れる 3月15日はC列にあるので、3が返る。 ーー F2セルに =IF(INDEX($A$1:$J$5,ROW(),$D$7)="休",MAX(F$1:F1)+1,"")と入れて、 下方向に式を複写。 結果は、上記のようにBさんの行に1、Dさんの行に2が入る。 該当者の行に、上行から連番を振るわけです。 ーー Sheet2に行って、A1,B1に見出しとして 氏名 担当 を入れる。 A2セルに =INDEX(Sheet1!$A$1:$A$6,MATCH(ROW()-1,Sheet1!$F$1:$F$6),1) B2セルに =INDEX(Sheet1!$A$1:$BA$6,MATCH(ROW()-1,Sheet1!$F$1:$F$6),2) を入れる。 結果 A1:B3は 氏名 担当 b 設備 d 仕入 このやり方の方が、式の意味が、わかりやすいと思うが、いかがでしょう。 15年前からimogasi方式と自称してこのやり方を回答している。 (imogasi方式でWEB照会すればたくさんでると思う) 欠点はSheet1のF列で(「休」みの)該当者の連続番号という作業列を使うことです。 ーー この質問タイプはよくあり、 すでに出ているような回答が毎回出るが、毎回質問者のレベルでは、関数式が 何をしているのか判らないのではないかと思う。 エクセルの関数は値は1つしか返さないのが主流なので、(配列数式という仕組みを使わないと)複数の明細を捉えて、それを対象に何とかするのがむつかしい。 コピペして、結果さえ出ればよいという考えなら、本回答は無視してください。 複写の行を余分にしてもエラーにならないようにするには、もう少し式が長くなるが省略。 また条件が2つ3つになってもF2の式を少し変えれば対応できる。 また本件のタイプは、フィルタやVBAを使えば苦労しなくて済むのだ。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.3

 回答No.1です。  失礼しました。別シートのセルに飛ばさねばならない事を失念しておりました。  尤も、別シートというだけでは、別シートのどこに飛ばさねばならないのかが判りませんし、元データがどのシートに存在しているのかもわかりませんので、取り敢えず仮の話として、元データが存在しているシートがSheet1であり、Sheet2のA1セルに日付が入力されていて、その日付が休の該当者の名前をSheet2のB1セルから右方向に向かって、全員分表示させるものとして話を進める事に致します。  まず、Sheet2のB1セルに次の関数を入力して下さい。 =IF($A1="","",IF(COUNTIF(Sheet1!$E$6:$AI$6,$A1),IF(COLUMNS($B1:B1)>COUNTIF(INDEX(Sheet1!$E$8:$AI$12,,MATCH($A1,Sheet1!$E$6:$AI$6,0)),"休"),"",INDEX(Sheet1!$D$8:$D$12,MATCH("休",INDEX(Sheet1!$E$8:$AI$12,IF(COLUMNS($B1:B1)=1,0,MATCH(A1,Sheet1!$D$8:$D$12,0))+1,MATCH($A1,Sheet1!$E$6:$AI$6,0)):INDEX(Sheet1!$E$12:$AI$12,MATCH($A1,Sheet1!$E$6:$AI$6,0)),0)+IF(COLUMNS($B1:B1)=1,0,MATCH(A1,Sheet1!$D$8:$D$12,0)))),"(該当日無し)"))  次に、Sheet2のB1セルをコピーして、Sheet2のC1~F1のセル範囲に貼り付けて下さい。  以上です。

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

>別シートのセルに【日付が3月15日が休の場合に該当者の名前】を自動的に飛ぶようにしたいです。 意味不明です。 添付されている画像は処理結果の表でしょうか? 「別シート」の見本が無いので処理方法が思いつきません。 また、「自動的に飛ぶように」と言う表現がExcelでは使わない用語なのでどのような動作なのかが理解できません。(関数での処理は設定したセルに数式の処理結果が代入されます) >条件一致するセルの個数等は本で調べて分かったのですが、 COUNTIF関数やCOUNTIFS関数で条件に合致するデータ(セルの値)の個数のことでしょうか? >該当者の名前を飛ばすとなると分かりません。 その「飛ばす」と言う動作の説明が必要です。 代入したいセルへ数式を設定して、目的の「名前」があるセルの番地から値を取り出せば良いと言うことになりますので、データ(名前)を飛ばす訳ではありません。 VBA等でプログラミングする場合でも目的のデータの位置を探し出して、代入すべきセルへ値を渡しますので、これもデータを飛ばしている訳ではありません。 質問の文言を見直して理解できる表現で説明してください。 また、元になるデータの表と処理後の表の見本を提示してください。 下記のようなテキストを貼り付けて頂けるとExcelの表に再現できます。 列,A,B,C,D,E,F,G,H,I,J,K 6行目,,人数,所属,名前,3/15,3/16,3/17,3/18,3/19,3/20,3/21 7行目,番号,,,,火,水,木,金,土,日,月 8行目,201,1,,Aさん,,休,,,,, 9行目,202,2,,Bさん,,,休,,,,

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.1

 前提条件として、D列に入力されている名前の中には同じ名前が重複して入力されている様な事がない事が保障されている場合には次の様な方法を使う事が出来ます。  今仮に、A1セルに3/15と入力されていて、B1セルから右方向に向かって全ての該当者の名前を並べて表示させるものとします。  まず、B1セルに次の関数を入力して下さい。 =IF($A1="","",IF(COUNTIF($E$6:$AI$6,$A1),IF(COLUMNS($B1:B1)>COUNTIF(INDEX($E$8:$AI$12,,MATCH($A1,$E$6:$AI$6,0)),"休"),"",INDEX($D$8:$D$12,MATCH("休",INDEX($E$8:$AI$12,IF(COLUMNS($B1:B1)=1,0,MATCH(A1,$D$8:$D$12,0))+1,MATCH($A1,$E$6:$AI$6,0)):INDEX($E$12:$AI$12,MATCH($A1,$E$6:$AI$6,0)),0)+IF(COLUMNS($B1:B1)=1,0,MATCH(A1,$D$8:$D$12,0)))),"(該当日無し)"))  そして、B1セルをコピーして、C1~F1のセル範囲に貼り付けて下さい。  以上です。