コマンドボタンで起動するコード(プロシージャー)を作ります。
オプションボタンでは、単一的にコード実行させるのではなく、
指定したスタイルで実行の動作を変化させます。
こんにちは、じゅんぱ店長(@junpa33)です。
エクセルVBA抽選ソフト作成のこの記事では、
ユーザーフォーム「抽選NAVIGATOR」にあるボタンを押したときに起動するプロシージャーを作成します。
抽選ソフト作成の記事編成
- エクセルVBA抽選ソフトの使い方とダウンロード
- エクセルVBA抽選ソフトの作成手順
コンテンツ
各コントロールの動作をプロシージャーに記述する
ユーザーフォーム「抽選NAVIGATOR」上の各コマンドボタンとオプションボタンのクリックで実行されるアクションを標準モジュールにコード作成していきます。
- 「 抽選名称復旧」コマンドボタン
- 「抽選表SET」コマンドボタン
- 「抽選項目復旧」コマンドボタン
- 「抽選項目登録」コマンドボタン
- 「抽選項目更新」コマンドボタン
- 「抽選方法12か所」コマンドボタン
- 「抽選結果を保存」コマンドボタン
- 「強制初期化」コマンドボタン
- 「イベントコントロール11か所」オプションボタン
コマンドボタンで実行される紐づけのコード
作成パターンとして、ユーザーフォームのコマンドボタンクリックから、
フォームモジュールで書かれたそれぞれの記述から、標準モジュールの実行プロシージャーを呼び出す
というパターンになります。
今回は、さらにその実行プロシージャーに行く前に、同じ標準モジュール内に実行内容を条件によって振り分ける、という作業をかませることにします。
つまり、その実行の前に、何を実行するかの識別記号を付加したコードを読み込むようにします。
①「 抽選名称復旧」コマンドボタン
Module1に「抽選名称復旧」プロシージャーを記述します。
オブジェクト変数「TYsheet」と「BUsheet」はモジュールの宣言セクションでパブリック変数として宣言してます。
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」「応募者方眼紙」「応募者配置乱数」のプロシージャーを順に実行していきます。
エクセルVBAで抽選表を作成 人数でサイズを変更できるで解説しています。
③「抽選項目復旧」コマンドボタン
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
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の宣言セクションでは以下の変数をパブリック変数として宣言しています。
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・・・・ カウンター変数
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」シートにバックアップする
- 文字列型の当選本数を数値型にデータ型変更する
⑤「抽選項目更新」コマンドボタン
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については次回の記事で紹介していきます。
⑧「強制初期化」コマンドボタン
Module1に「クリアS」を記述します。
エクセルVBAで抽選表を作成 人数でサイズを変更できるで説明しています。
オプションボタンの識別コードを設定
⑨「イベントコントロール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
コマンドボタンで起動するコードを作る まとめ
普通は、コマンドボタンを押せば、その直結している実行プロシージャーが起動することになります。
今回は、抽選実行のパターンが多かったり、オプションボタンでのバリエーションの選択肢があったりとそれぞれについて、
抽選実行前の条件整理を行えるようにコード組みを行いました。
Module3を使って、これらのコードを一まとめに管理できるようにしています。
次回は、抽選項目のバックアップと更新、当選者リストの保存についてです。
Module4に記述していきます。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。