• 締切済み

エクセル関数:シフト表を超過勤務表へ入力したい

エクセルシート1に勤務表、シート2に超過勤務一覧表を作っています。 勤務形態としてはA,B,C,AB,BCの5種類あり、 週2回A,B,Cの各2名の6人体制(7時間労働が6人)、週5回はAB2名,BC2名の4人体制(8時間労働が4名)で動いています。 A,B,Cという勤務体制とAB,BCという勤務体制が混ざることはありません(例:2月10日に田中さんがA,同日に佐藤さんがBCという勤務体制はあり得ない) この週5回のAB,BCという勤務体制の日については1時間の残業が発生しているため、その管理を超過勤務一覧表にて管理しています。(A,B,Cという勤務体制の日については残業が発生していないため管理はしていません。) 超過勤務一覧表ではセルA1,2,3,,,に日付、B1,2,3,,,に名前、C1,2,3,,,に勤務時間(例:ABであれば19:00~20:00、BCであれば20:00~21:00というように記載)、D1,2,3,,,に残業時間数(毎回ほぼ決まって1時間)を記入しています。 現在はシート1の勤務表をプリントアウトし、それを片手に持ちシート2の超過勤務一覧表へ毎回手入力していますが、少しでも業務負担をはかりたく、 IF関数やVLOOK関数などについて調べてみましたがうまくできませんでした。 勤務表にて2月10日に田中さんと佐藤さんがABという勤務形態、鈴木さんと田中さんがBCという勤務形態として働いた場合、それを上述のような一覧表に一部分でもいいので自動入力できるような関数はありませんでしょうか? すべて手入力の状況から少しでも脱することができればと思っています。よろしくお願いします。

みんなの回答

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.5

