まずA,B,C,D,E,F,G,H,I,Jさんがいます。
A~Jさんのシフトはみんなバラバラです。
当番の順番は必ずA→B→C→D→E→F→G→H→I→Jの順ですが、例えばBさんが、有給をとって休みだった場合は、次のCさんが当番になるようにしたいです。
シフトがでたら自動で上記の内容が出るようにしたいのですが、エクセルでやるにしてもどのようにしたらいいのか、そもそもエクセルが適切なのかも不明な為、投稿させていただきました。
当方、PHPの学習中でもあるのですが、配列でやるのかなー?とかも考えたのですが、学習が関数どまりのため、これも解決できそうにありません。。。
適切であろう言語とおおまかな手順がわかる方、アドバイスをいただけますと幸いです。よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
ベストアンサー
ご連絡ありがとうございます。
エクセルにシフト表があるということで、エクセルで完結させるのであれば、例えば1例として以下のような方法が考えられます。
Sheet1に以下のような形でシフトが入っているとします。
0が休み、1が出勤です。
この時、Aさん~Iさんに当番順に番号を振ります。具体的には、Aさんが0番~Iさんが8番になります。
シフト表の下に、当番用の欄を作り、当番をシフトに従って、マクロの関数で自動で表示するようにします。
マクロは例えば以下のように設定できます。(Selectの部分が冗長なので、見直しは必要かと思いますが)
今回シフトを回すのが9人ですので、前回当番だった人(左となりの列の人)の当番番号に1を足した人が出勤しているかどうかを知らべます。
もし出勤していなければさらに当番番号に1を足し、、、ということを繰り返しています。
少し説明を端折り気味ですが、上記のように設定していけば、以下のように自動的に当番の人を表示させることができます。
VBA
1Function testx(x) 2Dim WS As Worksheet 3Set WS = Worksheets("Sheet1") 4Dim i As Integer 5Dim y As Integer 6 7Select Case x 8Case "A" 9 x = 0 10Case "B" 11 x = 1 12Case "C" 13 x = 2 14Case "D" 15 x = 3 16Case "E" 17 x = 4 18Case "F" 19 x = 5 20Case "G" 21 x = 6 22Case "H" 23 x = 7 24Case "I" 25 x = 8 26End Select 27 28 29 For i = 1 To 8 30 If WS.Cells(3 + ((x + i) Mod 9), Selection.Column) = 1 Then 31 y = (x + i) Mod 9 32 Exit For 33 End If 34 Next 35 36Select Case y 37Case 0 38 testx = "A" 39Case 1 40 testx = "B" 41Case 2 42 testx = "C" 43Case 3 44 testx = "D" 45Case 4 46 testx = "E" 47Case 5 48 testx = "F" 49Case 6 50 testx = "G" 51Case 7 52 testx = "H" 53Case 8 54 testx = "I" 55End Select 56 57End Function 58
投稿2016/09/05 02:20
総合スコア217
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
gasuko様
遠回りさせてしまいまして申し訳ございません。ごちゃごちゃしてきてしまいましたので、別回答いたします。
ご指摘の通り、自動で反映されなくては意味がないので、以下修正案です。
シートは上記と同様です。
ワークシートのSheet1のマクロに、以下のようにシフト表で変更があった場合に、VBAで変更を行います。
VBA
1Private Sub Worksheet_Change(ByVal Target As Range) 2 3Dim WS As Worksheet 4Set WS = Worksheets("Sheet1") 5Dim i As Integer 6 7 If (Target.Row >= 3 And Target.Row <= 11) And (Target.Column >= 3 And Target.Column <= 8) Then 8 9 For i = 1 To 5 10 WS.Cells(14, 3 + i) = testx(Cells(14, 2 + i), i + 3) 11 Debug.Print (testx(Cells(14, 2 + i), i + 3)) 12 Next i 13 14 End If 15 16End Sub
If (Target.Row >= 3 And Target.Row <= 11) And (Target.Column >= 3 And Target.Column <= 8) の部分は、C3~I11までの間のセルで変更があった際に動作するマクロという意味です。
続いて、関数のマクロも次のように変更いたします。
現在セルの列を取得するのではなく、セルの列数は、関数側に受け渡すように変更しております。
VBA
1Sub run() 2Dim WS As Worksheet 3Set WS = Worksheets("Sheet3") 4 5 For i = 1 To 5 6 WS.Cells(14, 3 + i) = testx(WS.Cells(14, 3 + i - 1)) 7 Next 8 9End Sub 10Function testx(x, j) 11Dim WS As Worksheet 12Set WS = Worksheets("Sheet3") 13Dim i As Integer 14Dim y As Integer 15 16Select Case x 17Case "A" 18 x = 0 19Case "B" 20 x = 1 21Case "C" 22 x = 2 23Case "D" 24 x = 3 25Case "E" 26 x = 4 27Case "F" 28 x = 5 29Case "G" 30 x = 6 31Case "H" 32 x = 7 33Case "I" 34 x = 8 35End Select 36 37 38 For i = 1 To 8 39 If WS.Cells(3 + ((x + i) Mod 9), j) = 1 Then 40 y = (x + i) Mod 9 41 Exit For 42 End If 43 Next 44 45Select Case y 46Case 0 47 testx = "A" 48Case 1 49 testx = "B" 50Case 2 51 testx = "C" 52Case 3 53 testx = "D" 54Case 4 55 testx = "E" 56Case 5 57 testx = "F" 58Case 6 59 testx = "G" 60Case 7 61 testx = "H" 62Case 8 63 testx = "I" 64End Select 65 66End Function 67 68
これで、C14にAだけ入れておけば、後は動くと思うのですが、ご確認いただけますでしょうか。
投稿2016/09/05 09:10
総合スコア217
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
Sub 当番() Function testx(x) Dim WS As Worksheet Set WS = Worksheets("Sheet1") Dim i As Integer Dim y As Integer Select Case x Case "A" x = 0 Case "B" x = 1 Case "C" x = 2 Case "D" x = 3 Case "E" x = 4 Case "F" x = 5 Case "G" x = 6 Case "H" x = 7 Case "I" x = 8 End Select For i = 1 To 8 If WS.Cells(3 + ((x + i) Mod 9), Selection.Column) = 1 Then y = (x + i) Mod 9 Exit For End If Next Select Case y Case 0 testx = "A" Case 1 testx = "B" Case 2 testx = "C" Case 3 testx = "D" Case 4 testx = "E" Case 5 testx = "F" Case 6 testx = "G" Case 7 testx = "H" Case 8 testx = "I" End Select End Function End Sub
投稿2016/09/05 07:27
総合スコア27
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
関連した質問
当番表をつくりたい