概要
VBAを使ったテストデータの自動生成の検討記事です。
今回は数値の自動生成です。
検討
数値の生成については整数、小数、最小値、最大値、符号有無などのパターンが考えられます。
今回はシンプルに整数部と小数部の桁数だけで自動生成してみます。
自動生成するにあたり、必要となる条件(ルール)と具体的な例を書き上げてみます。
データ生成のネタ
数値の自動生成のための条件を挙げてみました。
条件名 | 内容 |
---|---|
整数部桁数 | 整数部の桁数を指定します。 |
小数部桁数 | 小数部の桁数を指定します。 |
符号有無 | マイナス符号の有無を指定します。 |
最大値 | 値の最大値を指定します。 |
最小値 | 値の最小値を指定します。 |
Not Null属性 | Nullを許すかどうか指定します。 |
生成件数 | テストデータの生成件数を指定します。 |
今回はシンプルに説明をすすめるため最大値、最小値、Not Null属性は省いて話を進めます。
具体的な例 固定長文字列の生成
条件設定の具体的な例を示します。
さらに後半においてこの例でサンプル実装してみます。
項目 | 条件(ルール) |
---|---|
整数部桁数 | 5 |
小数部桁数 | 2 |
符号有無 | あり |
生成件数 | テストデータの生成件数を指定します。 |
実装例
サンプルコード
値は自動生成した後、検証のためExcelシートに書き出す仕様とします。
実際にテストデータ作成ツールとして使用する際には
他の項目の値も同時に生成して
レコード単位でデータを書き込むような実装になると思います。
コード
' ' 数値の自動生成 ' Sub make04() '----- 生成条件のする値の条件設定 ----- '桁数 Dim digit1 As Integer digit1 = 5 '小数点以下桁数 Dim digit2 As Integer digit2 = 2 '符号有無 Dim hassign As Boolean hassign = True '生成件数 Dim data_count As Integer data_count = 100 '生成したテストデータを展開するシート Dim p As Worksheet Set p = Worksheets("数値データ") Dim i As Integer Randomize '整数部の数 Dim numval1 As String '小数部の数 Dim numval2 As String '符号 Dim sign As String sign = "" '----- 自動生成部分 ----- '件数分、処理を繰り返す For i = 1 To data_count DoEvents '番号 p.Cells(i, 1) = i '数値データ生成 If digit1 > 0 Then numval1 = Trim(Str(Int(10 ^ digit1 * Rnd + 1))) Else numval1 = "0" End If If digit2 > 0 Then numval2 = Trim(Str(Int(10 ^ digit2 * Rnd + 1))) Else numval2 = "0" End If '符号決定 If hassign Then If Int(2 * Rnd) = 0 Then sign = "" Else sign = "-" End If End If '数値データセット p.Cells(i, 2) = "'" + sign + numval1 + "." + numval2 Next End End Sub
説明
全体的な説明はコメントを参照
9行め:整数部桁数の指定をしています。(5桁)
実際に自動生成している箇所は48行めです。
桁数の表現はべき乗を使っています。
12行め:小数部桁数の指定をしています。(2桁)
実際に自動生成している箇所は54行めです。
桁数の表現はべき乗を使っています。
15行め:符号の有無の指定をしています。(有)
実際に自動生成している箇所は61行めです。
0か1を生成して有無の判断に使用しています。
53行め:自動生成した数値データの整数部、小数部、符号を組み合わせて自動生成の値として、Excelシートへセット
実行結果
Excelシートに自動生成した値がセットされています。
整数部の最大桁数が5桁、小数部が2桁、またランダムでマイナス符号がついています。
いきなり数値で自動生成するのではなく、文字列で編集することで比較的複雑な値の生成もシンプルです。
(1行め~100行め)
いきなりテストデータ生成用のツールを作るのではなく
本ページのように機能毎に部品化して開発すると
生成可能な値を目で検証しながら成長させつつ
汎用的なツールを構築していくことが出来ます。