概要
VBAを使ったテストデータの自動生成の検討記事です。
今回はランダムな文字列の自動生成です。
これは、VBAによるテストデータの自動生成(半角英数字)で簡略化した部分の拡張用情報となります。
検討
VBAによるテストデータの自動生成(半角英数字)では生成する半角英数字の値が固定になっていました。
テストデータとして、値には何かセットされていればいい、という場合は問題ありませんが、それでは要求を満たせない場合もあります。
今回は、ランダムな文字列を生成してテストデータの値とするように拡張を考えます。
方式
文字種生成と文字列生成部分を関数化して、VBAによるテストデータの自動生成(半角英数字)を拡張するようにします。
文字種生成
文字種生成部分を部品化することで、柔軟に文字種の変更を可能とします。
今回はASCIIコードの英数字部分を文字種として生成するようにしました。
文字列生成
文字種を材料にして、与えられた長さのランダムな値の文字列を生成します。
実装例
文字種生成
今回は、数字、英字(大文字)、英字(小文字)を文字種とします。
後述のコード2のように文字列を手動で書いてもいいんですが
今回はASCIIコードを意識しながら編集して作成しました。
文字種を変更したい場合は、この部品を変更するだけになります。
(例えば記号を加えたい、全角文字も入れたいなど)
コード
'
' 文字種の生成(英字(大文字・小文字)+数字)
'
Function getBaseStr() As String
'文字種ワーク
Dim tmpstr As String
'文字コード走査用添字
Dim i As Integer
'数字
For i = &H30 To &H39
tmpstr = tmpstr + Chr(i)
Next
'英字(大文字)
For i = &H41 To &H5A
tmpstr = tmpstr + Chr(i)
Next
'英字(小文字)
For i = &H61 To &H7A
tmpstr = tmpstr + Chr(i)
Next
'作成した文字種を返す
getBaseStr = tmpstr
End Function
コード2
'
' 文字種の生成(英字(大文字・小文字)+数字)
'
' ※こんな風にしてもよいという例
' 泥臭いけどこっちの方がメンテしやすいかも
'
Function getBaseStr() As String
getBaseStr = "0123456789" & _
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" & _
"abcdefghijklmnopqrstuvwxyz"
End Function
説明
Chr関数でASCIIコードに対応する文字を取得しています。
全体的な説明は、コード1のコメントを参照
実行結果
実装通り、数字(0~9)と半角英字(A~Z、a~z)が文字種となり返却されました。

文字列生成
文字種と生成したい文字列の長さを与えるとランダムな文字列を返す部品です。
パスワード生成処理のような動きをします。
コード
'
' ランダムな文字列生成
'
' #1 basestr 文字種
' #2 itemlen 長さ
'
Function getRandomStr(basestr As String, itemlen As Integer) As String
'乱数初期化
Randomize
'文字種の文字数取得
Dim baselen As Integer
baselen = Len(basestr)
'長さ分の文字列生成用添字
Dim i As Integer
'ランダムな文字列編集用領域
Dim tmpstr As String
tmpstr = ""
'文字種の何番目の文字を使うか
Dim findpos As Integer
'要求された長さ分、ランダムな文字列を選び編集
For i = 1 To itemlen
'文字種の何番目の文字を使うか
findpos = Int(baselen * Rnd + 1)
'上記で決めた1文字を文字列編集用領域に追加
tmpstr = tmpstr + Mid(basestr, findpos, 1)
Next
'作成した文字列編集用領域を返す
getRandomStr = tmpstr
End Function
説明
全体的な説明はコメントを参照ください。
流れとしては、生成したい文字列の長さ分だけ、乱数を使って文字種から1文字取得することを繰り返して文字列にしています。
実行結果
上記で作成した文字種の生成部品の返却値と作成したい文字列の長さを与えて実行しました。
長さにそれぞれ12, 5, 20を与えて3回実行した結果です。

次回は、今回作成した部品で前回の生成ツールの拡張をしたいと思います。
前回:VBAによるテストデータの自動生成(半角英数字)
いきなりテストデータ生成用のツールを作るのではなく
本ページのように機能毎に部品化して開発すると
生成可能な値を目で検証しながら成長させつつ
汎用的なツールを構築していくことが出来ます。
