概要
VBAを使ったテストデータの自動生成の検討記事です。
今回は半角英数字文字列の自動生成です。
検討
半角英数字文字列の値の生成については用途により様々なパターンが考えられます。
今回はよりシンプルなものを自動生成してみます。
自動生成するにあたり、必要となる条件(ルール)と具体的な例を書き上げてみます。
データ生成のネタ
半角英数字文字列の値の自動生成のための条件を挙げてみました。
| 条件名 | 内容 |
|---|---|
| 文字種 | どんな文字で文字列を構成するか指定します。 |
| 長さ | 文字列の長さを指定します。 |
| 可変長固定長 | 文字列が可変長か固定長かを指定します。 |
| ユニーク属性 | 文字列がユニークかどうかを指定します。 |
| Not Null属性 | 文字列がNullを許すかどうか指定します。 |
| 生成件数 | テストデータの生成件数を指定します。 |
今回はシンプルに説明をすすめるためユニーク属性とNot Null属性は省いて話を進めます。
また文字種も英字なのか数字なのか記号なのか指定出来たり、値そのものも動的に生成した方がよりよいですが、複雑になってしまい、本題から外れてしまうので今回は固定とします。
(動的な文字列の生成や他の条件については次回のネタとしたいと思います。)
具体的な例1 固定長文字列の生成
条件設定の具体的な例を示します。
さらに後半においてこの例でサンプル実装してみます。
| 項目 | 条件(ルール) |
|---|---|
| 文字種 | ABCDEFGHIJ0123456789(固定) |
| 長さ | 20 |
| 可変長固定長 | 固定長 |
| 生成件数 | 100件 |
具体的な例2 可変長文字列の生成
条件設定の具体的な例を示します。
さらに後半においてこの例でサンプル実装してみます。
| 項目 | 条件(ルール) |
|---|---|
| 文字種 | ABCDEFGHIJ0123456789(固定) |
| 長さ | 20 |
| 可変長固定長 | 可変長 |
| 生成件数 | 100件 |
実装例
例1のサンプルコード
値は自動生成した後、検証のためExcelシートに書き出す仕様とします。
実際にテストデータ作成ツールとして使用する際には
他の項目の値も同時に生成して
レコード単位でデータを書き込むような実装になると思います。
コード
'
' 半角文字列(英数字)の自動生成
'
Sub make02()
'----- 生成条件のする値の条件設定 -----
'文字種
Dim base_str As String
base_str = "ABCDEFGHIJ0123456789"
'長さ
Dim item_len As Integer
item_len = 20
'可変長・固定長(F:固定長、V:可変長)
Dim type_str As String
type_str = "F"
'NULL許容(Y:NULLあり、N:NULLなし)
'not_null = "Y"
'Unique制約(Y:制約あり、N:制約なし)
'is_unique = "Y"
'生成件数
Dim data_count As Integer
data_count = 100
'生成したテストデータを展開するシート
Dim p As Worksheet
Set p = Worksheets("半角データ")
Dim pcount As Integer
pcount = 0
Dim i As Integer
Dim tmp_item_len As Integer
'----- 自動生成部分 -----
'件数分、処理を繰り返す
For i = 1 To data_count
DoEvents
'長さ決定
If type_str = "F" Then
'固定長
tmp_item_len = item_len
Else
'可変長
tmp_item_len = Int(item_len * Rnd + 1)
End If
p.Cells(i, 1) = i
'データ連番データ生成
p.Cells(i, 2) = Left(base_str, tmp_item_len)
Next
End
End Sub
説明
全体的な説明はコメントを参照
9行め:文字種は固定の文字列です。
15行め:固定長の指定をしています。
実際に自動生成している箇所は51行めです。
44行め:固定長指定なので長さも固定です。
53行め:文字種から長さ分の文字列を切り出して自動生成の値として、Excelシートへセット
実行結果
Excelシートに自動生成した値がセットされています。
自動生成といっても文字種と長さを固定しているのであまりありがたみを感じないかもしれません。
(1行め~100行め)


例2のサンプルコード
例1と同様にすすめます。
異なるのは文字列の長さを可変長指定にしたところです。
サンプルコードも例1と13行めを除き、まったく同じです。
コード
'
' 半角文字列(英数字)の自動生成
'
Sub make02()
'----- 生成条件のする値の条件設定 -----
'文字種
Dim base_str As String
base_str = "ABCDEFGHIJ0123456789"
'長さ
Dim item_len As Integer
item_len = 20
'可変長・固定長(F:固定長、V:可変長)
Dim type_str As String
type_str = "V"
'NULL許容(Y:NULLあり、N:NULLなし)
'not_null = "Y"
'Unique制約(Y:制約あり、N:制約なし)
'is_unique = "Y"
'生成件数
Dim data_count As Integer
data_count = 100
'生成したテストデータを展開するシート
Dim p As Worksheet
Set p = Worksheets("半角データ")
Dim pcount As Integer
pcount = 0
Dim i As Integer
Dim tmp_item_len As Integer
'----- 自動生成部分 -----
'件数分、処理を繰り返す
For i = 1 To data_count
DoEvents
'長さ決定
If type_str = "F" Then
'固定長
tmp_item_len = item_len
Else
'可変長
tmp_item_len = Int(item_len * Rnd + 1)
End If
p.Cells(i, 1) = i
'データ連番データ生成
p.Cells(i, 2) = Left(base_str, tmp_item_len)
Next
End
End Sub
説明
全体的な説明はコメントを参照
9行め:文字種は固定の文字列です。
15行め:可変長の指定をしています。
実際に自動生成している箇所は51行めです。
44行め:可変長指定なので長さをランダムで決定します。
53行め:文字種から長さ分の文字列を切り出して自動生成の値として、Excelシートへセット
ちなみにInt(item_len * Rnd + 1)とすることで、1~item_lenまでの整数値をランダムで生成することが出来ます。
実行結果
Excelシートに自動生成した値がセットされています。
例1に比べると長さにバリエーションがあるのでテストデータっぽいです。
・Excelシートの7行めは長さ1のデータです
・Excelシートの98行めは長さ20のデータです
・他もランダムに1~20の長さの値が自動生成されています。
実際に画面表示の項目などはいろいろな長さを持つことで重宝するのではないでしょうか。
またこれを手作業でやろうとすると意外に手間です。
(1行め~100行め)


いきなりテストデータ生成用のツールを作るのではなく
本ページのように機能毎に部品化して開発すると
生成可能な値を目で検証しながら成長させつつ
汎用的なツールを構築していくことが出来ます。
