![見出し画像](https://assets.st-note.com/production/uploads/images/16225386/rectangle_large_type_2_50d61708385e154cb149970881bea168.jpeg?width=1200)
Photo by
yokoichi
【初心者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
動作確認してみる
『開発』タブ⇒『マクロ』⇒『実行』で動作確認してみます
いい感じに出力されています。メジロアマゾンww
ここまでで難しかったポイント
配列の初期化を行うとき、ReDimステートメントでの初期化が必要になる点
これはOKですが
Dim eponymousNameList() As String: ReDim eponymousNameList(maxHouseNumber)
これはNGということです。VBAさん・・なんでやねん。
Dim eponymousNameList(maxHouseNumber) As String
最後にボタンを配置してみます
『開発』タブ⇒『挿入』⇒『フォームコントロール』の『ボタン』
先ほど作成したマクロを選択して、OK。
ボタンを押すたびに馬名が切り替わることを確認。いったん完了とします。
気になる点
VBAをまだよくわかっていませんが、ソースが大分冗長なきがしました。
特に、冠名配列と下の名前配列の作成をDo While ループ内でループカウンタの番号の配列にて格納するあたりが冗長。
Rangeで一気に持ってこれそうですが、範囲はどのように指定したら・・?
うーん。次回に持ち越します!
この記事が気に入ったらサポートをしてみませんか?