• ベストアンサー

エクセル2003の、抽出について

勤務表から、その日の勤務者の、勤務形態別の氏名を抽出したいと思っています。 といいますのも、A列に上から氏名があり、1行目に日付が入った勤務表があります。 そこに、それぞれ「早」、「日」、「遅」というように、その日の勤務形態が入力されています。 そこで、例えばC列を選択すると、「早」と記載のあるA列の氏名がE列に、 「日」と記載のある氏名がF列に、抽出されるといったことは可能でしょうか? マクロを使ってもかまいませんので、よろしくお願い申し上げます。

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.6

こんばんは! No.1・2です! たびたびごめんなさい。 二度とも的外れでしたね。どうもすみません。 もう一度画像をアップさせてもらいます。 作業用の列をA列として使わせてもらっています。 同一Sheetにしていますので数式自体はそんなに難しくないと思います。 まず、作業列のA2セルに =IF(COUNTA($B$2:$B$50)>=ROW(A1),INDEX($C$2:$AG$50,MATCH(B2,$B$2:$B$50,0),MATCH($AI$2,$C$1:$AG$1,0)),"") としてオートフィルで下へコピー これは人数が今後49人(タイトル行があるため)まで増えても対応できるようにしています。 そして、AI2セルに日にちの数値を入力すればそれぞれの列に名前を表示させるようにしています。 AJ2セルに =IF($AI$2="","",IF($A2=AJ$1,$B2,"")) として、列方向と行方向にオートフィルでコピーすると 画像のような感じになります。 こんなんで良かったのですかね? 以上、参考になれば幸いですが、 またまた・・・他に良い方法があれば読み流してくださいね。m(__)m

ein-zwei
質問者

お礼

うまくいきました!理想のものができました! 何度も根気よくお付き合いいただきましてありがとうございましたm(_ _)m

その他の回答 (6)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.7

No.1・2・6です! 前回の作業用の列の数式をもう少し簡単にしてみました。 A2セルを =IF(COUNTA($B$2:$B$50)>=ROW(A1),INDEX($C$2:$AG$50,ROW(A1),MATCH($AI$2,$C$1:$AG$1,0)),"") としてみてください。 他の数式はそのままでOKかと思います。 どうも何度もごめんなさいね。m(__)m

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.5

こんなのはどうでしょう?添付の図を見てください。 B10:E10には「佐藤」 B11:E11には「鈴木」 (省略) B14:E14には「田中」 と、予め入れて置きます。 何日と言う数字をA9に入力する物とします。 A10に =OFFSET(A2,0,$A$9) と、入れてA14までコピーします。 これで、A9の日の各々の勤務形態が表示されます(未入力の時は名前が表示されます) 次に、B10:E14を選択して、条件付書式の設定をします。 条件は「数式が」「=($A10<>B$9)」と、設定。 書式はフォント色を白にします(画像では判りやすくするためにピンクにしています)。

  • 135ok
  • ベストアンサー率34% (26/75)
回答No.4

No.3です。 前回の式は、3日のみの対応でしたので、読み流してください。 別の方法を考えました。資料を添付いたしますのでご確認ください。 作業列をA、Bに作る A列は氏名 B列は B1 希望の日にちを入れる。 B2 =IF(B$1="","",OFFSET($D$1,MATCH(A2,$D$2:$D$6,0),MATCH(B$1,$E$1:$I$1,0)))    *下にコピー    *表から、対象日の出勤状況を表示。 K2 =IF(ISNUMBER(FIND(K$1,$B2)),$D2,"")    *表示させたい範囲にコピー    *B2表示の出勤時間に氏名を表示。

  • 135ok
  • ベストアンサー率34% (26/75)
回答No.3

これでいかがでしょうか。 H2 =IF(ISNUMBER(FIND(H$1,$D2)),$A2,"")    表示させたい範囲にコピー    

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

