プロが教えるわが家の防犯対策術!

VBAの従業員の固定休を求めるプログラムを教えていただきたいご質問になります。
添付した画像を例とします。
シートの名前を勤務管理表とし、A3セルから下にAさん、Bさん、Cさんと入力されています。
ここでは3名とします。
例えば別シートのA1セルにAさん。A2セルに休みの「金」、A3セルに「月」の文字を入力。
それを勤務管理表のAさんのB3セルから左のセル欄に「休」を出力し、またBさん、Cさんも同じ様に入力したい内容になります。

勤務管理表で従業員を50名程作成しなくてはならず作業効率向上の為、一括で入力したいと思いましたので、どなたか詳しい方のご回答をお待ちしております。
よろしくお願い致します。

「VBAシフト表における従業員の固定休のプ」の質問画像

質問者からの補足コメント

  • 要塞まほろぼさん回答ありがとうございます。
    いえ火曜日は定休日ではありません。
    ここでは例として従業員を3名とし、その際に火曜日が全員出勤になってしまったものになります。
    Aさんの固定休は金、月。
    Bさんは土、水。
    Cさんは日、木。
    仮にDさんがおり、固定休が火、金。
    となる可能性もあるのでその場合はどの様にプログラムを組めばよろしいのか教えていただきたいです。

    よろしくお願い致します。

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/05/12 02:36

A 回答 (6件)

以下のマクロを標準モジュールへ登録してください。


休みの指定は、添付図のようにB~H迄の列に指定します。
1,2行はマクロ実行前に既に作成されていることが前提、A列の3行以降の従業員名も実行前に作成されていることが前提です。
-----------------------------------------------
Option Explicit
Public Sub 休日割当()
Dim sh1, sh2 As Worksheet
Dim dicT As Object
Dim row, col, maxrow As Long
Dim key, wk As String
Dim i As Long
Set dicT = CreateObject("Scripting.Dictionary")
Set sh1 = Worksheets("休日表")
Set sh2 = Worksheets("勤務管理表")
maxrow = sh1.Cells(Rows.Count, "A").End(xlUp).row 'Sheet1 A列最大行
'従業員の休みの曜日を取得
For row = 1 To maxrow
key = sh1.Cells(row, "A").Value
wk = ""
'B列からH列まで休みの曜日を取得
For col = 2 To 8
If sh1.Cells(row, col).Value = "" Then Exit For
wk = wk + sh1.Cells(row, col).Value
Next
dicT(key) = wk
Next
maxrow = sh2.Cells(Rows.Count, "A").End(xlUp).row 'Sheet2 A列最大行
'休みの設定領域をクリア
sh2.Range("B3:AF" & maxrow).Clear
For row = 3 To maxrow
key = sh2.Cells(row, "A").Value
If dicT.exists(key) = False Then
MsgBox (key & "は休日表に未登録です。処理を打ち切ります。")
Exit Sub
End If
wk = dicT(key)
For i = 1 To 31
col = 2 + i
If sh2.Cells(2, col).Value = "" Then Exit For
If InStr(wk, sh2.Cells(2, col).Value) > 0 Then
sh2.Cells(row, col).Value = "休"
sh2.Cells(row, col).Interior.ThemeColor = xlThemeColorDark1
sh2.Cells(row, col).Interior.TintAndShade = -0.249977111117893
End If
Next
Next
MsgBox ("完了")
End Sub
「VBAシフト表における従業員の固定休のプ」の回答画像6
    • good
    • 0
この回答へのお礼

tatsu99さんありがとうございます!
正に私が求めていたプログラムです!
色々触って勉強させていただきます。

この度はありがとうございました。
またこちらで質問をさせて頂くと思いますが、ご機会がございましたらよろしくお願い致します。

お礼日時:2017/05/13 05:20

No4です。

別シートの記入方法ですが、
人の並びが同じになるので、図1よりは図2のほうが良いかと思いますが、いかがでしょうか。
図1があなたが提示された方法です。
「VBAシフト表における従業員の固定休のプ」の回答画像5
    • good
    • 0

マクロで作成するとして、いくつか不明点があります。


1)B1は必ず12日から始まるのですか。
2)1行目(日付)と2行目(曜日)は、既に作成済みという前提で良いのですか。
それとも、マクロで1行目も2行目も作るのですか。
3)これは、横に一か月分ですか、1年分ですか。
4)1人の休みの曜日は、2日分で固定ですか。
Aさんが、月
Bさんが、火、金
Cさんが、水、木、土
のようなケースはあるのですか。
5)50人分つくる場合は、Cさんの次の行から、Dさん、Eさんと続くと考えて良いですか。
    • good
    • 0
この回答へのお礼

tatsu99さん回答ありがとうございます。
ご質問に回答致します。
1)B1は前回のtatsu99さんに教えていただいたVBAのコードを参考に「s_date = sh1.Cells(4, "A1").Value」 (※ A1に2017/5/10と入力します)
2)1行目は「sh1.Cells(1, col).Value = wdate」、日付2行目は「sh1.Cells(2, col).Value = WeekdayName(wkday, True)」のコード記述になります。
3)この管理表では横に1ヵ月分としています。
4)1人の休みの曜日は2日分で固定ではありません。3日の方もいれば4日の人もいます。
5)はい、Cさんの下にDさん、Eさんと続きます。
図2の方が使い易いと思いました!
こちらでお願い致します。

よろしくお願い致します。

お礼日時:2017/05/12 13:32

こんにちは!



一例です。
↓の画像のように別シートに個人の「固定休」の表を作成しておきます。
そして、Sheet1のB3セルに
=IF(ISNUMBER(FIND(B$2,VLOOKUP($A3,Sheet2!$A:$B,2,0))),"休","")

という数式を入れフィルハンドルで列・行方向にコピーすると
画像のような感じになります。

※ Sheet1の2行目(曜日行)はシリアル値で表示形式を「aaa」としているのではなく
文字列で日~土が入っているとします。m(_ _)m
「VBAシフト表における従業員の固定休のプ」の回答画像3
    • good
    • 1

=if(or(b2="月",b2="金"),"休"," ")


この式をAさんの行にペーストし、Bさんには月→水、金→土、と改良して、ペーストすればVB使わなくても出来ませんか?
    • good
    • 0

補足してください。



火曜日は定休日なのですか?
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!