VBA別館・Python別館

64531

電子サイコロの簡素化 - Tak

2018/05/03 (Thu) 16:39:37

何か簡単なゲームの下準備をしましょう。

① 百万長者への入り口である、ロットの原型を作りましょう。


・まずシートのセル(A2)に最初のサイコロを作ります。
 列・行の高さ・幅は適当に変更してください。
 セルに少しお化粧を施してください(セルの書式設定-塗潰し効果)。
・このセルを右に5個コピーしてください。
・開発ーコマンドボックスーデザインモードー挿入-ActiveXからCommandButtonはシート上に作る。
・コマンドボタンのプロパティから、Captionを「6桁数字発生」と変更する(変更しなくてもOK)。
・このボタンをクリックすると、6個の数字が図のように表示されます。 クリックする度に違った数字に変わります。

codeは次のようになります。 今まで書いてきたcodeです。

-----------------------------------
 
Private Sub CommandButton1_Click()
''乱数を発生させる

Dim ran As Long
For ran = 1 To 6
Randomize '乱数系列初期化
Cells(2, ran).Value = Int(6 * Rnd + 1) '1~6で乱数生成
Next ran
End Sub

-----------------------------------

もうcodeの説明は不要でしょう。

電子サイコロを作りましょう - Tak

2018/05/05 (Sat) 07:06:33

② サイコロを振ってみましょう。

次のようなcodeを書きます。

-------------------------------------

'1~6の乱数を発生させる
Dim ran As Long

Randomize '乱数系列初期化
ran = Int(6 * Rnd + 1)
Range("C2").Value = ran

 With Selection
  .HorizontalAlignment = xlCenter
  .VerticalAlignment = xlCenter
 End With

 With Selection.Font
  .Name = "游ゴシック"
  .FontStyle = "太字"
  .Size = 48
 End With

End Sub

--------------------------------

すると、図のようなサイコロ(と思ってください)の数字が、ボタンが押されるたびに変わります。

説明は次回。

Re: 電子サイコロを作りましょう - Tak

2018/05/05 (Sat) 20:02:56

3 乱数発生のcodeはお判りでしょうから、それ以後を説明します。

① With Selection
②  .HorizontalAlignment = xlCenter
③  .VerticalAlignment = xlCenter
④ End With

⑤ With Selection.Font
⑥  .Name = "游ゴシック"
⑦  .FontStyle = "太字"
⑧  .Size = 48
⑨ End With

これはセルの文字のfontやセル内での数字の表示位置を指定しています。 何故ここで指定してるかと言いますと、サイコロの目(数字)が表示されたときに前回のセルの状態もdefaultに戻ってしまうので入れてあります。 

with~End Withは徐々に説明していきます。 

Range("C2").HorizontalAlignment = xlCenter
Range("C2").VerticalAlignment = xlCenter
などと同じことを書く代わりにWith~End Withを使えば、省力化ができます。


①~⑨は無くてもサイコロは動作します。

Re: 電子サイコロを作りましょう - Tak

2018/05/06 (Sun) 08:45:39

④ 少しサイコロのを化粧します。 

これはセルの「書式設定」でできますが、サイコロを
振ると元の質素な姿に戻ってしまうので、codeの中でサイコロを振るたびに設定しなおしています。

セルの設定は、「塗りつぶし」ー「塗りつぶし効果
」ー「色」「中央から」を選んでOKします。

その経過がcodingされている訳です。


処理の方法は色々有りますので、これもその内の一つと言うことで覚える必要は有りません、ただ眺めておいて下さい。

次のWith~End Withを追加すればお化粧完成です。
-------------------------
 With Selection.Interior
  .Pattern = xlPatternRectangularGradient
  .Gradient.RectangleLeft = 0.5
  .Gradient.RectangleRight = 0.5
  .Gradient.RectangleTop = 0.5
  .Gradient.RectangleBottom = 0.5
  .Gradient.ColorStops.Clear
 End With

 With Selection.Interior.Gradient.ColorStops.Add(0) 
  .ThemeColor = xlThemeColorDark1
  .TintAndShade = 0
 End With

 With Selection.Interior.Gradient.ColorStops.Add(1)
   .ThemeColor = xlThemeColorAccent1
   .TintAndShade = 0
  End With
------------------------

出来上がり図を入れておきます。

Re: 電子サイコロを作りましょう - Tak

2018/05/07 (Mon) 09:44:49

⑤ サイコロを振る別の方法

codeの働きが良く見えるように、次のようなものを作りました。 図を参照してください。

・1~6までのサイコロをシート上に作ります。
・サイコロボタンをクリックする度に、その乱数に従ってそのサイコロのあるセルをコピーします。
・それをセルC1にペースト(貼り付け)します。
・あとは同じことの繰り返しです。

これなら④の一回一回セルのフォントとか放射状グラデュエイションが不要となります。

-------------------------------

