僕の世界観を変えてみるスマートフォン用の表示で見る僕の世界観を変えてみる文系男子が趣味でプログラミングを勉強していくブログです。他にも日常で起きたどうでもいいことや愚痴を書いていきたいです。座右の銘は和を以て貴しとなすです。プログラミングシェアするTwitterGooglePocketLine前回VBAを使ってカウンターを作りましたが、それが2017年6月の話。今回はシフトを自動生成する仕組みを作ってみました。何やってんだって話ですよね(笑)カウンターの記事はこちらwww.htmllifehack.xyzシフト自動生成のコード編はこちらwww.htmllifehack.xyz遊びで作りはじめて徐々に改善していった結果、別に使ってもいいんじゃないかなってレベルになりました。VBAのことなんてほぼ知らない状態でカウンターを作り、結構勉強になったんですけど今回もまた知らないことが沢山出てきたので本当勉強になります。遊びでもやってみるもんですね。作ったもの仕組み1週間分のシフトを乱数を使って生成する生成したシフトを繰り返し貼り付け1ヶ月分のシフトを作る5連勤以上しないようにチェックするチェックするための作戦6連勤していないかチェックするコードの解説まとめ作ったもの動画では処理が完了するまで7分ほどかかっていますが、通常は1分前後で完了します。仮想でlinuxを動かして、タブを10個くらい開いた状態で動画撮ってるとやっぱり負荷がかかりますね。遊びで作ったものなのであまり期待しないでくださいいい!!!仕組み仕組みは簡単、0と1をランダムで表示し0だったら休み、1だったら出勤って感じにしました。斜線パターンで塗りつぶされたセルは0が、青色で塗りつぶされたセルには1が入力されています。表示形式を変更し値を表示させないようにしています。1日に必要な人数と個人の出勤希望数をあらかじめ入力しておき、乱数で発生した値の合計が一致するまでループさせています。(日本語って難しいよな、文系出身なのに全然説明できてないや。)あとは1か月分のシフト表にコピーするためFor文を使って5回繰り返し処理をしています。わかる人はコード見たほうが早いか。1週間分のシフトを乱数を使って生成するExcelの場合RANDBETWEEN関数を使うことで乱数を発生させますがVBAではRndを使います。Rndは小数点で乱数を発生させるためIntを使って四捨五入し整数で表示させます。1~10の値をランダムで表示させる場合は、こんなコードになります。Int((10-1+1)*Rnd+1)int((最大値-最小値+1)*Rnd+最小値)って具合になってます。単純に0と1を発生させたいような場合はRndで乱数を発生させた後Excelで小数点以下を表示させないようにするだけでもOKです。Loop全部載せると長くなっちゃうので一部載せています。1For文を使ってF21からL21(秋元真夏の列)を指定し、Rndを使って0~1の乱数を発生させます。発生した乱数の合計をM21に表示させ、出勤希望数(B21)と同じ値になるまで繰り返し処理を行います。秋元真夏の出勤数が希望数と一致したら生田絵梨花に移動し同じように処理を行うようになっています。2最後の井上小百合まで終わったら次は曜日ごとの人数を見ていきます。F19~L19にある数値は曜日ごとに必要な人数です。F28~L28にある数値は乱数で出勤した人数の合計です。28の値が19の値と一致するまで1の作業を繰り返します。日曜日まで終わってやっと1週間分のシフトが完成です。生成したシフトを繰り返し貼り付け1ヶ月分のシフトを作るシフトは1週間分しか生成できないのでFor文で5回繰り返すことで1ヶ月(35日)分を作ります。下記の作業を5回繰り返しますよって意味です。1週目を貼り付けたあと右に7つ移動して2週目を貼り付ける、3週目4週目も同じ。今何週目を作っているのかをカウントするためにC30に生成回数という項目を作りました。生成回数が0回だった場合1週間分のシフトを1週目に貼り付け、生成回数を+1しています。生成回数が0以外だった場合、生成回数に7をかけた数だけ右に移動し貼り付けを行うようにしました。これを繰り返すことにより1ヶ月分のシフトを作ることができます。5連勤以上しないようにチェックするランダムで出勤日を決めているのでとんでもない連勤が発生する場合があります。月火水木金が出勤になる可能性があります。最大10連勤という大型連勤です。ならないように6連勤になった時点で再度シフトを生成するためのコードを書き足します。出勤日は1、休日は0になっているので直近6日間の合計を求めて、その合計が6になったら再生成することで解決です。秋元真夏はF32に、F8~K8までの合計を表示します。G32にはF8~K8までの合計を表示、とういうようにAI8~AM8まで求めます。同様に生田、生駒〜井上まで人数分行います。文字を赤くし、shuffleというプロシージャ(シフト生成コード)を呼び出す。shuffleが終わった後、1ヶ月分のシフトにコピペしてもう一度checkプロシージャを呼び出す。これでセルの値が6以下になるまで繰り返しシャッフルすることになります。セルの値が6でなかった場合は文字色を黒に変える、という内容です。文字色を黒にするように指定しないと一度赤に変わると次以降も赤のままになるので。まとめいかがだったでしょうか。シフトも自動で考えくれるなんて最高じゃないですか?と言っても普通の会社だったらこんなの作る必要なんてないんですけどねwちなみに動画の最後にコマンドプロンプトみたいなのが表示されますけど、これは偽物です。見えるようにセルの色を黒く塗ったりするプロシージャを作りました。希望休も考慮できるように、sheet2に希望休カレンダーを作りました。同期させるとsheet1にある自動生成したシフトに❌を表示できるように改良しました。これで完全版とします。今回の記事とyoutubeに載せたものはプロトタイプです。プロトタイプのコード全体はGithubに載せてあります。ご自由にお遊びください。20:34【VBA】暇だったのでランダムでシフトを自動生成する仕組みを作ってみた(解説編)関連記事2019-05-06【VBA】暇だったのでexcelで勤怠管理表を作ってみたこの前、大学生の子にExcelの関数を教えてあげたんですよ。...2019-04-06【例文あり】TwitterAPIの登録に苦戦した、そんな話TwitterAPIの登録にとても苦労した話。ヶ月)工場→カフェバイト→質屋の店長→現在SEもどき。2019年10月にバセドウ病と診断される。僕の世界観を変えてみるスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。