• ベストアンサー

エクセルで、勤務表から 日付別に勤務者と勤務形態を抽出して、別シートに抽出したい

Sheet 1 勤務表(4月)     A     B     C      D…         4/1      4/2    4/3 … 1 赤星     早1    夜勤入り  夜勤明け … 2 関本    遅1    早1    早1   … 3 新井    休     遅1    早2   … 4 金本    夜勤入り  夜勤明け  休    … 5 ブラぜル  夜勤明け 休     遅1   … 6 桜井    休     早2    遅2   … 7 鳥谷    早2    遅2    早3   … 8 狩野    遅2    早3    休    … 9 藤川    早3    休     夜勤入り … 以上のような、勤務表、(各列には、日付、各行には、従業員の名前が9人)が、あり、毎日、早番 3種類、遅番 2種類、夜勤入り 1人、夜勤明け 2人、休み、のデータが入っています。(ずれていたら、すいません) これを、Sheet 2以降に、日付ごとに、出勤している従業員名と、そのとなりのセルに、その従業員の勤務種別を抽出して、表示したいのです。しかも、夜勤入り、夜勤明け、休みは表示させたくありません。)例えば、こんな感じです。 Sheet 2   Sheet 3    Sheet 4 (4月1日)    (4月2日)    (4月3日) 赤星 早1     関本 早1  関本  早1 関本 遅1     新井 遅1  新井  早2 鳥谷 早2     桜井 早2   ブラぜル 遅1 狩野 遅2     鳥谷 遅2   桜井  遅2 藤川 早3     狩野 早3    鳥谷  早3  いろいろとムシのいい話を書いて申し訳ありませんが、当方vbaの初心者で、このような場合、何から手を付けて良いのか分からず、困っております。どうか、なにとぞ、ご教授下さい。

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

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

回答No3です。 ごめんなさい。肝心の式の表示が抜けておりました。 A15セルには次の式を入力し、下方にオートフィルドラッグします。 =ROW(A3) B15セルには次の式を入力し右方向にオートフィルドラッグしたのちに下方向にもオートフィルドラッグします。 =IF((IF(B3="早1",1,0)+IF(B3="早2",1,0)+IF(B3="早3",1,0)+IF(B3="遅1",1,0)+IF(B3="遅2",1,0))=0,"",MAX(B$14:B14)+1)

その他の回答 (5)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.6

勤務表が正確に提示のレイアウトのみだったら、 [複数のワークシート範囲]からの[ピボットテーブル]をつくって 値フィールドを行フィールドに追加し、列フィールドをページフィールドに移動させて [ページの表示]で各シートに分割作成する事ができます。 つまり勤務表を完成させた後に一気に手作業でできるというわけです。 が、実際は社員コードなどがあったりしてそんなに上手い事いかないと思いますので、まあ参考程度に。 #あまり深追いするつもりもないので上手くいかなくてもサラっと流しておいてください:D Sub test()   Dim r As Range   Dim ri As Range   Dim i As Long   With ActiveWorkbook     With .ActiveSheet       .Move before:=.Parent.Sheets(1)       Set r = .Range("A1").CurrentRegion     End With     Set ri = r.Offset(r.Rows.Count + 10).Item(1)     With .PivotCaches.Add(SourceType:=xlConsolidation, _                SourceData:=r.Address(1, 1, xlR1C1, True)) _                .CreatePivotTable(TableDestination:=ri)       .AddFields RowFields:=Array("行", "値"), PageFields:="列"       .PivotFields("行").Subtotals(1) = False       .ColumnGrand = False       With .PivotFields("値")         .PivotItems("休").Visible = False         .PivotItems("夜勤入り").Visible = False         .PivotItems("夜勤明け").Visible = False       End With       .ShowPages PageField:="列"       .TableRange2.Clear     End With     For i = 1 To r.Worksheet.Index - 1       With .Worksheets(i).UsedRange         .Copy         .PasteSpecial xlPasteValues         .Columns(3).Delete         .Rows("2:4").Delete       End With     Next   End With   Set ri = Nothing   Set r = Nothing End Sub

  • _Kyle
  • ベストアンサー率78% (109/139)