Dim i As Integer
Dim ran As Long

'1~6の乱数を発生させる

For i = 1 To 6

Randomize '乱数系列初期化
ran = Int(6 * Rnd + 1)


If ran = 1 Then
 Range("I1").Select: Selection.Copy: Range("C1").Select: ActiveSheet.Paste
End If

If ran = 2 Then
 Range("J1").Select: Selection.Copy: Range("C1").Select: ActiveSheet.Paste
End If

If ran = 3 Then
 Range("K1").Select: Selection.Copy: Range("C1").Select: ActiveSheet.Paste
End If


If ran = 4 Then
 Range("L1").Select: Selection.Copy: Range("C1").Select: ActiveSheet.Paste
End If

If ran = 5 Then
 Range("M1").Select: Selection.Copy: Range("C1").Select: ActiveSheet.Paste
End If


If ran = 6 Then
 Range("N1").Select: Selection.Copy: Range("C1").Select: ActiveSheet.Paste
End If

Next

End Sub


-------------------------------

次回そのcodeの説明を致します。 

Re: 電子サイコロを作りましょう - Tak

2018/05/07 (Mon) 20:58:08

⑥ if文の説明

このif文は非常に便利で、シート上でもマクロでもVBAでもよく使われます。

ではそのif文を使って、乱数の値によってどのcodeが使われるかが決まります。

If ran = 1 Then
 Range("I1").Select: Selection.Copy: Range("C1").Select: ActiveSheet.Paste
End If

このcodeは次のように書いても同じことです。

If ran = 1 Then
 Range("I1").Select
 Selection.Copy
 Range("C1").Select
 ActiveSheet.Paste
End if

今回は、1行に纏めた方が理解しやすいと思いましたのでそう書きました。 

このcodeの意味は、 
・If ran = 1 Then :もしran(発生した乱数)が1なら、 
・Range("I1").Select: セルI1を選べ、 :はそのまま次のcodeを続けるという意味。
・Selection.Copy: 選んだ場所(この場合はセルI1)をコピーしろ。
・Range("C1").Select:  セルC1を選べ。
・ActiveSheet.Paste そこへペースト(張り付け)しろ。
・End If if文終わり

For i=1 To 6 が有るので、これを6回繰り返します。  
例えば、ran=3なら

If ran = 3 Then
 Range("K1").Select: Selection.Copy: Range("C1").Select: ActiveSheet.Paste
End If

のcodeが選ばれ、3のサイコロが表示されます。

発生した乱数の数によって、前もって作っておいたセル(サイコロ)をコピーして持ってくるというやり方です。 これらサイコロは見えないところに作っておくか、表示を非表示にしておけば使う人には見えませんので、セルC1上でサイコロが変わるように見えるわけです。

次回はこのcodeをもう少し格好よくします。

電子サイコロ簡素化最終版 - Tak

2018/05/08 (Tue) 09:15:35

⑦ codeの簡素化

次のような頻出codeは、纏めてDispと関数化しました。

Selection.Copy: Range("C1").Select: ActiveSheet.Paste

-------簡素化したcode-------------


'1~6の乱数を発生させる

Dim i As Integer
Dim ran As Long

For i = 1 To 6
 Randomize '乱数系列初期化
 ran = Int(6 * Rnd + 1)

 If ran = 1 Then Range("I1").Select: Call Disp
 If ran = 2 Then Range("J1").Select: Call Disp
 If ran = 3 Then Range("K1").Select: Call Disp
 If ran = 4 Then Range("L1").Select: Call Disp
 If ran = 5 Then Range("M1").Select: Call Disp
 If ran = 6 Then Range("N1").Select: Call Disp
 Next
End Sub

Sub Disp()
 Selection.Copy: Range("C1").Select: ActiveSheet.Paste
End Sub

-----------------------------

Call Dispとは、Dispと言うSubプロシージャー(プログラム)へ飛んでいけと言う意味です。なので必ずどこかにSub Disp()と言う自作関数が有るはずです。 名前は好きな名前で構いません。


if文は一行で完了する場合は、end ifは不要です。 付けるとエラーとなります。

やってることは、
・最初に乱数発生 
・それに従いセルのサイコロをコピー
・Sub Disp()のところでコピーしたものを、セルC1に張付け

考えれば当たり前のことをやっているだけですので、やり方は他にも沢山あります。

一つ例を挙げますと、セルC1にサイコロ6個作って重ねます。乱数番号のサココロを一番上に表示させるという方でもできます。 またフォントを白数字で書いておき、乱数に従いそのフォントの色を黒くすれば、そのサイコロが急に現れたかの如く見えます。

これで電子サイコロは終わります。
 

名前
件名
メッセージ
画像
メールアドレス
URL
文字色
編集/削除キー (半角英数字のみで4~8文字)
プレビューする (投稿前に、内容をプレビューして確認できます)

Copyright © 1999- FC2, inc All Rights Reserved.