質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

解決済

シート毎に指定の行で処理を飛ばす

milk1218
milk1218

総合スコア20

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

7回答

0評価

0クリップ

558閲覧

投稿2021/10/01 04:51

編集2021/10/01 07:32

勤怠登録を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
でアクティブ中のシートが対象になるようになっています。

・出勤と退勤は処理ボタンを分けています
(出勤打刻して一度ファイルを閉じて退勤時にまた開くことを想定しているため。
退勤打刻の際には年月日は選びません)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

tatsu99

2021/10/01 06:39

シート名は、具体的にはどうなっていますか。"10月","11月","12月"ですか。 出勤時刻登録時は、出勤年月日も入力されるので、その日付から、シートと行番号を決定できます。 退勤時刻登録時は、出勤年月日は、フォーム上のコンボボックスにないのでしょうか。 もし、あるなら、同様に、それを使い、その日付から、シートと行番号を決定できます。
milk1218

2021/10/01 07:33

アドバイスありがとうございます・・! シート名は「10」「11」「12」となっておりまして 登録時のフォームは分かりづらいので画像を補足しました。 退勤時には年月日は登録しない仕様になっています。
tatsu99

2021/10/01 08:01 編集

補足ありがとうございました。 念のため確認ですが、月が決まれば、シートは決まります。 日が決まれば、行も決まると考えて良いですか。 1日なら2行目、30日なら31行目、31日なら32行目です。 退勤時、年月日は登録しませんが、フォーム上にも、年月日は表示されないのでしょうか。 もし、表示されるなら、年月日の登録はしませんが、それを使用して、シート名と行番号を決めることは可能です。 もし、退勤時、年月日がフォーム上に表示されないなら、出勤時刻のみが登録されているシートを順に探して、そのシートの該当行を、退勤時刻登録の行とするしかないです。
milk1218

2021/10/01 08:08

日が決まれば行も決まります・・!仰る通り、1日なら2行目、30日なら31行目、31日なら32行目です。例えば2021年10/1という日付だけ登録して出退勤時刻を打たずに一旦閉じて、またフォームを起動した際に10/2で打刻したら次の行に入ります・・! ただ、月を判別することは出来ないので、アクティブ中のシートが32まで埋まったら自動的に隣のシートに移るという仕様です。 退勤時、年月日がフォーム上に表示されないので後者のやり方を試そうと思います! ありがとうございます・・!
jinoji

2021/10/01 14:46 編集

退勤時の処理がその当日に起動されるのなら、年月日は Date なり Now なりで分かるんではないの?

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。