一個ずつ表示される |
写真は、ユーザーフォームで”モグラたたきが”できないか、実験した結果です。
表示まではコマンドボタンを動的配列で作成する方法で、前の投稿で紹介済み。
その後、コマンドボタンの背景に写真が貼り付けられることが、分かりました。
まあ、貼り付けた結果の写真ですが、ゲーム的な動きを加えて見たくなったの。
先ず、ボタンの個数分だけ、重複しない乱数をワークシートに書き込んでおく。
その数をひとつずつ読み出しては、その位置にあるボタンを表示させてみます。
0.5秒ぐらい表示させたら、ボタン機能を無効にして非表示にしてしまいます。
こうして、最後の一個までランダムに表示するような動作のコードが完成です。
もし、ボタンが表示中にクリック出来たら、叩いたと言うことにしてカウント。
ですが、ボタン表示ですぐクリックすると、エラーの発生で止まってしまった。
なので、ここでは忘備録的にフォームのコントロール機能を取り上げてみます。
他には、テキストボックスを非表示にしても、値の書出し読取りはできますな。
コントロールの構文は、同じような感じで他の部品でも流用ができる分けです。
細かい設定をすることで、プログラムの挙動に変化を作られそうな感じですな。
というわけで、サンプル構文を紹介しますので面白そうだったらお試し下さい。
それで、ユーザーフォームでは、一度フォームを単純に表示させてから、マウスクリックで初期化として、ボタンを連続的にランダムに表示させえ消していくと言う工夫なので、何かに使えるのでは思ったのでした。
Private Sub Workbook_Open() 'ThisWorkbookの記述
Call RndmNrMkng 'Moduleに記述
UserForm1.Show vbModeless 'ユーザーフォーム表示
End Sub
Private Sub UserForm_Click() 'ユーザーフォームのコード記述
'ユーザーフォームボタン動的生成(クリックイベント)・initializeで起動しない
Call LyOtMkng
Call MoguraMkng
Call RndmNrMkng
End Sub
Private Sub LyOtMkng() 'ユーザーフォームのコード記述
'クリックイベントでフォーム初期化・ボタン動作
With UserForm1
.Height = 334
.Width = 288
.Caption = "もぐらたたき"
End With
End Sub
Private Sub MoguraMkng() 'ユーザーフォームのコード記述
Dim i As Long, j As Long, Bt As Control
For i = 1 To 64 'ボタンを作るループ処理
Set Bt = UserForm1.Controls.Add("Forms.CommandButton.1", "Btn" & i)
With Bt 'ラベルの詳細を設定
.Width = 36 'コマンドボタン巾
.Height = 36 'コマンドボタン高さ
.Left = LftNr(Range("A" & i).Value) '水平位置・乱数読み取り
.Top = TpNr(Range("A" & i).Value) '垂直位置・乱数読み取り
.Picture = LoadPicture(ThisWorkbook.Path & "\Mogura.jpg")
'ブックのパスにモグラ画像・ボタン貼り付け
DoEvents
Application.Wait [Now()] + 0.5 / 86400 '表示、0.5秒
If .Enabled = True Then .Enabled = False 'ボタン機能停止
If .Visible = True Then .Visible = False 'ボタン非表示
.Picture = LoadPicture("") '画像貼付け消去
End With
Next i
Set Bt = Nothing
End Sub
Function LftNr(ByVal i As Long) 'ユーザーフォームコード記述
Dim j As Long '関数プロシージャ:ボタン水平位置
j = i Mod 7
Select Case j
Case 1
LftNr = 10
Case 2
LftNr = 10 + 36 * 1
Case 3
LftNr = 10 + 36 * 2
Case 4
LftNr = 10 + 36 * 3
Case 5
LftNr = 10 + 36 * 4
Case 6
LftNr = 10 + 36 * 5
Case 0
LftNr = 10 + 36 * 6
End Select
End Function
Function TpNr(ByVal i As Long) 'ユーザーフォームコード記述
Select Case i '関数プロシージャ:ボタン垂直位置
Case Is <= 7
TpNr = 25
Case Is <= 14
TpNr = 25 + 36 * 1
Case Is <= 21
TpNr = 25 + 36 * 2
Case Is <= 28
TpNr = 25 + 36 * 3
Case Is <= 35
TpNr = 25 + 36 * 4
Case Is <= 42
TpNr = 25 + 36 * 5
Case Is <= 49
TpNr = 25 + 36 * 6
End Select
End Function
Sub RndmNrMkng() 'Moduleのコード記述・シート1・A列に乱数書き出し
Dim i As Long, j As Long, flg(49) As Boolean
Sheet1.Columns(1).Clear
Randomize
For i = 1 To 49
Do
j = Int((49 - 1 + 1) * Rnd + 1) '乱数生成式(最小値・最大値代入)
If flg(j) = False Then
flg(j) = True
Exit Do
End If
Loop
Sheet1.Cells(i, 1).Value = j 'シート1・A列に乱数書き出し
Next i
End Sub
0 件のコメント:
コメントを投稿