職業訓練校のまいにち~職業訓練ではどんな授業をしているのか~

職業訓練出た後に運用オペレーターに就職。VBAで運用構築がメインのお仕事です。

VBAでグループ分けには手を出さないほうがいい

f:id:nazuna_0124:20170319171727p:plain

過去に3回手を出して、調査段階で諦めました←


グループ分けの行き着く先はシフト作成です。

これはナーススケジューリング問題というやつで

アルゴリズム的に難しそうなお話です。



動けばいい我々に取っては一番敷居が高いので

そっとしておくのが吉。



叩き台の作成くらいは簡単ですが、

大抵それは手作業でやってもあんまり変わらないです。




などといいつつ、他所様のネタを拝借しての

派生問題。

thom.hateblo.jp



元のお題は部屋割りだそうな。

こんな要件は多分ほとんど無いのでおいといて

(ありそうなのは部屋数を少なく振り分け、とか、 別に成績のデータがあって部屋ごとの平均をおんなじくらいにしたいとか)



出力結果に着目。



簡単に言うと


部屋番号:定員

201:2

202:3

301:2


こういうデータを


201 201 202 202 301 301 301

定員の数分だけ掛け算したデータを一列に並べてるだけです。

こういうところにサクッと気づいてほしいところです。



めんどいのでdebug.printです。

これ実行すると

Sub 個数分並べる()
    Dim r
    
    r = Range("A2:B7")
    
    Dim col As New Collection
  
    Dim i, k

    For i = 1 To UBound(r)
        For k = 1 To r(i, 2)
            col.Add r(i, 1)
            Debug.Print r(i, 1), k
        Next
    Next

End Sub


こういう風に部屋番号の並び順で出力されます。

201 1

201 2

201 3

201 4

201 5

202 1

202 2

203 1

203 2

301 1

301 2

301 3

302 1

302 2

303 1

303 2

303 3

303 4

303 5



201

202

203 ...

みたいに部屋を周回したい場合は→にある

数字で昇順するとオッケーです。



並べ替えようとデータを他に持たせておくと後で楽

というお話でした。


だってソート苦手なんだもん!