日本人の氏名のテストデータを,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