こんにちは!Lenocoです。本日も見てくださりありがとうございます。
今回はダミーデータ作成についてのTips回です!!!
苗字と名前をランダムに組み合わせてダミーデータを作るマクロ
あらかじめ用意しておいた苗字と名前をランダムに組み合わせ、
ダミーデータを作成するマクロを作ってみました!
先にどんなツールかご説明しておきます。
ツールの説明
②マクロ実行
③ダイアログボックスを表示し、出力したい件数を入力
④ダイアログボックスを表示し、性別を出力するか選択
⑤ダミーデータ出力
⑥完了メッセージ表示
以上
という動きになります。
ダミーデータをすぐ作りたい方、是非使ってみてください!
コード
Sub CreateDummyData()
Dim data1() As Variant '苗字配列
Dim data2() As Variant '名前配列
Dim outputNum As Long '出力件数保存用
Dim outputSexAns As Long '性別出力判定用
Dim rand As Long '乱数保存用
Dim i As Long 'ループ用カウンタ変数
Dim outputRow As Long '出力行
Dim col As Long '列番号保存用
Dim name As String '氏名保存用
'初期値設定
outputNum = 0
outputRow = Selection.Row
col = Selection.Column
data1 = Array("山崎", "森", "池田", "橋本", "阿部", "石川", "山下", "中島", "石井", "小川", _
"前田", "岡田", "長谷川", "藤田", "後藤", "近藤", "村上", "遠藤", "青木", "坂本", _
"斉藤", "福田", "太田", "西村", "藤井", "金子", "岡本", "藤原", "三浦", "中野", _
"中川", "原田", "松田", "竹内", "小野", "田村", "中山", "和田", "石田", "森田", _
"上田", "原", "内田", "柴田", "酒井", "宮崎", "横山", "高木", "安藤", "宮本", _
"大野", "小島", "谷口", "工藤", "今井", "高田", "増田", "丸山", "杉山", "村田", _
"大塚", "新井", "小山", "平野", "藤本", "河野", "上野", "野口", "武田", "松井", _
"千葉", "菅原", "岩崎", "木下", "久保", "佐野", "野村", "松尾", "菊地", "市川", _
"杉本", "古川", "大西", "島田", "水野", "桜井", "高野", "渡部", "吉川", "山内", _
"西田", "飯田", "菊池", "西川", "小松", "北村", "安田", "五十嵐", "川口", "平田")
data2 = Array("愛", "彩", "美穂", "愛美", "千尋", "舞", "美咲", "麻衣", "瞳", "沙織", _
"恵", "彩香", "茜", "美里", "早紀", "麻美", "未来", "明日香", "美紀", "香織", _
"あゆみ", "詩織", "成美", "綾香", "由佳", "智美", "彩乃", "友美", "美香", "仁美", _
"桃子", "梓", "佳奈", "栞", "綾", "恵美", "萌", "めぐみ", "唯", "里奈", _
"美樹", "菜摘", "理沙", "綾乃", "優", "翔子", "理恵", "美幸", "智子", "春菜", _
"翔太", "拓也", "健太", "翔", "大樹", "駿", "大輔", "翔平", "亮", "達也", _
"直人", "直樹", "大地", "雄太", "亮太", "翼", "健人", "諒", "和也", "裕太", _
"優", "卓也", "大介", "健太郎", "恭平", "貴大", "康平", "大輝", "涼", "拓馬", _
"大貴", "裕也", "光", "雄大", "直也", "誠", "健", "一樹", "祐太", "洋平", _
"航", "和樹", "遼", "匠", "祐樹", "裕介", "一馬", "優太", "裕貴", "駿介")
'何件出力するか入力
outputNum = Application.InputBox("何件出力しますか?", "出力件数確認", "", Type:=1)
'性別も出力するか確認
outputSexAns = MsgBox("性別も出力しますか?", vbYesNo)
For i = 1 To outputNum
'苗字
rand = Int(100 * Rnd)
name = data1(rand)
'名前
rand = Int(100 * Rnd)
name = name & " " & data2(rand)
ActiveSheet.Cells(outputRow, col) = name
If outputSexAns = vbYes Then
If rand <= 49 Then
ActiveSheet.Cells(outputRow, col).Offset(, 1) = "女性"
Else
ActiveSheet.Cells(outputRow, col).Offset(, 1) = "男性"
End If
End If
outputRow = outputRow + 1
Next i
MsgBox outputNum & "件出力完了!"
End Sub
コードの説明
まず必要な変数を用意します。
data1とdata2はそれぞれ苗字と名前が入る配列となります。
data1(0)="山崎"
data1(1)="森"
・・・
のように一つずつ入れていくのであればString型で宣言しても良いのですが、
今回はデータの数が多いため、Array関数で一気に設定したいと思いますので、
Array関数の戻り値であるVariant型で宣言しています。
出力件数保存用の「outputNum」と性別出力判定用の「outputSexAns」をLong型で宣言します。
乱数保存用に「rand」というLong型の変数を作成します。これは、苗字の乱数、名前の乱数どちらにも使用します。
続いて初期値の設定です。
出力件数保存用の変数「outputNum」を0で初期化しておきます。
出力行「outputRow」と出力列「col」に選択しているセルの行番号と列番号を設定します。
Array関数を使用し、data1に苗字100件、data2に名前100件を設定します。
※ちなみに、名前は前半50件が女性の名前、後半50件が男性の名前となっています。
横に並べると見づらい&行の文字数の上限があるため、
見やすいように10件ずつで行を分けています。
「 _」(半角ハイフンとアンダーバー)を使い、行を分けることができます。
※If文などでも、条件が増えてしまって見づらくなったときは、この方法を使用すると見やすくなるためおすすめです!
続いてダイアログボックスの表示です。
まず、何件出力したいかを入力してもらいます。
VBAには、InputBox関数がありますが、
今回はほぼ同じ機能の、ApplicationオブジェクトのInputBoxメソッドを使用しています。
その理由は、InputBoxメソッドには、引数として「Type」というものが指定でき、
ここで、入力値のデータ型を決めることができるからです。
今回は出力件数を入力してもらいたいので、「数値」を入力してもらう必要があります。
そのため引数には「1」を指定しています。
Typeに設定できる値の一覧は以下です。
値 | 説明 |
0 | 数式 |
1 | 数値 |
2 | 文字列 (テキスト) |
4 | 論理値 (True または False) |
8 | セル参照 (Range オブジェクト) |
16 | #N/A などのエラー値 |
64 | 値の配列 |
数値以外を入力してOKを押した場合以下のエラーメッセージが表示されます。
次に性別を出力するかどうかを「はい」「いいえ」で選択してもらいます。
Msgbox関数を使用します。Msgboxの構文は以下となります。[ ](カッコ)でくくっている部分は省略可です。
MsgBox (prompt, [ buttons, ] [ title, ] [ helpfile, context ])
以下のようにMsgboxの戻り値なしでprompt(メッセージ)のみ引数に指定すると以下のようなダイアログボックスが表示されます。
MsgBox "性別も出力しますか?"
ただ、これだと「OK」しか押せるボタンが無いので、「はい」「いいえ」のボタンを表示させたいです。
promptのあとにbuttonという引数を指定する必要があります。
buttonに指定できるのは以下となります。(よく使う一部を抜粋しています)
定数 | 値 | 説明 |
vbOKOnly | 0 | [OK] ボタンのみを表示します。 |
vbOKCancel | 1 | [OK] ボタンと [キャンセル] ボタンを表示します。 |
vbAbortRetryIgnore | 2 | [中止]、[再試行]、[無視] の各ボタンを表示します。 |
vbYesNoCancel | 3 | [はい]、[いいえ]、[キャンセル] の各ボタンを表示します。 |
vbYesNo | 4 | [はい] ボタンと [いいえ] ボタンを表示します。 |
vbRetryCancel | 5 | [再試行] ボタンと [キャンセル] ボタンを表示します。 |
vbCritical | 16 | [重大なメッセージ] アイコンを表示します |
vbQuestion | 32 | [警告クエリ] アイコンを表示します。 |
vbExclamation | 48 | [警告メッセージ] アイコンを表示します。 |
vbInformation | 64 | [情報メッセージ] アイコンを表示します。 |
今回は「はい」「いいえ」のボタンを出したいので「vbYesNo」という定数を設定しました。
outputSexAns = MsgBox("性別も出力しますか?", vbYesNo)
表の後半にアイコンについてありますが、ボタンの定数と組み合わせることで、アイコンを設定することができます。
たとえば、以下のように、buttonの引数を「vbYesNo+vbCritical」としてみます。
outputSexAns = MsgBox("性別も出力しますか?", vbYesNo + vbCritical)
すると以下のように表示されます。
「重要なメッセージ」アイコンが表示されました。
今回はメッセージと合わないのでいまいちですが、エラーが出たときに「処理を続けますか?」など確認する際によさそうです。
以下のようにしたらどうでしょうか。
outputSexAns = MsgBox("性別も出力しますか?", vbYesNo + vbInformation)
このように「情報メッセージアイコン」が表示されます。
これならメッセージ内容とも合っているのでよさそうです!
Msgbox関数の戻り値として、「はい」「いいえ」どちらのボタンを押したか判定する値を取得する必要があります。
戻り値はLong型なので、「outputSexAns」はLong型で宣言しています。
「はい」を選んだ場合は「6」、「いいえ」を選んだ場合は「7」が戻り値として返ってきますので「outputSexAns」にはいずれかが入ります。
続いて、For文を使用して指定された出力件数分の氏名をランダムで生成していきます。
カウンタ変数「i」の初期値を1、最大値を「outputNum」とします。
Int関数とRnd関数を使用し、0~99の範囲で整数の乱数を取得します。(0~99というのは配列の要素数の最小~最大値となります。データ件数に応じて変更してください)
整数の乱数を取得する構文は以下となります。
Int((最大値 – 最小値 + 1) * Rnd + 最小値))
今回の値を当てはめてみると以下の形となります。
Int((99 - 0 + 1) * Rnd + 0))
きれいにしてあげると以下の形になりました。
Int(100 * Rnd)
「name」に、乱数で取得した値の番号を使い、苗字配列から取得したデータを格納します。
同じように乱数で値を取得し、名前配列からデータを取得し、先ほどの「name」に入った苗字を残しつつ、
苗字 +[半角スペース]+名前
の形になるようにします。
選択されたセルに「name」を出力します。ループの一回目は、選択セルが出力先となります。
次に、性別の出力です。
まずは、ダイアログボックスで「はい」「いいえ」どちらを選択したかをIf文で判定します。
先ほど、戻り値は「6」か「7」とお伝えしましたが、
親切なことに、戻り値も定数として用意されています。
定数 | 値 | 説明 |
vbOK | 1 | OK |
vbCancel | 2 | Cancel |
vbAbort | 3 | 中止 |
vbRetry | 4 | 再試行 |
vbIgnore | 5 | 無視 |
vbYes | 6 | はい |
vbNo | 7 | いいえ |
「はい」が選択されていた場合、If文に入ります。
このタイミングで、変数「rand」には名前配列の要素数が入っています。
だいぶ前の話で申し訳ないですが、名前配列の前半は女性の名前、後半は男性の名前となっているので、
変数「rand」の値が0~49だった場合は氏名の右隣のセルに「女性」、
変数「rand」の値が50~99だった場合は「男性」と出力します。
右隣のセル、というのはOffset関数を使用しています。
Offset関数で、「基準となるセルから相対的にセルを参照する」ことができます。
今回は以下のように指定していますが、これは、選択したセルから列番号+1したセルを参照する、という意味になります。
行番号は変えないので省略しています。「0」と指定してもOKです。
ActiveSheet.Cells(outputRow, col).Offset(, 1)
For文の最後で「outputRow」に+1しています。これで、1件出力したら次の行、1件出力したら次の行・・・とすることができます。
この1行を忘れてしまうと、永遠に同じ行にデータを上書きしていくことになります。
イメージがつかない方は一度この行をコメントアウトして動かしてみてください!
最後に「〇〇件出力完了!」と出力件数と完了メッセージを出力します。
コードの説明は以上となります。
さいごに
今回はダイアログボックスを複数回出すようにしましたが、
いずれはフォームから一度に設定できるよう改良していきたいと思います。
また、誕生日のデータなどもランダムで自動生成できるよう機能を追加していこうと思います。
長くなってしまいましたが、最後までご覧いただきありがとうございました!
Lenoco