勤怠登録をVBAで作成しています。
10月、11月、12月と三枚のシートがあり、日付を選択して出勤日を登録するようになっています。
現状、32行目まで空白のセルを上から埋めて次のシートへ飛ぶループ処理にしていますが
土日に出勤しない場合32行目までいくまえに終わってしまいます。
月によって何日が土日かも違うので、シートごとに指定のセルを飛ばして処理
するしか発想が無いのですが、他にもやり方があれば教えていただけますでしょうか。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
Private Sub cb_touroku_Click() '年月日出勤時刻登録ボタン Dim tgtRow As Long tgtRow = Cells(30, 1).End(xlUp).Row tgtRow = tgtRow + 1 For i = 2 To 32 For Each SH In ActiveWorkbook.Worksheets With ActiveSheet .Cells(tgtRow, 1).Value = DateSerial(Me.cb1.Value, Me.cb2.Value, Me.cb3.Value)'年月日 .Cells(tgtRow, 2).Value = TimeSerial(Me.TextBox1.Value, Me.TextBox2.Value, 0) '出勤時刻 End With Next Next i MsgBox "登録しました" 'ここのlabel1に来たら 'GoTo label1 'この部分は実行されません 'Range("A3") = r ' Range("B3") = r 'Range("C3") = r 'label1: End Sub Private Sub cb_touroku2_Click() '退勤・休憩登録 Dim tgtRow As Long tgtRow = Cells(30, 1).End(xlUp).Row For r = 2 To 32 For Each SH In ActiveWorkbook.Worksheets With ActiveSheet .Cells(tgtRow, 3).Value = TimeSerial(Me.TextBox3.Value, Me.TextBox4.Value, 0) '退勤時刻 .Cells(tgtRow, 4).Value = TimeSerial(Me.TextBox5.Value, Me.TextBox6.Value, 0) '休憩開始時刻 .Cells(tgtRow, 5).Value = TimeSerial(Me.TextBox7.Value, Me.TextBox8.Value, 0) '休憩終了時刻 End With Next Next r MsgBox "登録しました" End Sub
試したこと
予め休日の日は数値を入れておいてみたのですが、一番最終行や途中の行の数値が上書きされてしまい
上から順番に空白のセルに入りませんでした。
補足情報(FW/ツールのバージョンなど)
・月によっての処理分けが出来ていません。
For Each SH In ActiveWorkbook.Worksheets
でアクティブ中のシートが対象になるようになっています。
・出勤と退勤は処理ボタンを分けています
(出勤打刻して一度ファイルを閉じて退勤時にまた開くことを想定しているため。
退勤打刻の際には年月日は選びません)
シート名は、具体的にはどうなっていますか。"10月","11月","12月"ですか。
出勤時刻登録時は、出勤年月日も入力されるので、その日付から、シートと行番号を決定できます。
退勤時刻登録時は、出勤年月日は、フォーム上のコンボボックスにないのでしょうか。
もし、あるなら、同様に、それを使い、その日付から、シートと行番号を決定できます。
アドバイスありがとうございます・・!
シート名は「10」「11」「12」となっておりまして
登録時のフォームは分かりづらいので画像を補足しました。
退勤時には年月日は登録しない仕様になっています。
補足ありがとうございました。
念のため確認ですが、月が決まれば、シートは決まります。
日が決まれば、行も決まると考えて良いですか。
1日なら2行目、30日なら31行目、31日なら32行目です。
退勤時、年月日は登録しませんが、フォーム上にも、年月日は表示されないのでしょうか。
もし、表示されるなら、年月日の登録はしませんが、それを使用して、シート名と行番号を決めることは可能です。
もし、退勤時、年月日がフォーム上に表示されないなら、出勤時刻のみが登録されているシートを順に探して、そのシートの該当行を、退勤時刻登録の行とするしかないです。
日が決まれば行も決まります・・!仰る通り、1日なら2行目、30日なら31行目、31日なら32行目です。例えば2021年10/1という日付だけ登録して出退勤時刻を打たずに一旦閉じて、またフォームを起動した際に10/2で打刻したら次の行に入ります・・!
ただ、月を判別することは出来ないので、アクティブ中のシートが32まで埋まったら自動的に隣のシートに移るという仕様です。
退勤時、年月日がフォーム上に表示されないので後者のやり方を試そうと思います!
ありがとうございます・・!
退勤時の処理がその当日に起動されるのなら、年月日は Date なり Now なりで分かるんではないの?
回答7件
あなたの回答
tips
プレビュー