日本人の氏名のテストデータを,Excel VBAでランダムに生成しよう (ひらがなを使った大量のダミーデータ)
ダミーの人名を大量に欲しい。という場合がある。
内容は適当でよいが,見栄えのテストとか,容量見積もりの面では実用的な物を。
プログラムのちょっとした動作確認のために使いたいのだ。
特に,日本語のひらがなのソートに関連したロジックの動作検証なんかの時に。
そういったダミーのテストデータは,ExcelとVBAマクロで自動生成するのが手っ取り早い。
- (1)日本語ひらがなの五十音と,対応するローマ字表記の一覧表
- (2)VBAマクロのコード
- (3)生成されたランダムな人名のリスト
(1)日本語ひらがなの五十音と,対応するローマ字表記の一覧表
下記の内容を,「ひらがな」という名前のシートの一番左上にコピペ。
| 五十音 | へボン式ローマ字 | 頭文字 |
|---|---|---|
| あ | a | a |
| い | i | i |
| う | u | u |
| え | e | e |
| お | o | o |
| か | ka | k |
| き | ki | k |
| く | ku | k |
| け | ke | k |
| こ | ko | k |
| さ | sa | s |
| し | shi | s |
| す | su | s |
| せ | se | s |
| そ | so | s |
| た | ta | t |
| ち | chi | c |
| つ | tsu | t |
| て | te | t |
| と | to | t |
| な | na | n |
| に | ni | n |
| ぬ | nu | n |
| ね | ne | n |
| の | no | n |
| は | ha | h |
| ひ | hi | h |
| ふ | fu | f |
| へ | he | h |
| ほ | ho | h |
| ま | ma | m |
| み | mi | m |
| む | mu | m |
| め | me | m |
| も | mo | m |
| や | ya | y |
| ゆ | yu | y |
| よ | yo | y |
| ら | ra | r |
| り | ri | r |
| る | ru | r |
| れ | re | r |
| ろ | ro | r |
| わ | wa | w |
| を | wo | w |
| ん | n | n |
ヘボン式ローマ字綴方表
http://www.seikatubunka.metro.tokyo.j...
(2)VBAマクロのコード
下記のコードを入力。
' 全員分のテストデータを作成 Sub createAllTestData() ' 生成する人数 num_persons = 100 ' 書き込み対象のシート名 target_sheet_name = "Sheet3" ' 生成を実行 For i = 1 To num_persons createOneTestData i, target_sheet_name Next i MsgBox "生成が終わりました。" End Sub ' 一人分のテストデータを作成 Sub createOneTestData(index, target_sheet_name) ' 性別を決定 sex_type = getRandomSexType() ' 名字を生成 myouji = getRandomMyouji ' 名前を生成 namae = getRandomNamae(sex_type) ' 氏名の頭文字を認識 initial_char = getInitialChar(myouji) ' 書き込み writeOnePerson index, target_sheet_name, myouji, namae, initial_char End Sub ' ランダムな性別を決定 Function getRandomSexType() If Rnd >= 0.5 Then ' http://www.vba-world.com/rnd_1.html ret = "m" Else ret = "f" End If 'MsgBox "sex_type = " & ret getRandomSexType = ret End Function ' ランダムな名字を生成 Function getRandomMyouji() ' ランダムなひらがなを生成 first_char = getRandomHiragana ' 名字の末尾をランダムに決定 random_value = Rnd If random_value < 0.25 Then tail_part = "山" ElseIf random_value < 0.5 Then tail_part = "川" ElseIf random_value < 0.75 Then tail_part = "田" Else tail_part = "沢" End If ' 結合 myouji = first_char & tail_part 'MsgBox "myouji = " & myouji getRandomMyouji = myouji End Function ' 性別に応じたランダムな名前を生成 ' ランダムな名字を生成 Function getRandomNamae(sex_type) ' ランダムなひらがなを生成 first_char = getRandomHiragana second_char = getRandomHiragana ' 名前の末尾をランダムに決定 random_value = Rnd If sex_type = "m" Then ' 男性の場合 If random_value < 0.25 Then tail_part = "男" ElseIf random_value < 0.5 Then tail_part = "人" ElseIf random_value < 0.75 Then tail_part = "郎" Else tail_part = "夫" End If Else ' 女性の場合 If random_value < 0.34 Then tail_part = "子" ElseIf random_value < 0.67 Then tail_part = "代" Else tail_part = "美" End If End If ' 結合 namae = first_char & second_char & tail_part 'MsgBox "namae = " & namae getRandomNamae = namae End Function ' ランダムなひらがなを一文字取得 Function getRandomHiragana() min_index = 2 max_index = 47 ' ランダムな行を決定 random_index = Int((max_index - min_index + 1) * Rnd + min_index) ch = Sheets("ひらがな").Cells(random_index, 1).Value 'MsgBox "ひらがな = " & ch getRandomHiragana = ch End Function ' 名字の頭文字を認識 Function getInitialChar(myouji) ' 一文字目を切り出し first_char = Left(myouji, 1) ' 対応する頭文字に変換 alphabet = Application.WorksheetFunction.VLookup( _ first_char, _ Sheets("ひらがな").Range("A2:C47"), _ 3, False _ ) ' http://language-and-engineering.hatenablog.jp/entry/20101112/p1 ' http://soudan1.biglobe.ne.jp/qa5951470.html getInitialChar = alphabet End Function ' 一人分の情報を書き込み Sub writeOnePerson(index, target_sheet_name, myouji, namae, initial_char) Sheets(target_sheet_name).Cells(index, 1) = initial_char Sheets(target_sheet_name).Cells(index, 2) = myouji Sheets(target_sheet_name).Cells(index, 3) = namae End Sub
(3)生成されたランダムな人名のリスト
createAllTestData()ルーチンを実行する。
ダミーデータが100人分,いっきに生成される。
手元の環境で実行したら,こんな結果になった。
| m | も沢 | むう代 |
| y | ゆ川 | をる男 |
| c | ち田 | やう郎 |
| s | せ田 | ほす子 |
| y | よ田 | んれ男 |
| n | ん山 | のお夫 |
| a | あ田 | おお夫 |
| u | う川 | つせ美 |
| t | て川 | くく郎 |
| t | て田 | たほ子 |
| h | ひ山 | にれ子 |
| t | つ川 | ろほ郎 |
| o | お田 | みろ美 |
| n | の沢 | とみ代 |
| n | に川 | てす男 |
| n | ん山 | つち代 |
| n | に川 | への子 |
| m | ま田 | つお夫 |
| m | も田 | らあ子 |
| o | お川 | かあ代 |
| h | は沢 | えけ郎 |
| c | ち山 | むろ代 |
| m | も川 | にぬ子 |
| o | お田 | くろ子 |
| s | す沢 | もす美 |
| o | お山 | そゆ子 |
| n | ぬ川 | たう代 |
| r | り田 | もろ子 |
| e | え田 | てを男 |
| h | へ川 | きぬ男 |
| k | か山 | たは夫 |
| t | て沢 | らま郎 |
| t | た川 | てみ男 |
| n | の沢 | のと代 |
| h | へ川 | みる代 |
| s | せ山 | のさ代 |
| r | る川 | けみ美 |
| y | や山 | よこ夫 |
| u | う沢 | つに子 |
| k | く山 | むの代 |
| n | に田 | もて美 |
| o | お田 | むあ人 |
| s | す沢 | ゆむ代 |
| s | す川 | とわ男 |
| c | ち山 | けえ人 |
| n | の川 | をさ人 |
| s | す田 | きね美 |
| r | れ田 | なみ男 |
| m | む川 | くさ人 |
| u | う田 | もゆ人 |
| y | ゆ田 | れる人 |
| w | わ沢 | むて子 |
| k | く田 | てお子 |
| r | り川 | けれ人 |
| y | や山 | なさ美 |
| t | つ川 | りひ夫 |
| t | た沢 | しし男 |
| a | あ田 | らす美 |
| y | よ田 | なえ代 |
| m | む川 | ゆき代 |
| s | し沢 | かん郎 |
| r | れ田 | しり男 |
| m | も山 | つて代 |
| h | ひ山 | えれ子 |
| r | れ山 | わら人 |
| y | や沢 | つけ子 |
| k | く田 | おこ美 |
| k | け沢 | にあ人 |
| m | も沢 | よけ子 |
| k | き川 | けん美 |
| m | め山 | しい夫 |
| y | ゆ川 | なは夫 |
| k | こ山 | ちひ人 |
| t | と田 | うは男 |
| r | ろ沢 | らて夫 |
| s | し山 | みあ人 |
| k | か山 | せて郎 |
| s | せ沢 | そつ代 |
| t | て田 | まて夫 |
| n | ね山 | ひも人 |
| s | せ田 | るす人 |
| s | せ沢 | やひ代 |
| n | ね沢 | りお代 |
| e | え川 | むぬ代 |
| n | ん田 | のへ男 |
| s | せ山 | くと代 |
| y | や山 | てう人 |
| n | ね田 | たれ夫 |
| t | と田 | くう男 |
| w | わ川 | みゆ男 |
| n | ぬ山 | ふれ夫 |
| a | あ田 | をあ夫 |
| s | せ田 | よい子 |
| s | そ川 | ねめ人 |
| e | え川 | ひや代 |
| y | よ川 | ゆめ郎 |
| k | け沢 | えし夫 |
| s | さ山 | さろ人 |
| m | む田 | やも子 |
| m | め沢 | さち郎 |
微妙にありそうで無さそうな名前が,一瞬で一杯できた。
これらをダミーデータとして使う。
もしも
- 「名字が"ん"で始まるのは明らかにダメだろ」
- 「ひらがなはやめて,漢字のペアにしてくれ」
とか細かい要求があれば,マクロにもう少し手を加えればいい。
関連エントリ:
大量のテストデータを快適に作る7つのコツ - 負荷テストのためにExcel&VBAをうまく使う
http://language-and-engineering.hatenablog.jp/entry/20080929/1222698370