ここから本文です

上記のように 「シフト表」「従業員番号」「時間帯」「転記用シート」の4つのシー...

mie********さん

2019/9/1823:42:26

上記のように
「シフト表」「従業員番号」「時間帯」「転記用シート」の4つのシートがあります。

下記のような処理をしたいのですが、検索一回目は上手くいくのですが、同じセルのしか検索されず、一回目の検索で見つかった場所から先にすすめません。
【従業員番号シートの上の人から順番に、下の同様の作業をしたいです。】
●従業員番号シートのE列、お店表表記氏名の上の人から、
シフト表にいつ入っているか検索


●お店表表記氏名の方が、従業員番号シートのどの従業員番号に一致するか検索して
従業員番号を従業員番号に格納


●対象の方がシフト表に入っていたら、氏名右隣の勤務時間と、時間帯シートのどの時間帯パターンに一致するか検索して
時間帯パターンを勤務時間に格納


●対象の方がシフト表に入っていたら、氏名の一番左のA列を日付として格納


●転記シートのA列に、上で日付として格納した日付と一致する場所を検索
検索して一致した行のC列に、従業員番号、D列に勤務時間を入力

●一か月間、いつ、だれが、どの勤務時間でシフトに入ったのかを
転記シートに画像のように入れたいです。
シフトに入っていない日については、休みの勤務時間コードを入れたいです。




下記がうまくいかないコードです。

Sub あ()
Dim myRange As Range '検索にヒットしたセルを記録'
Dim i As Long
Dim 最終行 As Long
Dim 日付 As Long
Dim 時間 As String
Dim 従業員番号ド As String
Dim 勤務時間コード As String
Dim firstCell As Range '最初に検索にヒットしたセルを記録'



'初期作業(転記用シート)の書式設定
Sheets("転記用シート").Select
Range("B:B").NumberFormatLocal = "yyyy/mm/dd"
Range("C:D").NumberFormatLocal = "@"

'初期作業(従業員番号シート)の最終行を取得して、最終行の人まで繰り返したい
Sheets("従業番号").Select
最終行 = Cells(Rows.Count, 5).End(xlUp).Row
i = 2

'(従業員番号シート)の最終行になるまで処理を繰り返す
Do While i <> 最終行


'(従業員番号シート)E列の最初の方の名前を取得
氏名 = Cells(i, 5).Value

Sheets("シフト表").Select


'(シフト表シート)の対象の氏名の方を検索
Set myRange = Cells.Find(what:=氏名)



If Not myRange Is Nothing Then '検索対象が1件以上ある場合に下記コードを実行'
Set firstCell = myRange


'対象の方の名前が見つかった、A列(日付)を取得
日付 = Cells(myRange.Row, "A").Value

'対象の方の名前が見つかった、右隣に入っている時間を取得
時間 = myRange.Offset(0, 1).Value



'氏名を従業員番号のシートから検索して、対象の方の、従業員番号を取得
Sheets("従業員番号").Select
Set FoundCell = Range("E:E").Find(what:=氏名)

If Not FoundCell Is Nothing Then '検索対象が1件以上ある場合に下記コードを実行'
従業員番号 = Cells(FoundCell.Row, "C").Value '一致のC列の従業員番号を取得
Else
MsgBox "従業員番号のシートに" & 氏名 & "さんと一致する名前がありません"
End If


Do

Set myRange = Cells.FindNext(myRange) '()内のセルの次のセルから検索を続行'



'勤務時間を従時間帯のシートから検索して、対象の方の、勤務時の時間帯パターンをを取得
Sheets("時間帯").Select
Set FoundCell = Range("C:C").Find(what:=時間)

If Not FoundCell Is Nothing Then '検索対象が1件以上ある場合に下記コードを実行'
勤務時間 = Cells(FoundCell.Row, "A").Value '一致のA列の値セット
Else
MsgBox "シフト表の" & 日付 & "日の " & 氏名 & " さんの時間の記載が誤っています"
End If


'転記シートの指定した日付のC列に従業員番号、D列に勤務時間を張り付ける
Sheets("転記").Select
Set FoundCell = Range("A:A").Find(what:=日付)

If Not FoundCell Is Nothing Then '検索対象が1件以上ある場合に下記コードを実行'
Cells(FoundCell.Row, "C").Value = 従業員番号
Cells(FoundCell.Row, "D").Value = 勤務時間
Else
MsgBox "一致する" & 日付 & "がありません"
End If


Sheets("シフト表").Select

Loop While myRange.Address <> firstCell.Address '最初のセルに戻るまでDo~Loopを継続'



End If

i = i + 1


Loop





End Sub

Set FoundCell,FoundCell.Row,C&amp;quot,Set myRange,As String,D&amp;quot,With Worksheets

閲覧数:
57
回答数:
1
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

kky********さん

2019/9/1907:33:40

全く違うロジックにしましたが参考まで。

書いてくれたコードは全てを把握していませんので、下記前提が違うのであれば連絡して下さい。
【前提】
転記用シートのA列とB列は、あらかじめ人数分の番号と日付が入力されているとします。

時間帯は変わる可能性は低いと思うので4つ限定、従業員は増減があってもこのままのコードで対応出来るようにしてあります。


Sub test()
Dim sh As Worksheet
Dim n_tbl As Variant
Dim t_tbl As Variant
Dim i As Integer, j As Integer
Dim cnt As Integer, cmax As Integer
Dim c As Integer
Application.ScreenUpdating = False
With Worksheets("従業員番号")
n_tbl = .Range("C2:E" & .Cells(Rows.Count, "C").End(xlUp).Row)
End With
With Worksheets("時間帯")
t_tbl = .Range("A2:C5")
End With
Set sh = Worksheets("シフト表")
With Worksheets("転記用")
.Range("B:B").NumberFormatLocal = "yyyy/mm/dd"
.Range("C:D").NumberFormatLocal = "@"
.Range("C2:D" & .Cells(Rows.Count, "C").End(xlUp).Row).ClearContents
cmax = Day(DateAdd("m", 1, .Range("B2")) - 1)
For i = 1 To UBound(n_tbl)
For cnt = 1 To cmax
.Range("C" & (i - 1) * cmax + cnt + 1) = n_tbl(i, 1)
For c = 3 To 9 Step 2
If sh.Cells(cnt + 3, c) = n_tbl(i, 3) Then
For j = 1 To 3
If sh.Cells(cnt + 3, c + 1) = t_tbl(j, 3) Then
.Range("D" & (i - 1) * cmax + cnt + 1) = t_tbl(j, 1)
Exit For
End If
Next j
End If
Next c
If .Range("D" & (i - 1) * cmax + cnt + 1) = "" Then
.Range("D" & (i - 1) * cmax + cnt + 1) = t_tbl(4, 1)
End If
Next cnt
Next i
.Select
End With
Application.ScreenUpdating = True
MsgBox "処理終了"
End Sub

  • kky********さん

    2019/9/1907:56:47

    簡単なコードの説明です。

    従業員番号と時間帯のシートはデータ数が少ないので、必要部分を最初に配列に入れてしまい、都度シートを参照しないようにしました。

    処理は
    外のループが従業員の人数分繰り返し
    その中で日付分繰り返し
    としました。

    シフト表の該当日の行で、名前の4つの列を調べ
    あったら、時間帯を配列から取得しています。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この回答は投票によってベストアンサーに選ばれました!

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる