VBA別館・Python別館
電子サイコロの簡素化 - 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個作って重ねます。乱数番号のサココロを一番上に表示させるという方でもできます。 またフォントを白数字で書いておき、乱数に従いそのフォントの色を黒くすれば、そのサイコロが急に現れたかの如く見えます。
これで電子サイコロは終わります。