見出し画像

【初心者ExcelVBA練習】競走馬の冠名と名前をランダムにシャッフル出力する

Excelバージョン

Microsoft Office 365 バージョン 16.0.12130.20084 32 ビット版

事前準備

馬の名前を、【冠名】と【下の名前】でそれぞれA列、B列に記載する。
シート名は【馬名一覧】とする。

馬名一覧

プログラムの構成を想像してみる

①A列の【冠名】を取得する、B列の【下の名前】を取得する
②【冠名】の配列からランダムに取得した値と
 【下の名前】の配列からランダムに取得した値
 を結合して出力する

ここまででソースは以下のようになった

Sub horseNameShuffle()
   
'最大馬名頭数
Dim maxHouseNumber As Integer: maxHouseNumber = 10
'行番号
Dim lineNo As Integer
'冠名の配列
Dim eponymousNameList() As String: ReDim eponymousNameList(maxHouseNumber)
'下の名前の配列
Dim firstNameList() As String: ReDim firstNameList(maxHouseNumber)

'1行目から取得して配列を作成
lineNo = 1
Do While Cells(lineNo, 1) <> ""
   eponymousNameList(lineNo) = Cells(lineNo, 1).Value
   firstNameList(lineNo) = Cells(lineNo, 2).Value
   lineNo = lineNo + 1
Loop

'冠名の取得対象番号
Dim randomEpoNum As Integer: randomEpoNum = Int((lineNo) * Rnd + 1)
'下の名前の取得対象番号
Dim randomFirNum As Integer: randomFirNum = Int((lineNo) * Rnd + 1)

'出力する
Range("E3").Value = eponymousNameList(randomEpoNum) & firstNameList(randomFirNum)

   
End Sub

動作確認してみる

『開発』タブ⇒『マクロ』⇒『実行』で動作確認してみます

馬名一覧_動作確認1

いい感じに出力されています。メジロアマゾンww

ここまでで難しかったポイント

配列の初期化を行うとき、ReDimステートメントでの初期化が必要になる点
これはOKですが

Dim eponymousNameList() As String: ReDim eponymousNameList(maxHouseNumber)

これはNGということです。VBAさん・・なんでやねん。

Dim eponymousNameList(maxHouseNumber) As String

最後にボタンを配置してみます

『開発』タブ⇒『挿入』⇒『フォームコントロール』の『ボタン』
先ほど作成したマクロを選択して、OK。
ボタンを押すたびに馬名が切り替わることを確認。いったん完了とします。

馬名一覧_動作確認2

気になる点

VBAをまだよくわかっていませんが、ソースが大分冗長なきがしました。
特に、冠名配列と下の名前配列の作成をDo While ループ内でループカウンタの番号の配列にて格納するあたりが冗長。
Rangeで一気に持ってこれそうですが、範囲はどのように指定したら・・?
うーん。次回に持ち越します!

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