回答No.4

課題自体は単なる転記マクロなんですが、 「月初に(ワークシートの作成も含め)一括して処理する」のか 「元データの追記・変更にともなって随時更新する」のか によって話が違ってきますし、 シート名や、元範囲、書出範囲の位置等具体的なことがわからないので、 …とりあえずユーザー定義関数にしてみました。(^^;;; --------------------------------------------------------- ■Sample(【元範囲】,【日付】) 例えば、参考画像のように  ・元範囲が Sheet1のA1:AE10 である  ・Sheet2のA1セルに 日付 4/1 が入力されている 場合、 Sheet2のA2:B10セルを選択して、  =sample(Sheet1!A1:AE10,A1) と入力し、[Ctrl]+[Shift]+[Enter]で確定すれば、ご要望の結果が返ります。 ※結果が配列で返ってくるので、配列数式として確定する必要があります。 後は、Sheet2を必要なだけコピーして、 A1セルの日付をそれぞれ変更すれば当座の用には足りるかと。 '==========================↓ ココカラ ↓========================== Function Sample(ByVal myRng As Range, ByVal clKey As Variant) As Variant    Dim orAry  As Variant  Dim clIdx  As Long  Dim rtAry() As String  Dim exAry  As Variant  Dim i    As Long  Dim j    As Long  Dim k    As Long  Dim f    As Boolean    orAry = myRng.Value  clIdx = Application.Match(clKey, myRng.Rows(1), 0)  exAry = Array("休", "夜勤明け", "夜勤入り")    ReDim rtAry(1 To myRng.Rows.Count, 1 To 2)  k = 0  For i = 2 To UBound(orAry, 1)   f = True   For j = 0 To UBound(exAry)    f = f And (orAry(i, clIdx) <> exAry(j))   Next j   If f Then    k = k + 1    rtAry(k, 1) = orAry(i, 1)    rtAry(k, 2) = orAry(i, clIdx)   End If  Next i    Sample = rtAry End Function '==========================↑ ココマデ ↑========================== 以上ご参考まで。

goo1975jp
質問者

お礼

ご回答ありがとうございます。おっしゃるように、具体的な設定があいまいな部分は、実は、私自身、どのように、この業務分担表をレイアウトするのか?整理できてないまま、質問してしまい、それを、丁寧に答えてくださり、ありがとうございます。画像まで貼っていただき、とても初心者の私にとって、ありがたかったです。本当にありがとうございました。

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

マクロでのほうが簡単なことでしょうが関数で処理する方法を考えていましたのでご参考までに。 シート1では1行目に日付があり3行目からデータがあるとします。 作業用として A15セルには次の式を入力し下方にオートフィルドラッグします。 B15セルには次の式を入力し、横方向に30列以上オートフィルドラッグし下方にもオートフィルドラッグします。 ここで表示されるデータをもとに別のシートへのデータ入力に使用します。 次にシート見出しでSheet2から例えばSheet32までを並べて置きSheet2選択したのちにSheet32をShiftキーを押しながらクリックします。これでシート2からシート32までが同じ作業グループになります。 この状態でシート2のA1セルには4/1と入力します。4月1日のデータを表示するためのシートになります。 次にA3セルには次の式を入力し、B3セルまでオートフィルドラッグしたのちに下方にもオートフィルドラッグします。 =IF(OR($A$1="",COUNTIF(Sheet1!$1:$1,$A$1)=0),"",IF(COUNTIF(INDEX(Sheet1!$A:$AE,1,MATCH($A$1,Sheet1!$1:$1,0)):INDEX(Sheet1!$A:$AE,100,MATCH($A$1,Sheet1!$1:$1,0)),ROW(A1))=0,"",INDEX(Sheet1!$A:$AE,INDIRECT("Sheet1!A"&MATCH(ROW(A1),INDEX(Sheet1!$A:$AE,1,MATCH($A$1,Sheet1!$1:$1,0)):INDEX(Sheet1!$A:$AE,100,MATCH($A$1,Sheet1!$1:$1,0)),0)),IF(COLUMN(A1)=1,1,MATCH($A$1,Sheet1!$1:$1,0))))) この入力済んだ後でシート見出しで右クリックし「作業グループ解除」を選択します。 各シートには4月1日のデータが表示されていることでしょうが、各シートでA1セルの日付を変えることでその日のデータが表示されますし、A1セルを空にすればデータは表示されません。

goo1975jp
質問者

お礼

ご回答ありがとうございます。こちらも、初心者にわかりやすいように、関数で処理していただいたのですね。 正直申しまして、ご回答いただいた、11行目の関数は、今の自分のレベルでは、理解しがたい複雑な長い関数(涙…)で、どうやったら、こんな関数を思いつくのか?すごいなぁ、と思って、唸ってしまいます。 ところで、稚拙な質問ですが、この11行目の関数(A3セルに入力する関数)は、作業用としての、A15,B15セルにも入力して良いのでしょうか?

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

VBAで回答をほしいなら、表題の何処かか、質問文の始めに明記すること。答える層も変わってくる。 VBAに関してぐらいになると、丸投げ質問は、当コーナーの質問規約違反です。 === 1.Sheet1のデータの最終行を捉えるコードは知っているか。 2.Sheet1の第初のデータ行から、1の最終行まで下記を繰り返す 3.シートへ振り分ける  日付でシートを別にするらしいから、    日付ー>シート名   の対応(割り出し)をどうするか考える。   IF文では月中日数分聞くのは煩雑だろうから、   前もって日付の月中日数分のシートを作っておくか、と言う仕方も有る。日付はヒヅケシリアル値、シート名は文字列なので変換が必要だがわかるかな。   日付からシート名の対応を割り出すのはどうするか? 4.シート名が割り出せれば、そのシートの書き込み前の 最終行の次の行に、今のSheet1の考えている行のデータを転記(注)(代入)すればよい。>夜勤入り、夜勤明け、休みは表示させたくありません、はデータを持ってこなければよいのかな。持ってきても列 非表示などどうすると言うのかな。 (注)転記とは、(左辺)当日付と対応したシート。最終行の次、列=(右辺)Sheet1の今考えている行、列のセルのデータ のコード。 == 上記文章を、よく読んで、1、3,4で私が言っていること、コード化の方法が、判から無い点は補足の事。

goo1975jp
質問者

お礼

ご回答ありがとうございます。ご推察のように、当方、vbaの入門本を読破した程度で、いろいろと分からない事がいっぱいで、手探り状態なので、今現在、一つずつ、覚えている状態です。ご指摘の点を参考に自分なりに考え、さらにレベルアップしていきたいです。このような、レベルの低い質問に、懇切丁寧に答えて頂き、また、叱咤激励をして頂きまして、ありがとうございました。

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

こんばんは! 結論として、「休」・「夜勤入り」・「夜勤明け」 を表示しなければ良い訳ですよね? 参考になるかどうか分かりませんが・・・ 一例として ↓の画像のように表を作ってみました。 (別Sheetにしていませんので、数式はアレンジしてみてくださいね) 作業のための表を使う方法ですので、ちょっと手間がかかるかもしれません。 それから表示させたいセルが氏名と勤務状況が交互のセルになっていますので、 列方向へのオートフィルは出来ません。(行方向のオートフィルは出来ます) したがって、日付毎に数式を入れてやる方法になりますが、 まず、作業用の表の B14セル =IF(OR(B2=$A$13,B2=$A$14,B2=$A$15),"",ROW(A1)) として、列・行方向にオートフィルでコピーしています。 F2セル =IF(COUNT($B$14:$B$22)>=ROW()-1,INDEX($A$2:$A$10,SMALL($B$14:$B$22,ROW()-1)),"") H2セル =IF(COUNT($C$14:$C$22)>=ROW()-1,INDEX($A$2:$A$10,SMALL($C$14:$C$22,ROW()-1)),"") J2セル =IF(COUNT($D$14:$D$22)>=ROW()-1,INDEX($A$2:$A$10,SMALL($D$14:$D$22,ROW()-1)),"") G2セル =IF(F2="","",VLOOKUP(F2,$A$2:$D$10,2,0)) I2セル =IF(H2="","",VLOOKUP(H2,$A$2:$D$10,3,0)) K2セル =IF(J2="","",VLOOKUP(J2,$A$2:$D$10,4,0)) として、F2~K2セルを範囲指定した後に オートフィルで下へコピーしています。 ただし、この操作を日数分だけ繰り返さないといけなくなりますので、 かなり厄介ですよね・・・ 表の配置を考えればもっと簡単に出来るかもしれませんが、 今は良い案が思い浮かびません。 この程度の回答しか出来ませんが、 他に良い方法があったり、的外れの回答なら 読み流してくださいね。m(__)m

goo1975jp
質問者

お礼

早速のご回答ありがとうございます。関数を使っての処理ですね。おっしゃるように、完全解決とはいかないかもしれませんが、逆に手軽に作成できそうで、当方、vbaしか、頭になかったものですから、このアプローチ法に目から鱗でした。画像まで貼り付けて頂き、懇切丁寧にありがとう、ございます。ちなみに、tom04さんは、広島ファンですね。今年は、新球場効果にはじまり、広島野球がおもしろいですね

関連するQ&A

  • 阪神のプロテクト選手

    非常に先走りで失礼な予想ですが、三浦投手獲得時の阪神のプロテクト選手を考えてみました。 いかがなもんですか? 皆さんの予想、意見も聞かせてください。 安藤 優也  岩田 稔  藤川 球児  久保田 智之      石川 俊介  白仁田 寛和  江草 仁貴  渡辺 亮      能見 篤史  下柳 剛  上園 啓史  福原 忍  金村 曉  阿部 健太 鳥谷 敬  関本 賢太郎  平野 恵一  金本 知憲      新井 貴浩  林 威助  桜井 広大  赤星 憲広  野原 将志高濱 卓也  今岡 誠  藤本 敦士 狩野 恵輔  矢野 輝弘

  • 阪神の2008開幕オーダーについて!

    一番赤星 中 二番フォード 一 三番今岡 二 四番金本 左 五番新井貴 三 六番鳥谷 遊 七番桜井広大 右 八番矢野 捕手 こうちゃうかな? このオーダーって超恐くないか?巨人の強力打線級だよな?セカンドに関本 藤本 平野 入れると打線として恐くない フォード二番は良いと思わないか?リグスみたいな二番打者って事 この提案に岡田監督はどんな反応しますか? あなたの個人的な意見もお聞かせください

  • エクセルかAccessを使って勤務表作成について

    病院(看護師)で勤務表自動振り分けが出来るソフトを作成しようかと思ってます。人が作ると偏って不平不満があります。 現在,勤務表はエクセルで夜勤・日勤・半日等を入力しすると勤務時間数や夜勤回数は自動的に計算してくれます。 それを活用して,希望休や希望日勤,夜勤や月に夜勤回数制限有または夜勤⇒明け⇒夜勤は避ける,8:30~20:30までの勤務を2日連続して勤務は避ける。等の条件をプログラムして,ボタン押せば自動でPCは勤務作成できるようにしたいのですが,エクセルかアクセスどちらが作りやすいのでしょうか。 こういったのを作るのに同様な本を購入して勉強したらいいのでしょうか。 よろしくお願いします。

  • 2009年の阪神。

    今年は、広島から新井。日本はムから金村と補強した阪神金本選手の膝の具合も良いらしく順調?な仕上がり。 一番、赤星怪我が心配。 二番、関本(藤本)守備は安心?(私的に藤本が良い) 三番、新井期待大 四番、金本膝の具合が心配。 五番、今岡汚名返上。 六番、櫻井(林)今年も楽しみ。 七番、鳥谷去年以上の成績を収めてほしい。 八番、矢野(狩野)何も言う事無し。今まで通り 九番、ピッチャー    (桧山選手40代も現役で頑張ってほしい。第二の代打の神様?) 先発、金村期待してます。    安藤・福原去年の汚名返上。    能見頑張って欲しい。    下柳あまりイライラしないで。    上園目指せ20勝? 中継ぎ・抑え、久保田契約交渉大丈夫でしょうか?        ウィリアムス期待大        藤川凄いの一言。        渡辺・江草・橋本更なる飛躍に期待。 と、結構な選手はまだ他にもいますが、これほどの選手がいれば優勝も夢じゃないと思うのですが、やはり怪我が怖いのですかね? 果たして、優勝出来るでしょうか? それとも、大型補強した巨人? 相変わらず先発抑えと安泰?で守りも打線も凄い中日?

  • セ・リーグ6球団 各ファンの方に質問

    セ・リーグ開幕まであと5日 そこで各チームの一軍登録メンバー(30人?)+開幕オーダーを教えてください!(予想でかまいません) ちなみに僕を例に挙げると ☆阪神ファンです 投手 13人 先発要員/(右)杉山・オクスプリング・安藤(左)井川・下柳・江草 リリーフ/(右)久保田・藤川・桟原・相木・ダーウィン(左)吉野・能見 捕手 3人 矢野・野口・浅井 内野手 8人 今岡・シーツ・前田忠・関本・町田・藤本・鳥谷・片岡 外野手 6人 濱中・中村豊・赤星・金本・桧山・林 1 中 赤星 2 二 藤本 3 一 シーツ 4 左 金本 5 三 今岡 6 右 桧山 7 遊 鳥谷 8 捕 矢野 9 投 井川 こんな感じです 火曜の夜まで受け付けてます♪

  • 夜勤を含む生活のしかた(特に睡眠)

    よろしくお願いします。 今年に50歳になる男性です。 製造業の職場勤務で、これから夜勤が含まれる生活になります。そこで、私の今後の勤務や休日の予定(ザックリですが)を記しますので、特に夜勤当日の昼間の過ごし方や、夜勤明けの朝からの過ごし方など、睡眠や健康面から見た望ましい過ごし方をぜひご教示下さい。   日:休み 月:日勤(8~17時)※19時位まで2時間程度の残業アリ 火;夜勤入り(17時~) 水:夜勤明け(~9時まで勤務、それ以降に明け) 木:休み 金:夜勤入り(17時~) 土:夜勤明け(~9時まで勤務、それ以降に明け) 以上のように、日勤1日、夜勤2回です。これが毎週続きます。一般的な夜勤をされている人より少し緩いのかな?とは思います。 このような勤務は初めてなのですが、特に夜勤に入る当日の昼間は寝貯めした方が良いのか?や、夜勤明けは帰宅して少し寝た方が良いのか?など、主に「 睡眠 」をどう摂ると健康を少しでも維持しながら勤務を続けられるかをお聞きしたいのです。 ぜひ、ご経験者様など様々なご意見をください。

  • エクセルで勤務表をつくりたいのですが、いい方法がわかりません

           A B C D E F G~  名前/日付 1 2 3 4 5 6 7 ~31    合計 1XXX X子 日 ○ ◎ 有 公 欠 ~ 2 日勤     1                 17 3 夜勤      1                2 4 有休         1             2 5 公休          1            8 6 欠勤             1         1 上の表のような勤務表をエクセルで作成しています。行2から6はグループ化して隠せるようしています。 IF関数を使って該当の行に”1”をたてると行1に値を返すようにしました。 2~6以外にもいろいろなパターンがあるのですが、IF関数は7つまでしか無理なので今は手入力しています。また、合計を他のシートに飛ばして管理しています。 コード化してVLOOKUP関数で値を返す方法も考えたのですが、合計を出すのに上の表だとわかりやすいのでなにかいい方法はないか困っています。エクセルはあまり詳しくないのでどなたか教えていただけないでしょうか? (ちなみに、夜勤の入りは”○”出は”◎” 有/休・休/有・日/有・早出-日°・遅出-日.などなど)

  • Excel VBAを使用した勤務表の作成

    現在、月毎にシート別になっている勤務表の管理をしており、初心者ながらExcel VBAを使って効率的に作成したいと思っています。 勤務表は1行目に日付、A列に従業員の名前が入っています。 その中でつまづいている箇所がありますので以下の2点について教えてください。 ① 従業員の中に三交代制の従業員がいます。  A、B、Cの3つの班に分かれており、その日がどの班なのか分かるように日付の下の行に「A B C A B C ・・・」と順番に記載したいですがどのようにしたら良いでしょうか?  また、この時に月を跨ぐとAから始まらない(前月がBで終わると翌月1日はCから始まる)と思うのですが、シートを跨いでABCの3つが続いていくようにしたいです。 ② 前記①が完了したら、三交代制の従業員の隣にそれぞれABCの表記をし、日付のABCと従業員のABCがそれぞれ交わる日のセルに「出勤」と入れたいです。 職場のパソコンで作業しているため、現在手元にデータがなく、参考となる画像がつけられずに分かりづらいとは思いますがご回答頂けると助かります。 よろしくお願いします。

  • 夜勤勤務に関する法律って・・・

    自分は都内の介護老人保健施設に勤務している介護職員です。 今年当初から勤務がハードな状況が続いています。というのも夜勤があるんですが夜勤の明けには休日だったんですが夜勤の明けの翌日が日勤になるような勤務表が組まれたりしてます。 例えば 月曜 夜勤入り     火曜 夜勤明け     水曜 日勤 夜勤1630~翌9:00 日勤8:30~17:00 という感じです 夜勤明け後日勤でもいいんでしょうか

  • エクセルでの重複検索のやり方を教えてください。

    エクセルで顧客管理表を作っています。 第1のシートは、販売ログをとるシートで顧客名・顧客番号・販売額・販売日時を入力しています。 第2のシートは、顧客台帳として利用しようと考えてます。第1のシートからvlookupで複数販売している場合も顧客番号でならべ、sumifで顧客ごとの総販売額を算出させてます。 ここで質問ですが、複数回、販売した顧客の最新販売日時を 顧客台帳(第2のシート)に表示させる方法を 教えていただけませんか? また、顧客ごとの販売回数を表示する方法(1回に複数個販売する場合は、1回とする。 販売日時が違うものをカウントする。) 第1のシート 顧客番号 名前 販売日時 1 赤星 9月13日 3 浜中 9月14日 4 藤本 9月15日 5 鳥谷 9月16日 2 今岡 9月17日 4 藤本 9月18日 5 鳥谷 9月19日 2 今岡 9月20日 6 金本 9月21日 3 浜中 9月22日 4 藤本 9月23日 1 赤星 9月24日 3 浜中 9月25日 4 藤本 9月26日 5 鳥谷 9月27日 2 今岡 9月28日 第2のシート(顧客台帳) 顧客番号 顧客名 販売回数 ?最新販売日時 ? 1    赤星 2    今岡 3    浜中 4    藤本 5    鳥谷 6    金本 宜しくお願いします。

専門家に質問してみよう