コマンドボタンで実行するプロシージャーに紐づけのコードを作る-抽選ソフト作成4

tyusencomopteyecatch

コマンドボタンで実行するプロシージャー紐づけのコードを作ります。
今回はエクセルVBA抽選ソフト作成4になります。
単一的に実行させるのではなく、オプションボタンで指定したスタイルで実行の動作を可変させています。

こんにちは、じゅんぱ店長(@junpa33)です。

 

エクセルVBA抽選ソフト作成4では、

ユーザーフォーム「抽選NAVIGATOR」にあるボタンを押したときに起動するプロシージャーを作成します。

 

一つ前の記事を読み返すのはこちら↓になります。

tyusenuformeyecatchユーザーフォームを作成して抽選作業を操作する-抽選ソフト作成3

 

「抽選ソフト作成」の記事一覧を開く

 

コマンドボタンで実行する紐づけコード

 

ユーザーフォーム「抽選NAVIGATOR」上のコマンドボタンとオプションボタンについて、対応するするプロシージャーを作成します。

通常の作成パターンでは、ユーザーフォームのコマンドボタンクリックから、

フォームモジュールの記述によって、標準モジュールの実行プロシージャーへ

というパターンにすることがほとんどです。

今回は、実行プロシージャーの前に、同じ標準モジュールでも1クッションをかませます。

そしてその実行の前に、必要なそれぞれの識別記号を付加したコードを読み込むようにします。

 

  1. 「 抽選名称復旧」コマンドボタン
  2. 「抽選表SET」コマンドボタン
  3. 「抽選項目復旧」コマンドボタン
  4. 「抽選項目登録」コマンドボタン
  5. 「抽選項目更新」コマンドボタン
  6. 「抽選方法12か所」コマンドボタン
  7. 「抽選結果を保存」コマンドボタン
  8. 「イベントコントロール11か所」オプションボタン
  9. 「強制初期化」コマンドボタン

 

各プロシージャーに記述するコード

 

①「 抽選名称復旧」コマンドボタン

 

Module1に「抽選名称復旧」プロシージャーを記述します。

コード


Sub 抽選名称復旧()

    Set TYsheet = Worksheets("抽選会場")
    Set BUsheet = Worksheets("抽選項目BU")
    
    選定ナビ.抽選名称.Value = BUsheet.Range("B2")
    選定ナビ.参加人数.Value = BUsheet.Range("B3")
    選定ナビ.開催日付.Value = BUsheet.Range("B4")

End Sub

 

②「抽選表SET」コマンドボタン

 

Module1に記述した「クリアG」「応募者方眼紙」「応募者配置乱数」のプロシージャーを順に実行していきます。

extyusenranhyoeyecatch乱数表(抽選表)の大きさを参加予定人数に合わせて作る-抽選ソフト作成1

で解説しています。

 

③「抽選項目復旧」コマンドボタン

 

Module1に「抽選項目復旧」プロシージャーを記述します。

コード


Sub 抽選項目復旧()

    Dim Ans As Long
        Set TYsheet = Worksheets("抽選会場")
        Set BUsheet = Worksheets("抽選項目BU")
        
        Ans = MsgBox("抽選項目を復旧します。" & vbCrLf & "今の項目の場合は「はい」" & vbCrLf & _
            "一つ前の項目の場合は「いいえ」" & vbCrLf & "取りやめる場合は「キャンセル」" & vbCrLf & _
                " を押してください", vbYesNoCancel + vbExclamation, "復旧内容")
            
        If Ans = vbYes Then
                選定ナビ.一位賞.Value = BUsheet.Range("B5")
                選定ナビ.二位賞.Value = BUsheet.Range("B6")
                選定ナビ.三位賞.Value = BUsheet.Range("B7")
                選定ナビ.四位賞.Value = BUsheet.Range("B8")
                選定ナビ.五位賞.Value = BUsheet.Range("B9")
                選定ナビ.六位賞.Value = BUsheet.Range("B10")
                選定ナビ.一位本.Value = BUsheet.Range("C5")
                選定ナビ.二位本.Value = BUsheet.Range("C6")
                選定ナビ.三位本.Value = BUsheet.Range("C7")
                選定ナビ.四位本.Value = BUsheet.Range("C8")
                選定ナビ.五位本.Value = BUsheet.Range("C9")
                選定ナビ.六位本.Value = BUsheet.Range("C10")
        ElseIf Ans = vbNo Then
                選定ナビ.一位賞.Value = BUsheet.Range("B17")
                選定ナビ.二位賞.Value = BUsheet.Range("B18")
                選定ナビ.三位賞.Value = BUsheet.Range("B19")
                選定ナビ.四位賞.Value = BUsheet.Range("B20")
                選定ナビ.五位賞.Value = BUsheet.Range("B21")
                選定ナビ.六位賞.Value = BUsheet.Range("B22")
                選定ナビ.一位本.Value = BUsheet.Range("C17")
                選定ナビ.二位本.Value = BUsheet.Range("C18")
                選定ナビ.三位本.Value = BUsheet.Range("C19")
                選定ナビ.四位本.Value = BUsheet.Range("C20")
                選定ナビ.五位本.Value = BUsheet.Range("C21")
                選定ナビ.六位本.Value = BUsheet.Range("C22")
        Else
                Exit Sub
        End If

