[[20220103021229]] 『シフト表のアルゴリズム』(ひろ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『シフト表のアルゴリズム』(ひろ)

初めて質問させていただきます。
シフト表を作ったのですが、シフトが週末を堺に
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 >


mとnがそれぞれ月初日と月末日なのでしょうから、
 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.