search
LoginSignup
5
Help us understand the problem. What are the problem?

posted at

updated at

【VBA】チンチロリンで休憩決めてたら怒られたので、VBAで作った

弊現場の休憩は三交代で、チンチロリンで出目が強い順に回しているのですが、
業務時間中にやると遊んでるみたいになっちゃうので、VBAで作りました
(意地でもチンチロリンで休憩時間を決めたい)
image.png

全体的なUIはこんな感じです
振るを押すと、サイコロの値が生成されて出目の結果を表示します。

image.png

チンチロリンのルールに準拠して、出目がでたら残り回数が0になり、振ろうとすると怒られます。
解除するにはpasswordを打ち込んで解除します。
image.png

image.png

不正防止の為、結果はLOG欄に出力され、保存されます。

image.png

image.png

保護されたシートなので、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ステートメントで初期化することで対応。

晴れてチンチロリンをすることができました。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
5
Help us understand the problem. What are the problem?