大喜利マクロをつくろう④
先日行われた第4回コンビ大喜利王決定戦「AUN」を配信で楽しみました。めちゃくちゃ面白かった!ずっと真空ジェシカの英雄譚を後日談として見聞きしてきたけど、目の当たりにするとやっぱり二人とも大喜利の回答センスとスピードがいかつ過ぎるな。
いつか大喜利マクロにもコンビ大喜利のモード作りたいと思いました。
ということで大喜利マクロいきます。
①ユーザーフォーム作成
大喜利お題・回答のフォームが小さくて一画面で見られないので、自分の要望に合ったフォームを作成します。
欲しいのは・・・
お題表示ゾーン
回答入力フォーム
OKボタン
PASSボタン
![](https://assets.st-note.com/img/1643168765780-j43q3p87HM.png?width=1200)
'「大喜利お題DB」シート、「集計」シートを代入する変数を宣言する
Dim od As Worksheet
Dim sk As Worksheet
'大喜利のお題を代入するString型変数を宣言する
Dim qst As String
'大喜利の回答を集計するためのString型変数を宣言する
Dim asw As String
Private Sub UserForm_Initialize()
'「大喜利お題DB」シート、「集計」シートを変数に代入
Set od = Worksheets("大喜利お題DB")
Set sk = Worksheets("集計")
'乱数系列初期化
Randomize
'Long型変数mに大喜利お題DBシートのA列でデータが入力されている最終行の番号を代入
Dim m As Long: m = od.Cells(od.Rows.Count, 1).End(xlUp).Row
'Long型変数nにデータがあるセルの範囲内で行番号をランダム生成した数字を代入
Dim n As Long: n = Int((m - 2 + 1) * Rnd + 2)
'ランダムで選ばれたお題を変数に代入する
qst = od.Cells(n, 1)
'メッセージボックスに「お題」と表示させる
odai_single.odai_midasi.Caption = "お題"
'ランダム抽出したお題を表示させる
odai_single.odai_nakami.Caption = qst
End Sub
Private Sub kaitou_nakami_Change()
'回答欄にデータ入力されたら変数aswにその内容を代入
asw = kaitou_nakami.Text
End Sub
Private Sub OK_Click()
'回答日、お題、回答を「集計」シートに当てはまるように代入していく。
sk.Cells(WorksheetFunction.CountA(sk.Range("A:A")) + 1, 1) = Date
sk.Cells(WorksheetFunction.CountA(sk.Range("B:B")) + 1, 2) = qst
sk.Cells(WorksheetFunction.CountA(sk.Range("C:C")) + 1, 3) = asw
Unload Me
End Sub
Private Sub PASS_Click()
Unload Me
End Sub
その後、1問、5問、10問のプロシージャで上記のユーザ―フォームを呼び出せるようにします。
Sub お題表示()
odai_single.Show
End Sub
Sub お題5問()
'問題表示を5回繰り返すFor文を作る
For i = 1 To 5
odai_single.Show
Next i
End Sub
Sub お題10問()
'問題表示を10回繰り返すFor文を作る
For i = 1 To 10
odai_single.Show
Next i
End Sub
大変シンプルになりました。「odai_single」が先述のユーザ―フォームにつけた名前です。
ということで、すでにトップページのボタンに各Subプロシージャを割り当ててあるので、トップページのボタンを押して大喜利が表示されたら嬉しいね。
![](https://assets.st-note.com/img/1643169360421-emAO8iQkNo.png?width=1200)
②トップページ改良
コンビ大喜利にも対応するようにトップページを改良します。
実現したいフローはこんな感じ。
![](https://assets.st-note.com/img/1643175667524-aKkyTRW9tm.png?width=1200)
ということでトップページをこんな感じにします。
![](https://assets.st-note.com/img/1643177121080-crUXPRdiFT.png?width=1200)
続いて、各ボタンを押した後に問題数モードを選択でき、かつ「コンビ大喜利しようと思ったけどやっぱりシンプルにしよう」みたいなときに戻れるボタンを作ります。
![](https://assets.st-note.com/img/1643177317656-tbnOMQZZHm.png?width=1200)
![](https://assets.st-note.com/img/1643177416945-6C5AyPQIzR.png?width=1200)
ということで、外側は完成したので「モード選択」→「問題数洗濯」に移行するためのマクロを組みます。
「マクロの記録」機能を利用して、こんな感じにできました。
'For文で使用するLong型変数 i を宣言する
Dim i As Long
Sub シンプル大喜利クリック()
' シンプル大喜利クリック Macro
ActiveWindow.ScrollRow = 31
End Sub
Sub 戻る()
' 戻る Macro
ActiveWindow.ScrollRow = 11
End Sub
Sub コンビ大喜利クリック()
' コンビ大喜利クリック Macro
ActiveWindow.ScrollRow = 48
End Sub
ボタンを押すと今開いているシートの指定する行番号まで移動する、みたいな感じです。
③コンビ大喜利用のデータベース作成
コンビ大喜利のデータベースに必要なのは「お題」、「回答用の見出し」です。主なソースはもちろんコンビ大喜利王決定戦「AUN」。
![](https://assets.st-note.com/img/1643177983914-pjPESICpaZ.png?width=1200)
ちょっとまだデータベース少ないですが、とりあえずこんな感じで・・・。
④コンビ大喜利用のユーザ―フォーム作成
コンビ大喜利用のユーザ―フォームに欲しいのは・・・
お題表示ゾーン
回答見出し1表示ゾーン
回答見出し2表示ゾーン
回答入力フォーム1
回答入力フォーム2
OKボタン
PASSボタン
![](https://assets.st-note.com/img/1643178328612-dA7uXqgxh7.png?width=1200)
で、1人用のユーザーフォームのコードを参考にして次のようなプログラムを書いていきました。
'「大喜利お題DB」シート、「集計」シートを代入する変数を宣言する
Dim od As Worksheet
Dim sk As Worksheet
'大喜利のお題を代入するString型変数を宣言する
Dim qst As String
'コンビ大喜利の回答見出し1を代入するString型変数を宣言する
Dim ktm1 As String
'コンビ大喜利の回答見出し2を代入するString型変数を宣言する
Dim ktm2 As String
'コンビ大喜利の回答1を集計するためのString型変数を宣言する
Dim asw1 As String
'コンビ大喜利の回答2を集計するためのString型変数を宣言する
Dim asw2 As String
Private Sub UserForm_Initialize()
'「大喜利お題DB」シート、「集計」シートを変数に代入
Set od = Worksheets("大喜利お題DB")
Set sk = Worksheets("集計")
'乱数系列初期化
Randomize
'Long型変数mに大喜利お題DBシートのC列でデータが入力されている最終行の番号を代入
Dim m As Long: m = od.Cells(od.Rows.Count, 3).End(xlUp).Row
'Long型変数nにデータがあるセルの範囲内で行番号をランダム生成した数字を代入
Dim n As Long: n = Int((m - 2 + 1) * Rnd + 2)
'ランダムで選ばれたお題,を変数に代入する
qst = od.Cells(n, 3)
ktm1 = od.Cells(n, 4)
ktm2 = od.Cells(n, 5)
'メッセージボックスに「お題」と表示させる
odai_combi.odai_midasi.Caption = "お題"
'ランダム抽出したお題を表示させる
odai_combi.odai_nakami.Caption = qst
'お題に沿った回答見出し1を表示させる
odai_combi.kaitou_midasi1.Caption = ktm1
'お題に沿った回答見出し2を表示させる
odai_combi.kaitou_midasi2.Caption = ktm2
End Sub
Private Sub kaitou_nakami1_Change()
'回答欄1にデータ入力されたら変数asw1にその内容を代入
asw1 = kaitou_nakami1.Text
End Sub
Private Sub kaitou_nakami2_Change()
'回答欄2にデータ入力されたら変数asw2にその内容を代入
asw2 = kaitou_nakami2.Text
End Sub
Private Sub OK_Click()
'回答日、お題、回答を「集計」シートに当てはまるように代入していく。
sk.Cells(WorksheetFunction.CountA(sk.Range("A:A")) + 1, 1) = Date
sk.Cells(WorksheetFunction.CountA(sk.Range("B:B")) + 1, 2) = qst
sk.Cells(WorksheetFunction.CountA(sk.Range("C:C")) + 1, 3) = ktm1 & ":" & asw1 & _
" " & ktm2 & ":" & _
asw2
Unload Me
End Sub
Private Sub PASS_Click()
Unload Me
End Sub
で、各ボタンでコンビ大喜利のユーザ―フォームを呼び出せるように設定します。既に1人用大喜利のためにつくってあるモジュールの中に以下のコードを追加します。
Sub コンビお題表示()
odai_combi.Show
End Sub
Sub コンビお題5問()
'問題表示を5回繰り返すFor文を作る
For i = 1 To 5
odai_combi.Show
Next i
End Sub
Sub コンビお題10問()
'問題表示を10回繰り返すFor文を作る
For i = 1 To 10
odai_combi.Show
Next i
End Sub
できました。
さて実行結果は・・・
![](https://assets.st-note.com/img/1643179337433-RAKeDsLl9S.png?width=1200)
![](https://assets.st-note.com/img/1643179969279-W3kKtO4Jl7.png?width=1200)
ということで、大変粗削りなマクロですが、個人的に楽しむのには十分なものができました!
あとはお題のデータベースをコツコツ増やして楽しんでいきます。
お疲れさまでした。
この記事が気に入ったらサポートをしてみませんか?