[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『シフト表の作成につきまして』(今泉)
現在、介護施設でのシフト表の作成支援システムを作成しています。
行き詰ってしまったので質問させてください。
シート1にシフト表
シート2に職員の勤務表
があります。
〇シフト表のイメージ
A B C ~ AQ 1 10/1 2 8:00 8:15 ~ 18:00 3 職員1 4 職員2 5 職員3 6 職員4 7 職員5
・A1セルにシフト表を作成する日
・2行目に8:00~18:00まで15分おきのタイムチャート
〇勤務表のイメージ
A B C D E F G H ~ AI 1 始業 終業 休憩 01 02 03 04 ~ 31 2 職員1 09:00 17:00 1.0 出 出 休 出 出 3 職員2 08:00 17:00 1.0 P 出 出 P 出 4 職員3 13:00 17:00 0.5 出 出 休 出 出 5 職員4 09:00 13:00 0.0 出 出 休 出 出 6 職員5 08:00 17:00 1.0 休 出 出 出 出
・A2~全職員の名前
・B2~各職員の業務開始時間
・C2~各職員の業務終了時間
・D2~各職員の休憩時間
・PとはPM休み、12:00で業務終了
1 職員取込のボタンをシフト表の1行目のW列あたりに配置
2 ボタンをクリックすることでA1の日付に出勤の職員(勤務表の出、Pの人)をシート1のA3以下に転記
3 各職員の開始時間までと終了時間以降の行を黒く塗りつぶす
上記内容を自動化したいのですが、可能でしょうか。
特にPの人の自動塗りつぶしの時間帯の変更は実現可能なのでしょうか?
以下にこちらがネットで検索したコードを少々調整したものを貼らせていただきます。
Sub 勤務表取込()
'勤務表から当日出勤者を抽出して行動表に反映させる
'抽出元の1F勤務表マスタ、2F勤務表マスタのB3〜B40まで名前を参照
'抽出先は1F行動表、2F行動表のB3以下
Dim gyo1 As Integer '変数の定義 1F勤務表マスタの行番号をカウント
Dim gyo2 As Integer '変数の定義 1F行動表の行番号をカウント
Application.ScreenUpdating = False '画面更新の無効
Worksheets("1F勤務表マスタ").Select '1F勤務表マスタを選択
If Range("i" & gyo1) = "出" Then '抽出データの出か判定
Worksheets("1F行動表").Range("a" & gyo2) = Range("a" & gyo1) '1F行動表に編集する
gyo2 = gyo2 + 1 '1F行動表の編集する行を次の行にする
ElseIf Range("i" & gyo1) = "P" Then '抽出データのPか判定
Worksheets("1F行動表").Range("a" & gyo2) = Range("a" & gyo1)
gyo2 = gyo2 + 1 '1F行動表の編集する行を次の行にする
ElseIf Range("i" & gyo1) = "A" Then '抽出データのAか判定
Worksheets("1F行動表").Range("a" & gyo2) = Range("a" & gyo1)
gyo2 = gyo2 + 1 '1F行動表の編集する行を次の行にする
End If
gyo1 = gyo1 + 1 '参照するデータを1行ずつ増やす。
Loop
Application.ScreenUpdating = True '画面更新を有効にする
End Sub
I列の出勤データの抽出しかできていません。
日付の指定と塗りつぶしは実装できていません。
もし可能でしたらご教授をお願いいたします。
< 使用 Excel:Excel2016、使用 OS:Windows10 >
・コーディングの中では2シートしか名前が出てきませんが、条件を読むと7シートもあります。どれとどれが同じシートで、合計何シートなのですか?
・ボタンを押すと、シフト表の情報を、勤務表の日付列に転記するようですが、転記元はシフト表であり、I列に「出」「P」「A」と書いてあるのですか? 列は時間であり、I列に特別な意味があるようには見えないのですが…。
・シフト表のA列、つまり職員名を、勤務表のA列に代入しているようですが、A列はどちらも最初から手入力されているのではないのですか? 名前だけ転記しても、全く意味のない表にしかならないと思うのですが…。
・職員3は、常に13:00からなのですか? ならば毎日Pにしても良いのでは?
コードを全く無視してレイアウトだけ見ると、勤務表の始業と終業に応じてシフト表のセルを塗りたいのかなぁ?、と思えるのですが、毎日同じ時間ならば、塗りつぶしても毎日同じ結果にしかならず、15分で1列使っている意味が判りません。(午前と午後の2列で足りたり?) 15分単位で塗りたいならば、休み時間はどう判定し、どう塗るのでしょう?(0の人とか0.5の人とか…)
休息も何時から何時までとか決まっているのですかね? シフトというくらいなら時間をずらしそうですが、それを表現する元データがありません。
何をどうしたいのか決める前にコーディングし始めてしまって、わけが分からなくなっているという印象です。 どういう元データから、どういう出力にしたいのかのレイアウトを明らかにしましょう。 そして、現状は一人につき始業、終業の時間は1つですが、実は毎日、始業と終業の時間は変わってきたりしませんか? 現状の表で、実態を表現しきれていないならば、何を作っても無駄に終わってしまうので、まずは出力結果のレイアウトから考えてみてください。
(???) 2018/10/03(水) 16:29
'"シフト表"と"勤務表"の2シート構成が前提 Dim col As Long, i As Long, d, r As Range, c As Range, s As Date, e As Date d = Sheets("シフト表").Range("A1").Value Sheets("シフト表").Cells.Clear Sheets("シフト表").Range("A1").Value = d Set r = Sheets("シフト表").Range("B2") r.Value = TimeValue("8:00:00") r.NumberFormatLocal = "h:mm;@" Do Set r = r.Offset(, 1) r.Value = DateAdd("n", 15, r.Offset(, -1).Value) r.NumberFormatLocal = "h:mm;@" If r.Value = TimeValue("18:00:00") Then Exit Do Loop For Each c In Sheets("勤務表").Rows(1).SpecialCells(2) If Val(c.Text) = Day(Sheets("シフト表").Range("A1").Value) Then col = c.Column: Exit For Next c If col = 0 Then MsgBox "該当日がありません": Exit Sub For Each c In Sheets("勤務表").Columns(col).SpecialCells(2) Select Case Trim(c.Value) Case "出" Sheets("シフト表").Range("A" & i + 3).Value = c.EntireRow.Cells(1) s = c.EntireRow.Cells(2).Value e = c.EntireRow.Cells(3).Value For Each r In Sheets("シフト表").Rows(2).SpecialCells(2) If r.Value < s Then Sheets("シフト表").Cells(i + 3, r.Column).Interior.Color = vbBlack If r.Value > e Then Sheets("シフト表").Cells(i + 3, r.Column).Interior.Color = vbBlack Next r i = i + 1 Case "P" Sheets("シフト表").Range("A" & i + 3).Value = c.EntireRow.Cells(1) s = c.EntireRow.Cells(2).Value e = TimeValue("12:00:00") For Each r In Sheets("シフト表").Rows(2).SpecialCells(2) If r.Value < s Then Sheets("シフト表").Cells(i + 3, r.Column).Interior.Color = vbBlack If r.Value > e Then Sheets("シフト表").Cells(i + 3, r.Column).Interior.Color = vbBlack Next r i = i + 1 End Select Next c End Sub (mm) 2018/10/04(木) 10:41
混乱させてしまい申し訳ございません。
当事業所は2階立てで、毎日の勤務表とシフト表が1Fと2Fで分かれておりましたが、質問文ではその旨にふれておりませんでした。
大変わかりにくい内容となってしまいお詫び申し上げます。
コードの中の
勤務表
1F勤務表マスタ
2F勤務表マスタ
1F行動表
2F行動表
これを置換するのを忘れておりました。
職員の勤務表=
勤務表(1Fと2Fを混合させたもの)
1F勤務表マスタ
2F勤務表マスタ
シフト表=
1F行動表
2F行動表
また、勤務の種類に関しましても漏れがございました。
「出」……勤務表の始業〜終業
「P」……始業〜12:00まで
「A」……13:00〜終業まで
始業と終業は特例を除きこのパターンのみです。
以下、ブックの内容と行いたい作業の流れです。
・シート1「シフト表」(1F用と2F用)
・シート2「勤務表」(1F用と2F用)
1 シフト表のA2以下は最初は空欄。
2 シート1「シフト表」のA1に、作成したい日付を手入力
3 シート2「勤務表」内に設置したボタンを押す
4 シフト表のA2以下に、A1の日に出勤する職員名を転記したい
5 同時に勤務時間以外の部分を塗りつぶしたい
ボタンに埋め込んだコードではI列の勤務日の出勤職員は抽出できるのですが、
シート2の1行目からシート1のA1の日付と同じ日付を選択して勤務する職員を抽出、というコードが作成できていなかったのです。
15分単位で列を使っているのは、業務時間内に15分単位で行う勤務がある為です。
1Fと2Fは勤務内容が大幅に違い、行き来もないため別ファイルにしています。
職員抽出と勤務時間の反映を行った後、塗りつぶしていない部分に一日の業務を組み込むのです。
休憩時間もその業務時間内になるべく被りすぎないように11:30〜13:00の間に配備しています。
業務内容と休憩の配備は現状、手作業ですが、あまりにも業務内容が多すぎる事から、まずその前段階の
当日出勤予定の職員の抽出を行いたかったというわけです。
現在はすべてを目視確認の手作業で行っております。
もしよろしければ、上記内容からご教授いただくか、まだ足りていない情報がございましたら教えて頂ければ幸いです。
?o様
ご返信ありがとうございます。
早速試させていただきます。
分かりづらい情報で申し訳ございませんでした。
(今泉) 2018/10/04(木) 10:59
mm様のコードで目的が達成されました。
ありがとうございました。
???様もご指導まことに為になりました。
とても助かりました。
後学のためにも参考とさせていただきます。
(今泉) 2018/10/04(木) 14:25
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.