関数では、大変なので、「VBScript」でプログラムを書きました。 前提条件は、「勤務表.xls(.xlsx)」(名前は何でも問題ありません)の「シート1」は、 2月勤務表(←セル「A1」ですが、「B1」などとセル結合していても可、必ず頭に「月」を入れておいてください) ◆10◆11(←「A2」は空白で「B2」から日付が入っている) 曜日◆水◆木(←3行目は「曜日」) 田中◆AB◆AB(←4行目から人名や勤務体制) 佐藤◆BC◆AB 鈴木◆AB◆BC 高橋◆BC◆BC 「シート2」(左から2番目にシート)の、7行目には「(セル「A7」は空白◆日付◆氏名◆業務内容◆超過勤務時間◆時間数◆備考」という項目名がすでに入っているものとします(セル「B7」から「日付」、「氏名」~と入っている、ということ)。 以下のプログラムを範囲指定して、「Ctrl+c」(コントロールキーを押しながら「c」(コピー・記憶)を押す)、テキストエディタかメモ帳を立ち上げて、そこで「Ctrl+v」(ペースト・貼り付け)します。 名前は何でもいいのですが、拡張子は必ず「~.vbs」というように「vbs」とします(例えば、「Shukei.vbs」。 適当なフォルダを作り、「勤務表.xlsx」と、「Shukei.vbs」だけをそのフォルダに入れ、「Shukei.vbs」ファイルをダブルクリック(もしくは、シングルクリック→「Enter」の方がより確実)すると、「シート1」の「A1」セルから「月」を取り込んで、「~月勤務表.xlsx」(例えば「2月勤務表.xlsx」)という名前で同じフォルダに保存します。 「2月勤務表.xlsx」を開き、「シート2」を開いてみてください。 できるだけのことはしてあります。 Option Explicit Dim a, b, c, d, e, i, j, k, m, n, u, v, w, x, y, z Set u = CreateObject("Scripting.FileSystemObject") Set v = u.GetFolder(".") Set w = CreateObject("Excel.Application") For Each a In v.Files b = LCase(u.GetExtensionName(a.Name)) If b = "xls" or b = "xlsx" Then Set x = w.Workbooks.Open(v & "\" & a.Name) Set y = x.Worksheets(1) Set z = x.Worksheets(2) m = Left(y.Range("A1").Value, InStr(y.Range("A1").Value, "月")) n = y.Range("A3").End(-4121).Row - 3 c = 7 d = 1 For j = 2 to y.Range("B2").End(-4161).Column d = d + 1 For k = 4 to 3 + n e = UCase(Trim(y.Cells(k, d).Value)) If e = "AB" or e = "BC" Then c = c + 1 z.Cells(c, 1).Value = c - 7 z.Cells(c, 2).Value = m & y.Cells(2, j).Value & "日" & _ "(" & y.Cells(3, j).Value & ")" z.Cells(c, 3).Value = y.Cells(k, 1).Value z.Cells(c, 4).Value = "2人勤務のため" z.Cells(c, 6).Value = "1h" z.Cells(c, 7).Value = y.Cells(k, d).Value End If Next Next x.SaveAs(v & "\" & m & "勤務表") x.Close w.Quit End If Next Set z = Nothing Set y = Nothing Set x = Nothing Set w = Nothing Set v = Nothing Set u = Nothing 結果は、こんな感じです。 ◆日付◆氏名◆業務内容◆超過勤務時間◆時間数◆備考 1◆2月10日(水)◆田中◆2人勤務のため◆◆1h◆AB 2◆2月10日(水)◆佐藤◆2人勤務のため◆◆1h◆BC 3◆2月10日(水)◆鈴木◆2人勤務のため◆◆1h◆AB 4◆2月10日(水)◆高橋◆2人勤務のため◆◆1h◆BC 5◆2月11日(木)◆田中◆2人勤務のため◆◆1h◆AB 6◆2月11日(木)◆佐藤◆2人勤務のため◆◆1h◆AB 7◆2月11日(木)◆鈴木◆2人勤務のため◆◆1h◆BC 8◆2月11日(木)◆高橋◆2人勤務のため◆◆1h◆BC

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

補足内容では処理に必要な要件を満たしていません。 画像を貼付して頂きましたが質問の文言と一致していません。 また、備考の「1?AB」の?の部分が読めません。 当方で勝手解釈の内容を貼付画像のように処理してみました。 日付のB列 Sheet2!B8=IFERROR(INDEX(Sheet1!$B$2:$AF$2,SMALL(INDEX(((Sheet1!$B$4:$AF$7="AB")+(Sheet1!$B$4:$AF$7="BC"))*(COLUMN(Sheet1!$B$4:$AF$4)-1)+(Sheet1!$B$4:$AF$7<>"AB")*(Sheet1!$B$4:$AF$7<>"BC")*100,0),ROWS(B$8:B8))),"") 氏名のC列 Sheet2!C8=IFERROR(INDEX(Sheet1!$A$1:$A$7,SMALL(INDEX(((INDEX(Sheet1!$B$4:$AF$7,0,MATCH(B8,Sheet1!$B$2:$AF$2,0))="AB")+(INDEX(Sheet1!$B$4:$AF$7,0,MATCH(B8,Sheet1!$B$2:$AF$2,0))="BC"))*ROW(B$4:B$7)+(INDEX(Sheet1!$B$4:$AF$7,0,MATCH(B8,Sheet1!$B$2:$AF$2,0))<>"AB")*(INDEX(Sheet1!$B$4:$AF$7,0,MATCH(B8,Sheet1!$B$2:$AF$2,0))<>"BC")*100,0),MOD(ROWS(C$8:C8)-1,4)+1)),"") 備考のG列に"AB"または"BC"の文字列のみのとき Sheet2!G8=IFERROR(INDEX(INDEX(Sheet1!$B$1:$AF$7,0,MATCH(B8,Sheet1!$B$2:$AF$2,0)),SMALL(INDEX(((INDEX(Sheet1!$B$4:$AF$7,0,MATCH(B8,Sheet1!$B$2:$AF$2,0))="AB")+(INDEX(Sheet1!$B$4:$AF$7,0,MATCH(B8,Sheet1!$B$2:$AF$2,0))="BC"))*ROW(B$4:B$7)+(INDEX(Sheet1!$B$4:$AF$7,0,MATCH(B8,Sheet1!$B$2:$AF$2,0))<>"AB")*(INDEX(Sheet1!$B$4:$AF$7,0,MATCH(B8,Sheet1!$B$2:$AF$2,0))<>"BC")*100,0),MOD(ROWS(C$8:C8)-1,4)+1)),"") その他の項目については条件が不足していますので数式の提言ができません。

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.3

「シート1」の勤務表がどのように入力されているのか補足してください。 そのとき、必ず、具体的にお願いします。 例えば、1行目は項目行で、 「A」列が名前、「B」列が「A, B, C, AB, BCの別」、「C」列が勤務時間。 また、勤務時間のどのように入力しておられるのか、具体的に補足してください。

kuuuu0323
質問者

補足

ありがとうございます。サンプル画像を張り付けてみました。ピンクで色分けしているのは色付きAB,BCと色なしAB,BCとでペアになって動くという意味であり、これを超過勤務一覧表に表記する際に上から順にAB,BC,AB,BCとなっていなくても、たとえばAB,AB,BC,BCとなっていて構いません。引き続き回答賜りますとうれしいです。

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

>勤務表にて2月10日に田中さんと佐藤さんがABという勤務形態、鈴木さんと田中さんがBCという勤務形態として働いた場合、それを上述のような一覧表に一部分でもいいので自動入力できるような関数はありませんでしょうか? 田中さんは同姓の2名でしょうか? 同姓であればフルネームで提示してください。 タイプミスであれば代わりの姓を提示してください。 2月10日 田中さん=AB ←┐ 佐藤さん=AB  │ 鈴木さん=BC  │ 田中さん=BC ←┘ 尚、勤務表と超過勤務一覧表の模擬データを提示して頂かないと具体的な数式の提案が難しいでしょう。 無駄な提案を避けたいので模擬データを提示されてから提案します。

kuuuu0323
質問者

補足

ありがとうございます。サンプル画像を張り付けてみました。ピンクで色分けしているのは色付きAB,BCと色なしAB,BCとでペアになって動くという意味であり、これを超過勤務一覧表に表記する際に上から順にAB,BC,AB,BCとなっていなくても、たとえばAB,AB,BC,BCとなっていて構いません。引き続き回答賜りますとうれしいです。

  • f272
  • ベストアンサー率46% (7995/17090)
回答No.1

シート1の勤務表にはどのように記載されているのかわからないと,具体的な式は作れません。しかし,シート1を目で見ながら超過勤務一覧表に書き込めるのだから,それを自動化することは可能です。

kuuuu0323
質問者

補足

ありがとうございます。サンプル画像を張り付けてみました。ピンクで色分けしているのは色付きAB,BCと色なしAB,BCとでペアになって動くという意味であり、これを超過勤務一覧表に表記する際に上から順にAB,BC,AB,BCとなっていなくても、たとえばAB,AB,BC,BCとなっていて構いません。引き続き回答賜りますとうれしいです。

関連するQ&A

  • エクセル2011でシフト表を・・・

    出勤時間時間を”A列”に 退勤時間を”B列”にした時 ”C列”に実務時間(退勤時間から出勤時間を引いたもの)を ”D列”に超過勤務(9:00以上の勤務時間) A1=10:30、 B1=23:30 C1=B1-A1(=13:00) D1=C1-(9/24)でいいのですが・・・ 勤務時間が9:00に満たない場合、 表示したくはないのですが、 どのようにすればいいでしょうか? わかりづらくてすいません・・・

  • Excelで勤務表を作りたいのですが

    Excelで勤務表を作りたいのですが、なかなか関数がうまく使えません。 時間計算をご存知の方、教えて下さい。 入力列 A:出勤時刻 B:退勤時刻 C:勤務開始時間 *始業9:00のため、9時より以前の出勤時刻は9:00、9:00以降の出勤はその時刻を表示する。 D:休憩時間 E:実働時間(始:C/終:B/マイナス:D) F:時間内勤務(8時間まで) G:時間外勤務(8時間を超過したところから・22時迄) H:深夜残業(22時以降の勤務時間) このような説明でお分かり頂けるでしょうか。 よろしくお願いします。

  • エクセルでの表作成について

    エクセルを使って勤怠一覧を管理しています。 シート1のA1には所属部門名・B1には氏名、そしてC3には残業時間が入力されています。 この一覧をシート2のA2からC2には総務部・残業時間・氏名を表示。 そして、1行空けてE1からG1には営業部・残業時間・氏名を表示するように表を作成したいのですが、エクセルの機能を使って簡単にシート2にこれらの表を作成する事は可能でしょうか。 ご存じの方、いらっしゃればご教授願います。

  • エクセルの勤務表計算の関数を教えて下さい。

    会社の勤務表の入力を改良したいのですが、うまくいきません。 詳しい方教えていただけると助かります。宜敷願いします。 まず、勤務時間のトータル時間数が6時間以下の時は休憩は0時間。 17:30迄なら1:00。 17:31~18:00迄は1時間+17:30を超過した分を1分単位でプラスする。 例えば、17:45なら1:15。 18:00を過ぎたら1:30という感じに休憩の欄に表示がしたいです。 B1に出勤時間、C1に退勤時間、D1に休憩時間という入力表になっています。 宜しくお願いします。

  • Excel 勤務管理表の作成

    Excel2000で勤務管理表を作成しようとしています。 If関数を使って作成しようとしているのですが、うまくいきません。 わかりにくい説明ですが、よろしくお願いします。 A列に実働時間。(昼休みは抜いています)を入力するとB列C列に自動で入るようにしたいです。 B列に7.75内(通常勤務)の時間が入るようにする。 C列に残業時間が入るようする。 ※7.75hを過ぎると0.25h休憩をしなくてはならず、残業は8時間からしかつきません。 (例) A列       B列     C列 実働時間    7.75内    残業 7.75       7.75      0 8          7.75     0 8.25        7.75     0.25

  • エクセル シフト勤務表から、シフト別に氏名を抽出。

    エクセルで、マクロを使わずに、やってみたいのです。 シフトの勤務表があります。 B4~B18に氏名が入ってます。 Cが、1日で AGが、31日です。 C4~AG4 C18~AG18 ここに、勤務予定が入ってます。 日(日勤) 準(準夜勤) 深(深夜勤) とかです。 ここで、別シートに、 準夜勤の氏名一覧表を、作りたいのです。 1日は C4 C5 C6 ここに、氏名が出るようにしたいのです。 2日は、 D4 D5 D6 です。 最初に書きましたが、マクロは使えないので、(能力不足) 使わずにできる方法を、教えてください。 よろしくお願いします。

  • シフト表をエクセルで出来ますでしょうか?

    飲食業のシフト表作成で困っています。 A4:A28までは名前 B列はスタッフの始業時間 C列は就業時間 D3には9:00 E3は9:30 ・・・AB21:30 どの時間帯にスタッフが多いのか少ないか等を把握したくて「条件付き書式」の「数式が・・・」に =AND($B4<=D$3,$C4>D$3)を入力して 勤務時間帯の空白セルに色を付ける所までなんとか出来たのですが、 確認作業をしていたら14:00以降が正しく認識されず、就業時間が14:30なのに15:00まで色付けされたり、認識されずセルに色が付かない時間帯のセルがあるのですが原因が全く分かりません。新しいシートに作成し直したり、セルの書式設定を時刻に直したりと色々やってみたのですが改善されず困っています。 何かよい方法や原因がわかる方がいらしたら教えていただきたいです。宜しくお願い致します。

  • エクセル2011でシフト管理表作ってますが・・・

    出勤時間時間を”A列”に 退勤時間を”B列”にした時 ”C列”に実務時間(退勤時間から出勤時間を引いて、一時間分の休憩を引いたもの) ”D列”に超過勤務(実務時間が9:00以上の勤務時間) A1=10:30、 B1=23:30  C1==IF(OR(B1="",A1="",AND(B1="",A1="")),"",B1-A1-(1/24)) ※=12:00 (※B1-A1-(1/24)は一時間休憩のため) D1の数式はどのようにしたらいいでしょうか? ※勤務時間が9:00に満たない場合、また=0のとき VALUE!、0:00を出さず、空欄表示にしたいのですが・・・ お願いいたします

  • エクセルでシフト管理と勤務表を作成したい

    いろいろフリーソフトを探しましたがぴったりくるものがありませんでした。 作り方を教えて頂ければ幸いです。よろしくお願いいたします  A列:シフトパターン(A13:00~18:00、B10:00~18:00、C9:00~18:00)  B列:実際の出勤時間(手入力)  C列:実際の退社時間(手入力)  D列:実際の休憩時間(手入力)  E列:実働時間(B・C列から時間を読み取って自動計算)  F列:法廷内残業時間(A列からシフト外で勤務した時間の自動計算)  G列:法定外残業(8時間を超えて勤務した時間の自動計算)

  • EXCEL 勤務表作成(長文です)

    今回、新たに皆様の助力を戴きたく投稿いたします。 当方、職場の勤務表を作成することになり、ただ単に、打ち込むことは (誰でも)できるのですが、もう少し効率よくできないものかと模索しておる次第です。あくまで理想論として以下に例を記します。 宜しくお願い致します。 例(sheet1) A列|B列|C列|D列|E列|F列 勤務者1 |勤務者2 |勤務者3 日 |   |夜 |   |明 | (sheet2) A列|B列|C列|D列|E列|F列 勤務者1 |勤務者2 |勤務者3 8.0|   |   |9.0 |  |7.0 (伝わらないかもしれませんが)上記の様式を仮としまして・・・ 要領は(sheet1)の3行目~下に向かって各自の勤務形態を日々 「日(日勤)」、「夜(夜勤)」...etc のように打ち込んでいくと (sheet2)の3行目以下が自動で時間が表示されるようにしたいのです。 結果的には「勤務形態を打ち込んだsheet」と「実際の勤務時間が 打ち込んであるsheet」ができればいいのですが・・・ 質問は2点です。 (1)この理想は実現可能なんでしょうか? 可能であればどんな関数を使用するのでしょうか? (2)勤務者名が2行にまたがって表示しているのは意味がありまして、 合計時間の集計上「夜」や「明」(夜勤関連の勤務)は (sheet2)のように隣の行に表示させたいのです。 これも可能ですか?これが無理でも仮に(1)が可能ならば、 (sheet1)に打ち込む時点で隣の行に打ち込めば可能だと思うの ですが・・・ 繰り返しになりますが、ひたすら打ち込めば2枚のsheetを作成する ことは可能だと思います。ただ、勤務者がかなり多いことと、勤務階ごとに作成しなければならない状況がありまして、 なんとか効率よくできないものかと困っている次第です。補足はいくらでもしますので宜しくお願い致します。

専門家に質問してみよう