[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『シフト表のアルゴリズム』(ひろ)
初めて質問させていただきます。
シフト表を作ったのですが、シフトが週末を堺に
B→A→C→B→A→C
と循環するシフトがあり(3つの班があります)
↓
日 1 2 3 4 5 6 7 8 9 10 11
曜 土 日 月 火 水 木 金 土 日 月 火
シフト B B A A A A A A A C C 1班
シフト C C B B B B B B B A A 2班
シフト A A C C C C C C C B B 3班
今は下の様に処理をしています、一月ごとの処理です
For j = m To n myTable(1, i) = Format(j, "yyyy/m/d") myTable(2, i) = WeekdayName(Weekday(j), True, 1) p = funk(j, m) If p = 0 Or p = 3 Then myTable(13, i) = Range("H15") myTable(19, i) = Range("H21") myTable(25, i) = Range("H27") ElseIf p = 1 Or p = 4 Then myTable(13, i) = Range("H27") myTable(19, i) = Range("H15") myTable(25, i) = Range("H21") ElseIf p = 2 Or p = 5 Then myTable(13, i) = Range("H21") myTable(19, i) = Range("H27") myTable(25, i) = Range("H15") End If i = i + 1 Next j 省略 Function funk(ByVal j As Long, ByVal m As Long) As Long funk = WorksheetFunction.WeekNum(j) - WorksheetFunction.WeekNum(m) End Function 配列を使って、B→A→C→B→A→C と一年のシフト表を作るには、どの様な処理をすれば良いのか、教えて下さい。
< 使用 Excel:Excel2019、使用 OS:Windows10 >
For 月 = 1 To 12 m = Dateserial(年, 月, 1) n = Dateserial(年, 月 + 1, 1) - 1 For j = m To n (省略) Next Next
たとえばこんな風に。
(基準日シリアル値があるならEoMonth関数の方がスマートかもしれません。)
(きまぐれおじさん) 2022/01/03(月) 05:21
自分としては、例えば Array("B","A","C","B","A","C","B","A","C") を使用して
永久に循環する変数をVBAで実現したいのですが、
頭でイメージ出来ないので教えてください。
(ひろ) 2022/01/03(月) 11:10
>例えば Array("B","A","C","B","A","C","B","A","C") を使用して
>If p = 0 Or p = 3 Then > myTable(13, i) = Range("H15") > myTable(19, i) = Range("H21") > myTable(25, i) = Range("H27") >ElseIf p = 1 Or p = 4 Then > myTable(13, i) = Range("H27") > myTable(19, i) = Range("H15") > myTable(25, i) = Range("H21") >ElseIf p = 2 Or p = 5 Then > myTable(13, i) = Range("H21") > myTable(19, i) = Range("H27") > myTable(25, i) = Range("H15") >End If
こんな事?
myTable(13, i) = Array("B", "A", "C")(p Mod 3) myTable(19, i) = Array("A", "C", "B")(p Mod 3) myTable(25, i) = Array("C", "B", "A")(p Mod 3)
(ピンク) 2022/01/03(月) 12:19
https://www.google.com/search?q=vba+mod
(ひまつぶし) 2022/01/03(月) 12:24
とても参考になりました、
Arr_1 = Array("A", "C", "B")
For j = m To n
myTable(a, i) = Arr_1(p Mod 3)
Next j
ならば、簡素に書けそうですね!
(ひろ) 2022/01/03(月) 13:50
★関数案と、★VBA案になります。 下記のテーブルは、IF関数でした場合です。考え方の提示なので参考になるか解かりません?
|[A] |[B] |[C] |[D] |[E] |[F] |[G] |[H] |[I] |[J] |[K] |[L] |[M] |[N] |[O] |[P] |[Q] |[R] |[S] |[T] [2] |2022年|1月 | 1| 2| 3| 4| 5| 6| 7| 8| 9| 10| 11| 12| 13| 14| 15| 16| 17| 18 [3] | |班/何週目|(土)|(日)|(月)|(火)|(水)|(木)|(金)|(土)|(日)|(月)|(火)|(水)|(木)|(金)|(土)|(日)|(月)|(火) [4] |シフト|1班 | 1| 1| 2| 2| 2| 2| 2| 2| 2| 0| 0| 0| 0| 0| 0| 0| 1| 1 [5] |シフト|2班 | 0| 0| 1| 1| 1| 1| 1| 1| 1| -1| -1| -1| -1| -1| -1| -1| 0| 0 [6] |シフト|3班 | 2| 2| 3| 3| 3| 3| 3| 3| 3| 1| 1| 1| 1| 1| 1| 1| 2| 2 [7] | | | | | | | | | | | | | | | | | | | | [8] |シフト|1班 |B |B |A |A |A |A |A |A |A |C |C |C |C |C |C |C |B |B [9] |シフト|2班 |C |C |B |B |B |B |B |B |B |A |A |A |A |A |A |A |C |C [10]|シフト|3班 |A |A |C |C |C |C |C |C |C |B |B |B |B |B |B |B |A |A
★関数案 ・年間53週MAXとして考えて、A1=値(2022)年とする、B1=値(1~12)月とする ・1行目は、非表示にするか…文字を見えなく隠す ( B班=1、A班=-1か2、C班=0か3、が成り立つ )
・C1=WEEKNUM(C2,2)として、最終列までフィル ・C2=DATE($A$1,$B$1,COLUMN()-2)として、最終列までフィル ・C3=DATE($A$1,$B$1,COLUMN()-2)として、最終列までフィル ・C4=MOD(C1,3)として、最終列までフィル ・C5=SUM(C4-1)として、最終列までフィル ・C6=SUM(C4+1)として、最終列までフィル
・C8=IF(C4=-1,"A",IF(C4=0,"C",IF(C4=1,"B",IF(C4=2,"A",IF(C4=3,"C")))))として最終列までフィル ・C9、C10は、下にフィルとして最終列までフィル
※B1の月を、1月から2月にしても...対応する、因みにA1の年も、変更時に対応させる
★VBA案 ( 0、1、2 )の循環を利用したら、なんとかなりそうな…気がするですが どうでしょうか?
Sub Sample() Dim i As Long, x As Long For i = 1 To 53 x = tmp(i, 3) MsgBox x Next End Sub
Function tmp(x As Long, y As Long) tmp = -1 tmp = x - (Int(x / y) * y) End Function
(あみな) 2022/01/03(月) 14:01
循環する変数の作り方が分かった感じです、
関数は以前作ってみたところ
やっぱり重くなって、、、
Array関数、やっぱり使えますね。
(ひろ) 2022/01/03(月) 17:54
>For j = m To n > myTable(a, i) = Arr_1(p Mod 3) >Next j
ひょっとして Arr_1 Arr_2 Arr_3 と有るのかな
myTable(13, i) = Arr_1(p Mod 3) myTable(19, i) = Arr_1((p + 1) Mod 3) myTable(25, i) = Arr_1((p + 2) Mod 3) も有かと
(ピンク) 2022/01/03(月) 18:29
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.