『small関数について』(青色) sheet1にひと月のシフトがあり、 sheet2に当日と翌日の勤務者を抽出しています。 <sheet1>   A  B  C  D   AG  AH 1    1/1 1/2 1/3  1/1  1/2 2 田中 早  遅  休   1   1 3 佐藤 休  早  早      2 4 鈴木 遅  遅  遅   3   3 B1からAF1まで日付、A2からA100まで従業員の名前、 勤務形態は複数、空白もあります。 AG1に=TODAY()、AH1に=TODAY()+1を入力し、作業列としています。 <sheet2>   A   B 1 1/1  1/2 2 田中 田中 3 鈴木 佐藤 4    鈴木 A1に=TODAY()、B1に=TODAY()+1、A2には以下の式を入力しました。 =IFERROR(INDEX(sheet1!$A$2:$A$100,SMALL(sheet1!$AG$2:$AG$100,ROW(A1))),"") ここから質問です。 sheet1のAG1、AF1...にTODAY関数ではなく直接日付を入力し、 (sheet2はTODAY関数のまま) 「今日が1日ならAG2:AG100を参照し、今日が2日ならAF2:AF100を参照する」 ことはできるでしょうか? 一応sheet1の作業列は31日分作りましたが、 SMALL(sheet1!$AG$2:$AG$100←ここを変えて対応することはできますか? 別のやり方でも構いません。 マクロではなく関数でやりたいです。 よろしくお願いいたします。 < 使用 Excel:Excel2013、使用 OS:Windows10 > ---- ちょっとよく分からないです。説明に辻褄が合ってない感じです。 TODAY関数ではなく直接日付を入力することの意味(目的)は、何ですか? Sheet1の作業列に入っている数式が何なのか提示して貰えませんか? 読んだ印象では Sheet2はTODAY関数のままにするなら、今日と明日しか見にいかないのですから、 Sheet1のAG1、AF1もTODAY関数を使って、2日分だけ入力すればいいんじゃないですか? (半平太) 2018/01/03(水) 08:45 ---- 半平太さん ありがとうございます。 説明不足で申し訳ございません。 sheet1の作業列は遅番、早番問わずその日の勤務者のリストを出すためのものです。 sheet2には名前のリスト以外に日報として使う情報もあり、それを残しておきたいとのことです。 例えば今日が1/1だとして、 「sheet2のTODAY関数を消して1/4を入力したら、sheet2の名前のリストも自動的に1/4の勤務者に変わる」 というものを作りたいです。 (青色) 2018/01/03(水) 10:30 ---- 的外れかもしれませんけど、ご質問のことであれば、MATCH関数などを使えば出来そうな気がします。 ターゲットになる列のアルファベットを調べるにはこの方法を応用。 http://itwebkatu.com/excel-get-column-alphabet/ INDIRECT関数をつかって、文字列を数式に変換? INDIRECT関数の詳しい説明は大変なので、 http://officetanaka.net/excel/function/function/indirect.htm このあたりをご確認ください。 要は、日付にあわせて、MATCH関数で表のどの位置を参照すればよいか調べて、文字列の結合等で数式を構築してからINDIRECT関数で数式に変えちゃえばいいんじゃないかとおもいます。 (もこな2) 2018/01/03(水) 11:44 ---- >SMALL(sheet1!$AG$2:$AG$100←ここを変えて対応することはできますか? OFFSET関数でずらしたらどうですか? =IFERROR(INDEX(Sheet1!$A$2:$A$100,SMALL(OFFSET(Sheet1!$AG$2:$AG$100,0,MATCH(A$1,Sheet1!$AG$1:$BK$1,0)-1),ROW(A1))),"") よく分かっていないので、ダメだったら他の回答者のレスをお待ちください。 (半平太) 2018/01/03(水) 12:04 ---- Sheet1の作業列(31列)は他の用途でも必要だということですか? 揮発性関数を使わずにやってみた。 A2 =IFERROR(INDEX(Sheet1!$A$2:$A$100,SMALL(INDEX(Sheet1!$AG$2:$BK$100,0,MATCH(A$1,Sheet1!$AG$1:$BK$1,0)),ROW(A1))),"") 右と下にコピー A1の日付が「3日」ならSheet1のAG列から3列目、「10日」なら10列目を参照すればいいんだったら、 もう少し簡単になりますが、MATCH関数で日付を検索した方が無難でしょうね。 参考まで (笑) 2018/01/03(水) 13:05 ---- もこな2さん 半平太さん (笑)さん ありがとうございます。 文章で説明するのは難しいですね… どのやり方でも出来ました。 本当にありがとうございます。 (青色) 2018/01/03(水) 19:06 ---- >文章で説明するのは難しいですね… こういう感想を漏らすということは、自分の言いたいことが伝わっていないということなんでしょうね。 よくわからないまま回答しましたが、未だに作業列が「31列」も必要だとは思えません。 作業列「2列」でやってみた。 ■前提 ・Sheet1のAG列とAH列の2列を作業列とする ・Sheet2のA1に任意の日付を入力。B1はその翌日を表示(A1が月末日の場合は空白) ・抽出条件は、シフト表が「早」または「遅」になっている勤務者名 ■Sheet1 AG1 =IF(Sheet2!A1="","",Sheet2!A1) AG1をAH1にコピー AG2 =IF(AG$1="","",IF(OR(IFERROR(INDEX($B2:$AF2,MATCH(AG$1,$B$1:$AF$1,0)),"")={"早","遅"}),ROW(),"")) AG2を右・下コピー ■Sheet2 A1に任意の日付を手入力 B1 =IF(DAY(A1+1)=1,"",A1+1) A2 =IFERROR(INDEX(Sheet1!$A:$A,SMALL(Sheet1!AG$2:AG$100,ROW(A1))),"") A2を右・下コピー 以上ですが、これだと何か問題ありますか? >sheet2には名前のリスト以外に日報として使う情報もあり、それを残しておきたいとのことです。 この「それ」というのは31列の作業列を指してるんですかね? 「日報として使う情報」とは何のことですか? 最初の質問には >sheet2はTODAY関数のまま と書いてありますが、2つ目のコメント(2018/01/03 10:30)には >sheet2のTODAY関数を消して1/4を入力したら となっています。 これは間違いですか? 不明な点がありますが、一応参考まで (笑) 2018/01/04(木) 13:20