コマンドボタンのコード作成とオプションボタンの識別コード

tyusencomopteyecatch

コマンドボタンで起動するコード(プロシージャー)を作ります。
オプションボタンでは、単一的にコード実行させるのではなく、

指定したスタイルで実行の動作を変化させます。

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

エクセルVBA抽選ソフト作成のこの記事では、

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

各コントロールの動作をプロシージャーに記述する

tyusencomoptp001

ユーザーフォーム「抽選NAVIGATOR」上の各コマンドボタンとオプションボタンのクリックで実行されるアクションを標準モジュールにコード作成していきます。

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

コマンドボタンで実行される紐づけのコード

tyusencomoptp002

作成パターンとして、ユーザーフォームのコマンドボタンクリックから、

フォームモジュールで書かれたそれぞれの記述から、標準モジュールの実行プロシージャーを呼び出す

というパターンになります。

今回は、さらにその実行プロシージャーに行く前に、同じ標準モジュール内に実行内容を条件によって振り分ける、という作業をかませることにします。

つまり、その実行の前に、何を実行するかの識別記号を付加したコードを読み込むようにします。

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

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

オブジェクト変数「TYsheet」と「BUsheet」はモジュールの宣言セクションでパブリック変数として宣言してます。

VBA
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 エクセルVBAで抽選表を作成 人数でサイズを変更できる

で解説しています。

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

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

VBA
Sub 抽選項目復旧()
    Dim Ans As Long
        Set TYsheet = Worksheets("抽選会場")
        Set BUsheet = Worksheets("抽選項目BU")
        Ans = MsgBox("抽選項目を復旧します。" & vbCrLf & _
            "今の項目の場合は「はい」" & vbCrLf & _
            "一つ前の項目の場合は「いいえ」" & vbCrLf & _
            "取りやめる場合は「キャンセル」" & vbCrLf & "を押してください" _
            , vbYesNoCancel + vbExclamation, "復旧内容")
        If Ans = vbYes Then
                With 選定ナビ
                    .一位賞.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")
                End With
        ElseIf Ans = vbNo Then
                With 選定ナビ
                    .一位賞.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")
                End With
        Else
                Exit Sub
        End If
End Sub

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

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

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

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

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

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

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

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

Module3の宣言セクションでは以下の変数をパブリック変数として宣言しています。

VBA
Option Explicit

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

プロシージャー内の変数   h、i、j・・・・ カウンター変数

VBA
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
        With 選定ナビ
            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
        End With
        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

コード内容

  • テキストボックスの空欄対策
  • 変数に値を代入
  • テキストボックスに入力した内容を「抽選項目BU」シートにバックアップする
  • 文字列型の当選本数を数値型にデータ型変更する
vbasengeneyecatch 宣言方法で変数の適用範囲を変える エクセルVBA VBAValeyecatch Val関数はデータ型不一致の解決策。文字列型から数値型へ vbacalleyecatch 部品化プロシージャーでCallステートメントは必須

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

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

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

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

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

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

YN・・・・

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

ST・・・・

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

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

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

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

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

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

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

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

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

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

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

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

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

extyusenranhyoeyecatch エクセルVBAで抽選表を作成 人数でサイズを変更できる

で説明しています。

オプションボタンの識別コードを設定

tyusencomoptp003

⑨「イベントコントロール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」の時はメッセージを表示しない

VBA
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

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

tyusencomoptp004

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

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

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

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

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

Module4に記述していきます。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

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

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

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