大喜利マクロをつくろう④

先日行われた第4回コンビ大喜利王決定戦「AUN」を配信で楽しみました。めちゃくちゃ面白かった!ずっと真空ジェシカの英雄譚を後日談として見聞きしてきたけど、目の当たりにするとやっぱり二人とも大喜利の回答センスとスピードがいかつ過ぎるな。
いつか大喜利マクロにもコンビ大喜利のモード作りたいと思いました。

ということで大喜利マクロいきます。
①ユーザーフォーム作成
大喜利お題・回答のフォームが小さくて一画面で見られないので、自分の要望に合ったフォームを作成します。
欲しいのは・・・

  • お題表示ゾーン

  • 回答入力フォーム

  • OKボタン

  • PASSボタン

こんな感じ(ユーザ―フォーム名「odai_single」)で作って・・
    '「大喜利お題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プロシージャを割り当ててあるので、トップページのボタンを押して大喜利が表示されたら嬉しいね。

ユーザ―フォーム出た!

②トップページ改良
コンビ大喜利にも対応するようにトップページを改良します。
実現したいフローはこんな感じ。

ということでトップページをこんな感じにします。

続いて、各ボタンを押した後に問題数モードを選択でき、かつ「コンビ大喜利しようと思ったけどやっぱりシンプルにしよう」みたいなときに戻れるボタンを作ります。

31行目付近に「シンプル大喜利」用ボタンを設置
48行目付近に「コンビ大喜利」用ボタンを設置

ということで、外側は完成したので「モード選択」→「問題数洗濯」に移行するためのマクロを組みます。
「マクロの記録」機能を利用して、こんな感じにできました。

'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」。

ちょっとまだデータベース少ないですが、とりあえずこんな感じで・・・。

④コンビ大喜利用のユーザ―フォーム作成
コンビ大喜利用のユーザ―フォームに欲しいのは・・・

  • お題表示ゾーン

  • 回答見出し1表示ゾーン

  • 回答見出し2表示ゾーン

  • 回答入力フォーム1

  • 回答入力フォーム2

  • OKボタン

  • PASSボタン

こんな感じ。ちなみにユーザ―フォーム名は「odai_combi」。

で、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

できました。
さて実行結果は・・・

出来た!
回答データ集計もいい感じっぽい

ということで、大変粗削りなマクロですが、個人的に楽しむのには十分なものができました!
あとはお題のデータベースをコツコツ増やして楽しんでいきます。

お疲れさまでした。

この記事が気に入ったらサポートをしてみませんか?