End Sub

ユーザーフォーム「選定ナビ」のテキストボックスのオブジェクト名が

デフォルトの昇順番号名のままであれば、For~Nextのステートメントを使って、

ここのコードはもう少し簡潔なコードにできると思います。

 

④「抽選項目登録」コマンドボタン

 

Module3に「抽選項目登録」プロシージャーを記述します。

Module3の書き始め

Module3はここで初めて使用しますので、

「挿入」から「標準モジュール」をクリックしてModule3を追加した後、

まず最初に変数の宣言を記述します。

宣言変数

  • PrN(1 To 6)・・・・ テキストボックスに入力された賞名
  • PrQ(1 To 6)・・・・ テキストボックスに入力された当選本数
  • PrQn(1 To 6)・・・・ 当選本数の値を数値型に変更
  • ST・・・・ 賞名番号
  • YN・・・・ 「単発」と「連続」の識別番号
  • OP・・・・ 単発抽選の抽選スピード識別番号
  • OPK・・・・ 単発抽選の点滅回数の識別番号
  • OPr・・・・ 連続抽選の抽選スピード識別番号
  • Jf・・・・ 重複メッセージのON・OFF識別番号
コード


Option Explicit

Public PrN(1 To 6) As String
Public PrQ(1 To 6) As Variant
Public PrQn(1 To 6) As Long
Public ST, YN, OP, OPk, OPr, Jf As Long

 

「抽選項目登録」プロシージャーを記述します。

宣言変数

  • h、i、j・・・・ カウンター変数

 

コードの内容は

  • テキストボックスの空欄対策
  • 変数に値を代入
  • テキストボックスに入力した内容を「抽選項目BU」シートにバックアップする
  • 文字列型の当選本数を数値型にデータ型変更する

です。

 

コード


Sub 抽選項目登録()
    Dim h, i, j As Long
        Set TYsheet = Worksheets("抽選会場")
        Set TOsheet = Worksheets("当選者")
        Set BUsheet = Worksheets("抽選項目BU")
        
        If TYsheet.Range("A1") = "" Then Exit Sub
        
        If 選定ナビ.参加人数.Value = "" Then
            MsgBox "抽選項目の入力が終わっていません。" & vbCrLf & _
            "参加人数は半角数字を入力してください。", vbOKOnly, "メッセージ"
            Exit Sub
        End If
            
        Call Module4.賞名空白対処
        
        TYsheet.Select
        Range("A5:A10", "C5:C10").ClearContents
        
        On Error Resume Next
        
        TItle = 選定ナビ.抽選名称.Value
        EVD = 選定ナビ.開催日付.Value
        Par = 選定ナビ.参加人数.Value
        PrN(1) = 選定ナビ.一位賞.Value
        PrN(2) = 選定ナビ.二位賞.Value
        PrN(3) = 選定ナビ.三位賞.Value
        PrN(4) = 選定ナビ.四位賞.Value
        PrN(5) = 選定ナビ.五位賞.Value
        PrN(6) = 選定ナビ.六位賞.Value
        PrQ(1) = 選定ナビ.一位本.Value
        PrQ(2) = 選定ナビ.二位本.Value
        PrQ(3) = 選定ナビ.三位本.Value
        PrQ(4) = 選定ナビ.四位本.Value
        PrQ(5) = 選定ナビ.五位本.Value
        PrQ(6) = 選定ナビ.六位本.Value
        
        On Error GoTo 0
            
        Call Module4.抽選項目バックアップ
        
        TYsheet.Select
        
        If Range("A1") <> "" Then
            For i = 1 To 6
                Range("A" & 4 + i) = PrN(i)
                PrQn(i) = Val(StrConv(PrQ(i), vbNarrow))
                Range("C" & 4 + i) = PrQn(i) - Range("B" & 4 + i)
        
            Next i
        End If
End Sub

 

MEMO

変数の適用範囲についてはこちらを参考にしてください。

vbasengeneyecatch宣言方法で変数の適用範囲を変える エクセルVBA

Val関数の使い方はこちらを参考にしてください。

VBAValeyecatchVal関数の使い方はデータ型不一致の解決策。値を文字列型から数値型へ

Callステートメントについてはこちらを参考にしてください。

vbacalleyecatch部品化プロシージャーでCallステートメントは必須

StrConv関数の使い方

 

⑤「抽選項目更新」コマンドボタン

 

Module4に記述した「抽選項目バックアップ旧データ」「抽選項目更新」のプロシージャーを順に実行していきます。

