[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『勤務表 5日締めと末締めファイルを1回で作成したい』(ひまわり)
現在、5日締めと末締めのエクセルファイルがあり全く同じ内容を
書いて社内に提出しています。
末締め分は、月末で終わっていて5日締めようにもここに書いたことと
同じことを再度入力しています。1日〜5日分が増えているだけです。
1つのエクセルファイルで、月末締めと5日締めを完結することが出来たら
嬉しいのですが何か良い方法はありませんか?
< 使用 Excel:Excel2016、使用 OS:Windows10 >
一つのシートに全てを入力と言うのは一年分を一つのシート
にする感じですか?
マクロ・・・。
未知の世界ですが、マクロで実現できるのでしょうか?
(ひまわり) 2019/09/07(土) 11:51
作業のイメージがキッチリとつかめてないですが、
5日締めを作る時は、月末分に1日〜5日分を増やして、 [ファイル] →[名前を付けて保存]と進んで、 「5日締め」用のファイル名にするだけでいいんじゃないですか?
そうは行かない場合、もう少しそちらの状況を詳しく説明して貰えませんか。
(半平太) 2019/09/07(土) 12:02
5日締めを作る時は、月末分に1日〜5日分を増やして、
→これは、めんどくさいです。
現時点で、会社が用意した末締めと5日締めのエクセルファイルがあるので
それを使う方が良いです。
勤務表なので、当日の勤務時間の合計と一か月分の勤務時間の合計の式が
組まれています。
たぶん、社内の人がネットで落としたものを会社として使用してます。
入社時期によって締め日がまちまちです。
(全国に、散らばってもいます。)
なので、私の場合は末締めと5日締めを提出しなければいけません。
エクセルファイル2つありそれぞれに同じようを記載して5日締めは1〜5日分だけは
5日締めの方にだけ記載します。
でも、同じことを2回書いているってそもそも無駄ですよね。
会社も、分かっているようですがなかなか分かる人がおらず(分かる人が辞めてしまったので)
進んでいない状況です。
なので、個人的に作成してしまおうと思っています。
(ひまわり) 2019/09/07(土) 12:30
末 締 9/1 〜 9/30
5日締 9/1 〜 10/5
の日別勤怠を10/5を過ぎてから、別bookで纏める、ではないの
でしょうか。
もしそうでしたら、半平太さんのご案内の通り、最初は10/1分を入
力する前に、にファイル名【末締】で保存し、10/5日を超える、日
に10/1〜10/5分を入力後【5日締】のファイル名でそのまま保
存すれば、二回入力は避けられるかと、違っていましたら、相違点をさ
らに詳しくご説明いただくと、多数、アドバイス、回答等、有るかもし
れません。 ← 多分 ^^; でわ
(隠居じーさん) 2019/09/07(土) 13:50
末締めは、9月1日〜9月30日ですが
5日締めは、9月6日〜10月5日までです。
(ひまわり) 2019/09/07(土) 16:13
(隠居じーさん) 2019/09/07(土) 17:24
提出用のシートがどのようなものかわからないので、何とも言えませんが
勤務データ入力用のシートを用意しておいて、通常はそれに入力しておいて 提出時には、そこから必要範囲を 締日に合わせてコピペすればいいと思いますが はずしてますか?
(渡辺ひかる) 2019/09/07(土) 18:28
こんにちは ^^ いや〜 情報が詳細不明なので 恐怖の憶測と推測の、冗長なコードに ← 情報に関係ないだろ (^^;。。。 きっともっとスマートな方法は有るかと思いますがマクロの便利さ等 お解り戴ける一助とでもなれば幸甚です、多分大的外れかも m(_ _)m Sheet1 Sheet2 Sheet3 以外のシートは削除されます。 必ずバックアップは取りましょう。
使用情報 シート名 Sheet1
Sheet1 テスト使用情報
|[A] |[B] |[C] |[D] |[E] |[F] |[G] |[H] [1] |日付 |出勤|退勤 |拘束時間|休憩|不就労|残業|深夜 [2] |7月31日|8:10|19:39|11:29 |1:00|0:00 |3:29|0:00 [3] |8月1日 |7:43|18:39|10:56 |1:00|0:00 |2:56|0:00 [4] |8月2日 |7:33|19:30|11:57 |1:00|0:00 |3:57|0:00 [5] |8月5日 |7:11|18:25|11:14 |1:00|0:00 |3:14|0:00 [6] |8月6日 |8:04|19:17|11:13 |1:00|0:00 |3:13|0:00 [7] |8月7日 |9:10|19:24|10:14 |1:00|0:00 |2:14|0:00 [8] |8月8日 |9:45|19:48|10:03 |1:00|0:00 |2:03|0:00 [9] |8月9日 |8:31|19:08|10:37 |1:00|0:00 |2:37|0:00 [10]|8月12日|8:03|19:59|11:56 |1:00|0:00 |3:56|0:00 [11]|8月13日|9:18|18:05|8:47 |1:00|0:00 |0:47|0:00 [12]|8月14日|7:57|18:07|10:10 |1:00|0:00 |2:10|0:00 [13]|8月15日|8:36|19:08|10:32 |1:00|0:00 |2:32|0:00 [14]|8月16日|8:14|18:34|10:20 |1:00|0:00 |2:20|0:00 [15]|8月19日|8:00|19:59|11:59 |1:00|0:00 |3:59|0:00 [16]|8月20日|7:26|18:46|11:20 |1:00|0:00 |3:20|0:00 [17]|8月21日|7:10|19:46|12:36 |1:00|0:00 |4:36|0:00 [18]|8月22日|9:43|18:51|9:08 |1:00|0:00 |1:08|0:00 [19]|8月23日|8:21|18:01|9:40 |1:00|0:00 |1:40|0:00 [20]|8月26日|9:10|19:32|10:22 |1:00|0:00 |2:22|0:00 [21]|8月27日|7:50|19:35|11:45 |1:00|0:00 |3:45|0:00 [22]|8月28日|7:47|18:57|11:10 |1:00|0:00 |3:10|0:00 [23]|8月29日|8:44|19:18|10:34 |1:00|0:00 |2:34|0:00 [24]|8月30日|8:10|18:50|10:40 |1:00|0:00 |2:40|0:00 [25]|9月2日 |8:10|18:35|10:25 |1:00|0:00 |2:25|0:00 [26]|9月3日 |7:12|18:07|10:55 |1:00|0:00 |2:55|0:00 [27]|9月4日 |7:20|19:16|11:56 |1:00|0:00 |3:56|0:00 [28]|9月5日 |9:45|18:18|8:33 |1:00|0:00 |0:33|0:00 [29]|9月6日 |8:11|18:45|10:34 |1:00|0:00 |2:34|0:00 [30]|9月9日 |9:09|19:28|10:19 |1:00|0:00 |2:19|0:00 [31]|9月10日|7:55|18:49|10:54 |1:00|0:00 |2:54|0:00
Option Explicit Sub OneInstanceOfAttendanceTable() Dim i As Long Dim Base As Range Dim Sm, WsNm Dim Fromd(1 To 2) As Date Dim Tod(1 To 2) As Date WsDelete Sm = Application.InputBox("処理年月を数値で入力", "V B A", Year(Date) & Month(Date) - 1, , , , , 1) If Sm = False Then Exit Sub Sm = Left(Sm, 4) & Chr(2) & Mid(Sm, 5) Fromd(1) = DateSerial(Split(Sm, Chr(2))(0), Split(Sm, Chr(2))(1), 1) Tod(1) = DateSerial(Year(Fromd(1)), Month(Fromd(1)) + 1, 0) Fromd(2) = DateSerial(Split(Sm, Chr(2))(0), Split(Sm, Chr(2))(1), 6) Tod(2) = DateSerial(Year(Fromd(1)), Month(Fromd(1)) + 1, 5) If Tod(2) >= Date Then MsgBox "5日締、締切日未到達です" Exit Sub End If WsNm = Array("Dumy", "末締", "5日締") For i = 1 To 2 Worksheets("Sheet1").Copy Worksheets(1) With ActiveSheet .Name = WsNm(i) Set Base = .Cells(1).CurrentRegion .Cells(1, 10).Resize(, 2) = "日付" .Cells(2, 10).Resize(, 2) = Array(">=" & Fromd(i), "<=" & Tod(i)) Base.AdvancedFilter 2, .Range("J1:K2"), .Cells(1, 15) .Range("A:N").Delete End With Next Set Base = Nothing End Sub Private Sub WsDelete() Dim i As Long Application.DisplayAlerts = False For i = ThisWorkbook.Worksheets.Count To 1 Step -1 If Worksheets(i).Name <> "Sheet1" And _ Worksheets(i).Name <> "Sheet2" And _ Worksheets(i).Name <> "Sheet3" Then Worksheets(i).Delete End If Next Application.DisplayAlerts = True End Sub
14:20 一部、修正 m(_ _)m .FilterMode = False エラーにはなりませんが、確か調べるだけで設定は出来ない様な。 というか、↑コードではフイルターモードになっていないようです。? なにげに使っていますが、勉強します。 (隠居じーさん) 2019/09/08(日) 13:49
フォーマット(セル位置)が異なっているため
データは同じでも、それぞれに入力しているということでしょうか。
(マナ) 2019/09/08(日) 15:01
マナ様
どちらも、フォーマットは同じです。
8月1日から始まっているか,8月6日から始まっているかの違いだけです。
(ひまわり) 2019/09/08(日) 15:49
決まったフォーマットシートに対して書き込むことも可能ですか??
(ひまわり) 2019/09/08(日) 15:54
こんにちは ^^ >>中身が消えてしまいます。 >>↓最終的にこのタイトルだけになってしまいます。 >>日付 出勤 退勤 拘束時間 休憩 不就労 残業 深夜 え〜と、考えられる原因としては 1.A列の日付情報がシリアル値ではない 2.A列の項目名が【日付】ではない 3.指定した年月の情報が無い 4.Sheet1の情報が提示させていただいた情報の位置と違っている 等、が考えらられます。ご確認、お願いいたします。 では m(_ _)m >>決まったフォーマットシートに対して書き込むことも可能ですか?? 読込、書込み双方のセル番地対応(どのセルをどのセルへ)がわかれば可能 だと思いますです。 (隠居じーさん) 2019/09/08(日) 16:08
今は、上のサンプル勤務表のデータをエクセルデータにして
マクロを実行しています。
(ひまわり) 2019/09/08(日) 16:29
こんばんは ^^ はい 。。。 こちらでも同様にしています。大変済みません w。。。消えていますね 原因究明中 (◎_◎;) 解決出来次第再度アップ致します。 ま!なんとでも出来ますので。。。。 m(__)m
(隠居じーさん) 2019/09/08(日) 16:50
B D F G H I J K L M N O P |2019| |年| | 9|月度|氏名|〇〇〇〇| |部署| |
B P 5 |月|日|曜|休日|区分|出勤|退社|就業|早出残|普通残|深夜残|休出|遅刻||早退|備考| 8 6 火 7 水 8 木 ※日付入力領域は、36行目まで
※休日:1の時区分:休日,休日:空白の時区分:空白 ※出勤,退勤は、手入力 ※就業から早退までは、マクロで計算式が入っているみたいです。 (入力すると自動的に入力されます) ※B37セル(Bセル〜Hセルまで結合):「合計」 ※Iセル〜Oセルまで各合計が入ります。 ※P38セル:「担当確認印」
(ひまわり) 2019/09/08(日) 17:12
こんばんは ^^ なんとなく全体の輪郭の様なものが解ってきたような気がいたします。 ↑の私のコードはあまりお役に立てない様なので没にしておいてくだ さい。(現在バグッてますし) ( ̄▽ ̄);多分日付条件の書き方だとは 思うのですが。。。m(_ _)m
>>※出勤,退勤は、手入力 + 日付
だけエクセルに入力したものをベースに、5日、末、各シートの 日付に対応する出勤,退勤欄に転記する。 という事でしたら別途考えます、合わせて、他の方の回答もお待ちくださいね でわ、少し時間がかかりそぉなので ← 私だけ ^^;。。。失礼致します。 m(_ _)m (隠居じーさん) 2019/09/08(日) 17:56
>→これは、めんどくさいです。
なぜ、↑なのかが、理解できません。
>多分日付条件の書き方だと
見出しが一致していないだけです。
(マナ) 2019/09/08(日) 18:38
>>※出勤,退勤は、手入力 + 日付
だけエクセルに入力したものをベースに、5日、末、各シートの 日付に対応する出勤,退勤欄に転記する。
そんなイメージです。
宜しくお願いします。 (ひまわり) 2019/09/08(日) 18:52
>作成したい勤務表のデータが見つかりました。
これを会社に提出しているのですよね?
個人別に 一人 1シートなら、それぞれ 締め日が違っていると思いますので
>全く同じ内容を 書いて社内に提出しています。
というのはあり得ないと思いますが?
月末には、月末締めだけ、5日以降には 5日締めだけを提出しているのではないのですか?
(渡辺ひかる) 2019/09/09(月) 09:18
こんにちは ^^ 諸先生方はきっと、どうせ、何処かに一度は入力しないといけないわけで、二回しろとは決して 云っておられないのではないかと、8月1日〜8月31日を一度入力すれば、あとは5日〆のときは 8月6日〜8月31日はコピーペーストで貼り付ければあと5日分だけ入力すればいいだけなのでは と思います←この場合別の場所への下書き入力は必要が無いと思います。ま!運用面はさておき マクロのお勉強という事で作ってみましたので。何かの足しにでも。m(_ _)m 当初アップさせていただいたコードの不具合ですが項目名の(日付)の後ろに半角スペースの ゴミがあったのが原因でした。新作コード後ほどアップ致します。 (隠居じーさん) 2019/09/09(月) 16:50
例えば 月末締めのAさんがいるとして
月末締めの時にはAさんの 8/1-8/31 までのデータを提出すればよく 5日締めの時にはAさんのデータは提出しない と理解しているのですが
違うんですか?
>出勤,退勤の、時間は、同じでなければ いけません。
同じデータなら コピー 貼り付けすれば済むことだと思いますが それができない理由があるのでしょうか?
(渡辺ひかる) 2019/09/09(月) 16:58
任意のフォルダを作成して現在ご使用の 末締め若しくは5日締めのBOOKをどちらか 片方(同じフォーマットとの事ですので)を コピーして AtBase.xlsm と名前を変えて下さい 当該の書込をするシートを一番左端に移動するか 不都合が有るかもしれませんので下記の部分を 実際のシート名に変更してください。 Private Sub BookWriteSubMoveData の With Wb.Worksheets(1) ← を With Wb.Worksheets("実際のシート名")
その後、保存してください 次に 新規BOOKで名前は何でもよいので作成して今回提示させていただ いたコードを貼り付け、実行して下さい。休日、区分については詳細 が解りませんでしたので何もしていません。でわ
Sheet1 を勤怠入力に使用して保存してください。
A B C D 1 日付 出勤 退勤 休日 2 1月1日 8:30 18:01 3 1月2日 7:45 17:55 4 1月3日 1 Option Explicit Sub OneInstanceOfAttendanceTable02() Dim Bnm Dim Fromd(1 To 2) As Date Dim Tod(1 To 2) As Date Dim Base Dim t As Date t = Timer Bnm = Array("末締", "5日締") Pstart Accsept Fromd, Tod BookSet Bnm DataSet Base BookWrite Base, Bnm, Fromd, Tod Pend Erase Base MsgBox Format(Timer - t, "0.0") & "秒 完了" End Sub Private Sub BookWrite(ByVal Base As Variant, ByVal Bnm As Variant, ByVal Fromd As Variant, ByVal Tod As Variant) Dim i As Long Dim Var As Variant Dim Btbl As Variant For Each Var In Bnm Select Case Var Case "末締" Btbl = BookWriteSubDataDiv(Base, Fromd(1), Tod(1)) If TypeName(Btbl) = "Boolean" Then Erase Base MsgBox "書込み件数オーバー : " & Chr(13) & Var End End If BookWriteSubMoveData Var, Btbl Case "5日締" Btbl = BookWriteSubDataDiv(Base, Fromd(2), Tod(2)) If TypeName(Btbl) = "Boolean" Then Erase Base MsgBox "書込み件数オーバー : " & Chr(13) & Var End End If BookWriteSubMoveData Var, Btbl End Select Next Erase Btbl End Sub Private Sub BookWriteSubMoveData(ByVal Bnm As String, ByVal Btbl As Variant) Dim Wb As Workbook Dim i As Long Set Wb = Workbooks.Open(ThisWorkbook.Path & "\" & Bnm) With Wb.Worksheets(1) Intersect(.UsedRange, .Range("B:D"), .Range(.Rows(6), .Rows(36))).ClearContents .Range("B1") = Year(Btbl(1, 1)) .Range("F1") = Month(Btbl(1, 1)) For i = 1 To UBound(Btbl, 1) .Cells(i + 5, 2) = Month(Btbl(i, 1)) .Cells(i + 5, 3) = Day(Btbl(i, 1)) .Cells(i + 5, 4) = Btbl(i, 1) .Cells(i + 5, 4).NumberFormatLocal = "aaa" .Cells(i + 5, 7) = Btbl(i, 2) .Cells(i + 5, 8) = Btbl(i, 3) Next Intersect(.UsedRange, .Range("G:H"), .Range(.Rows(6), .Rows(36))).NumberFormatLocal = "h:m" End With Wb.Close True Set Wb = Nothing End Sub Private Function BookWriteSubDataDiv(ByRef Base As Variant, ByVal Fromd As Variant, ByVal Tod As Variant) As Variant Dim i As Long Dim j As Long Dim Y As Long Y = 1 For i = 1 To UBound(Base, 1) If Base(i, 1) >= Fromd And Base(i, 1) < Tod Then Worksheets("Sheet1").Cells(Y, "XEV").Resize(, UBound(Base, 2)) = WorksheetFunction.Index(Base, i, 0) Y = Y + 1 End If Next BookWriteSubDataDiv = Worksheets("Sheet1").Cells(1, "XEV").CurrentRegion.Value Worksheets("Sheet1").Cells(1, "XEV").CurrentRegion.Delete If UBound(BookWriteSubDataDiv, 1) > 31 Then MsgBox "警告!情報が異常です、確認後再処理の必要が有ります" BookWriteSubDataDiv = False End If End Function Private Sub DataSet(ByRef Var As Variant) With ThisWorkbook.Worksheets("Sheet1") Var = Intersect(.UsedRange.Offset(1), .Range("A:D"), .Range(.Rows(2), .Rows(.UsedRange.Rows.Count))) End With End Sub Private Sub Accsept(ByRef Fromd As Variant, ByRef Tod As Variant) Dim Sm As Variant Sm = Application.InputBox("処理年月を数値で入力", "V B A", Year(Date) & Month(Date) - 1, , , , , 1) If Sm = False Then End Sm = Left(Sm, 4) & Chr(2) & Mid(Sm, 5) Fromd(1) = DateSerial(Split(Sm, Chr(2))(0), Split(Sm, Chr(2))(1), 1) Tod(1) = DateSerial(Year(Fromd(1)), Month(Fromd(1)) + 1, 0) + 1 Fromd(2) = DateSerial(Split(Sm, Chr(2))(0), Split(Sm, Chr(2))(1), 6) Tod(2) = DateSerial(Year(Fromd(1)), Month(Fromd(1)) + 1, 5) + 1 End Sub Private Sub BookSet(ByVal Fary As Variant) Const Fnm As String = "AtBase.xlsm" Dim Var As Variant For Each Var In Fary FileCopy ThisWorkbook.Path & "\" & Fnm, ThisWorkbook.Path & "\" & Var & ".xlsm" Next End Sub Private Sub Pstart() With Application .EnableEvents = False .ScreenUpdating = False .Calculation = xlCalculationManual End With End Sub Private Sub Pend() With Application .EnableEvents = True .ScreenUpdating = True .Calculation = xlCalculationAutomatic End With End Sub (隠居じーさん) 2019/09/09(月) 17:26
おはようございます ^^ ↑のコードを書いていて思うのですが、他の関数、マクロで計算処理 をしているBOOKをコピー後、名前を変えたりしていますので、誤 作動のリスクは非常に高いかと。私でしたら動いても ← ダメかも ( ̄▽ ̄) 業務には使いません。後の計算処理も新規にマクロ化、若しくは関数 を再構築する(フォーマットだけ使う)のならべつですが、アップし ておいてなんですが、やはり駄作でした。無視してやってください。 。。とほほ〜 ^^; すみませんでした m(_ _)m (隠居じーさん) 2019/09/10(火) 07:51
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.