弊現場の休憩は三交代で、チンチロリンで出目が強い順に回しているのですが、
業務時間中にやると遊んでるみたいになっちゃうので、VBAで作りました
(意地でもチンチロリンで休憩時間を決めたい)
全体的なUIはこんな感じです
振るを押すと、サイコロの値が生成されて出目の結果を表示します。
チンチロリンのルールに準拠して、出目がでたら残り回数が0になり、振ろうとすると怒られます。
解除するにはpasswordを打ち込んで解除します。
不正防止の為、結果はLOG欄に出力され、保存されます。
保護されたシートなので、LOG欄をいじって結果を覆そうとする輩にはpasswordが求められます。
振るボタンには「tintiro」という名前のプロシージャ―を設定しています。
Sub tintiro()
Dim bool_pass As Boolean
Call init
bool_pass = pass判定() ←ロック解除のためのパスワードの判定
If bool_pass = False Then
Exit Sub
End If
Cells(2, 4) = ""
Cells(2, 1) = Dice() ←Dice()でサイコロの値を取得
Cells(2, 2) = Dice()
Cells(2, 3) = Dice()
Cells(2, 4) = result() ←result()で結果の判定
Call log ←不正がないようにlogプロシージャで保護されたセルに結果を入力
ThisWorkbook.Save ←保存
End Sub
Dice()は、サイコロの結果を返します。
Function Dice() As Integer
Dim i As Integer
i = Int(Rnd * 7)
If i = 0 Then
i = Dice()
End If
Dice = i
End Function
Rnd 関数は、1 未満で 0 以上の値を返します。
7でかけて、Int型に直すことで0~6の整数としています。
(偏りあるけど、休憩時間決めるために使うだけだからオッケーオッケー)
0が出たときはもう一度Dice()を呼び出して、最終的には1~6の値で返します。
result()の中身も書こうとしたのですが、ごり押しif分でcoolじゃないので
恥ずかしいのでやめておきます。
プロセス的には、
①一致する数字があるかどうか
→あれば、②ぞろ目であるかどうか判定
→あれば、出目はぞろ目、なければ仲間外れのサイコロの値を参照して出目〇
シゴロとヒフミの判定はゴリゴリ押しです
If a = 4 And b = a + 1 And c = a + 2 Then
こんな感じで全パターンif分書いてます( ^ω^)・・・
何かスタイリッシュな書き方があれば、教えてくださると泣いて喜びます。
そんな感じで、VBAでチンチロリン作りましたって話
ー--追記ー--
Rnd関数でサイコロの値を決めていたのですが、共有フォルダにアップすると
同じ値が出てしまいました。
bookのシード値を初期化していなかったのが原因みたいです。
Randomizeステートメントで初期化することで対応。
晴れてチンチロリンをすることができました。