読者です 読者をやめる 読者になる 読者になる
スポンサーリンク

日本人の氏名のテストデータを,Excel VBAでランダムに生成しよう (ひらがなを使った大量のダミーデータ)

テスト VBA 負荷テスト テストデータ

ダミーの人名を大量に欲しい。という場合がある。

内容は適当でよいが,見栄えのテストとか,容量見積もりの面では実用的な物を。


プログラムのちょっとした動作確認のために使いたいのだ。

特に,日本語のひらがなのソートに関連したロジックの動作検証なんかの時に。


そういったダミーのテストデータは,ExcelとVBAマクロで自動生成するのが手っ取り早い。

  • (1)日本語ひらがなの五十音と,対応するローマ字表記の一覧表
  • (2)VBAマクロのコード
  • (3)生成されたランダムな人名のリスト

(1)日本語ひらがなの五十音と,対応するローマ字表記の一覧表

下記の内容を,「ひらがな」という名前のシートの一番左上にコピペ。


五十音へボン式ローマ字頭文字
aa
ii
uu
ee
oo
kak
kik
kuk
kek
kok
sas
shis
sus
ses
sos
tat
chic
tsut
tet
tot
nan
nin
nun
nen
non
hah
hih
fuf
heh
hoh
mam
mim
mum
mem
mom
yay
yuy
yoy
rar
rir
rur
rer
ror
waw
wow
nn

ヘボン式ローマ字綴方表
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