Module4
項目のバックアップ、更新、当選リスト作成などはModule4で記述します。
次回の記事で解説していきます。

⑥「抽選方法12か所」コマンドボタン

 

Module3に「一位単ボタン」から「六位連ボタン」までプロシージャーを記述します。

抽選の実行プロシージャーに移る前に、2つの識別番号を付加します。

 

YN・・・・

「0」の時は単発抽選を選択、「1」の時は連続抽選を選択

 

ST・・・・

「1」の時は一位賞を抽選、「2」の時は二位賞を抽選、「3」の時は三位賞を抽選

「4」の時は四位賞を抽選、「5」の時は五位賞を抽選、「6」の時は六位賞を抽選

「一位単ボタン」プロシージャーの場合

コード


Sub 一位単ボタン()
    YN = 0
    ST = 1
    Call Module2.抽選会
End Sub

「一位連ボタン」プロシージャーの場合

コード


Sub 一位連ボタン()
    YN = 1
    ST = 1
    Call Module2.抽選会
End Sub

「5位連ボタン」プロシージャーの場合

コード


Sub 五位連ボタン()
    YN = 1
    ST = 5
    Call Module2.抽選会
End Sub

 

⑦「抽選結果を保存」コマンドボタン

 

Module4に「当選者リスト作成」プロシージャーを記述します。

Module4については次回の記事で紹介していきます。

 

⑧「イベントコントロール11か所」オプションボタン

 

Module3に「option1ボタン」から「option11ボタン」までプロシージャーを記述します。

 

オプションボタンが選択されたときに、それぞれの識別番号を付加します。

 

OP・・・・

「1」の時は500×0.3ミリ秒、「2」の時は300×0.3ミリ秒、「3」の時は150×0.3ミリ秒、「0」の時は500×0.2ミリ秒

 

OPk・・・・

「1」の時は5回、「2」の時は10回、「3」の時は20回、「0」の時は15回

 

OPr・・・・

「1」の時は300ミリ秒、「2」の時は200ミリ秒、「3」の時は100ミリ秒、「0」の時は250ミリ秒

 

Jf・・・・

「0」の時はメッセージを表示、「1」の時はメッセージを表示しない

 

コード


Sub option1ボタン()
    OP = 1
End Sub
コード


Sub option2ボタン()
    OP = 2
End Sub
コード


Sub option3ボタン()
    OP = 3
End Sub
コード


Sub option4ボタン()
    OPk = 1
End Sub
コード


Sub option5ボタン()
    OPk = 2
End Sub
コード


Sub option6ボタン()
    OPk = 3
End Sub
コード


Sub option7ボタン()
    OPr = 1
End Sub
コード


Sub option8ボタン()
    OPr = 2
End Sub
コード


Sub option9ボタン()
    OPr = 3
End Sub
コード


Sub option10ボタン()
    Jf = 0
End Sub
コード


Sub option11ボタン()
    Jf = 1
End Sub

 

⑨「強制初期化」コマンドボタン

 

Module1に「クリアS」を記述します。

extyusenranhyoeyecatch乱数表(抽選表)の大きさを参加予定人数に合わせて作る-抽選ソフト作成1

で説明しています。

 

コマンドボタンで起動するコードを作る まとめ

 

普通は、コマンドボタンを押せば、その直結している実行プロシージャーが起動することになります。

今回は、抽選実行のパターンが多かったり、オプションボタンでのバリエーションの選択肢があったりとそれぞれについて、

抽選実行前の条件整理を行えるようにコード組みを行いました。

Module3を使って、これらのコードを一まとめに管理できるようにしています。

 

次回は、抽選項目のバックアップと更新、当選者リストの保存についてです。

Module4に記述していきます。

 

短期間でエクセルVBAの独学習得を目指したいなら

 

エクセルVBAを独学する独習方法は、学習者それぞれ十人十色、多種多様と思われます。

けれども、

出来るだけ効率よく学習するためには、いくつかの大切なポイントがあります。

独学でもVBA習得の中級クラスに達するのはそんなに難しいことではありません。

先人が行った勉強方法をあなたがそのまま利用すればよいということです。

独習のための大切な7つのポイントは、上記記事にて解説しています。

重要ワード

独習によるVBA習得のキーワードは、

出来るだけ多くの実例に触れること!

です。

正直、VBAの学習について自分の周りの仕事(業務)からだけ実例を得るのでは効率良い習熟は無理です。

ハッキリ言って、

本当に短い期間でVBA習得を成功させたいなら、今使っている参考書が良書かどうかを判断し、新ツールとしてオンライン学習も取り入れて行うことが、

手っ取り早く短期間習得できるというのは間違いないでしょう。

 

「エクセルVBA最速理解」の記事一覧を開く

 

今回の記事はここまでです。   最後までご覧いただき有難うございました。

 

 

<記事内容についての告知>VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。