2024年9月14日土曜日

ユーザーフォームのコントロールを活性・非活性で処理するコードは役立ちそうだ ー UserForm1.Controls(VBAマクロ)

一個ずつ表示される
        
写真は、ユーザーフォームで”モグラたたきが”できないか、実験した結果です。
表示まではコマンドボタンを動的配列で作成する方法で、前の投稿で紹介済み。

その後、コマンドボタンの背景に写真が貼り付けられることが、分かりました。
まあ、貼り付けた結果の写真ですが、ゲーム的な動きを加えて見たくなったの。

先ず、ボタンの個数分だけ、重複しない乱数をワークシートに書き込んでおく。
その数をひとつずつ読み出しては、その位置にあるボタンを表示させてみます。

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 件のコメント:

コメントを投稿