No.1です! 今度は作業用の列を使って、表を作ってみました。 Sheet2のA2セルに日付を入力すると その日の氏名と勤務形態を表示させる方法です。 Sheet1の日付の列は31日(AH列になるはずです) Sheet1の作業列A2セルに =IF(Sheet2!$A$2="","",IF(INDEX($D$2:$AH$100,ROW(A1),MATCH(Sheet2!$A$2,Sheet1!$D$1:$AH$1,0))="","",INDEX($D$2:$AH$100,ROW(A1),MATCH(Sheet2!$A$2,$D$1:$AH$1,0)))) B2セルに =IF(A2<>"",ROW(A1),"") という数式を入れ、A2・B2セルを範囲指定し、B2セルのフィルハンドルで下へコピーします。 (Sheet2の数式が100行まで対応できるようにしていますので、100行目くらいまでコピーしても構いません) 次にSheet2のB2セルに =IF($A$2="","",IF(COUNT(Sheet1!$B$2:$B$100)>=ROW(A1),INDEX(Sheet1!$C$2:$C$100,SMALL(Sheet1!$B$2:$B$100,ROW(A1))),"")) C2セルに =IF(OR($A$2="",B2=""),"",INDEX(Sheet1!$A$2:$A$100,SMALL(Sheet1!$B$2:$B$100,ROW(A1)))) という数式を入れ、これもB2・C2を範囲指定し、C2セルのフィルハンドルで 下へコピーすると画像のような感じになります。 今回は配列数式はありませんので、そのままコピー&ペーストしても エラーにならないと思います。 これで希望に近い形になったでしょうか? もしこれも的外れならごめんなさいね。m(__)m

ein-zwei
質問者

補足

たびたびのご丁寧なご回答、本当にありがとうございます。 感謝の気持ちでいっぱいですorz 画像をアップしました。このようにはできませんでしょうか? 3日の列を選択したら、右側の表に名前が、画像のように表示され 4日の列を選択すれば、4日の名前が表示されるといったふうにですが・・・ 度重なる質問に頭が下がりますが、何卒、よろしくお願い申しあげます。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんにちは! ↓の画像のような感じで良いのですかね? 一応そういうことだと解釈して回答します。 色々方法はあるかと思いますが・・・ 一例です。 ↓の画像で説明させていただくと、 D2セルに配列数式を入れています。 もしこの画面からコピー&ペーストする場合は 単に貼り付けただけではエラーになると思いますので、 セルに貼り付けた後、F2キーを押すか、数式バー内で一度クリックします。 編集可能になりますので Shift+Ctrl+Enterキーで確定します。 D2セルに =IF(COUNTIF($B$2:$B$1000,D$1)>=ROW(A1),INDEX($A$2:$A$1000,SMALL(IF($B$2:$B$1000=D$1,ROW($A$1:$A$999)),ROW(A1))),"") という数式を入れ、 Shift+Ctrl+Enter で確定! そしてこの数式をF2セルまでオートフィルでコピーします 最後にD2~F2セルを範囲指定し、F2セルのフィルハンドルで下へコピーすると 画像のような感じになります。 尚、数式は1000行まで対応できるようにしていますが、 データ量によってアレンジしてみてください。 他に作業用の列を使えば配列数式にせずにできると思います。 (PCの負担のことを考えると配列数式でないほうが良いかもしれません) 以上、参考になれば幸いですが、 他に良い方法があれば読み流してくださいね。m(__)m

ein-zwei
質問者

お礼

申し訳ありません、もう1つ補足なのですが、抽出した名前を、上から順番に表示せずに、名前のある行と同じ行で、表示列にて抽出、表示できませんでしょうか? 申し訳ございませんが、よろしくお願い申し上げます。

ein-zwei
質問者

補足

丁寧なご回答に感謝いたします。うまくいきました。 おんぶにだっこで恐縮なのですが、 画像にあります「B列」のみでなく、 列(日付)を選択(1行目に、1ヶ月の日付が入っています)して、 選択した列のものを、というように、柔軟に抽出できませんでしょうか? 申し訳ありませんが、ご教授いただけましたら幸いです。