📊 Excel VBA Top100
🔧

GenerateRandomData

ユーティリティ

ランダムなテストデータを生成する

テスト用・デモ用のランダムデータをVBAで自動生成するマクロです。Rnd関数やWorksheetFunction.RandBetweenを使って数値・日付・文字列のランダムデータを大量生成し、指定範囲に書き込みます。氏名・住所・商品名などのサンプルデータリストからランダムに選択する処理も組み込め、リアルなテストデータセットを素早く作成できます。内部ではWorksheetFunction.RandBetweenで範囲指定の整数乱数を生成するほか、サンプル名称の配列からInt(Rnd*配列数)でランダムに要素を選択するロジックを組み合わせています。GenerateUUIDと併用すれば、一意な識別子とランダムな属性値を持つ、より実運用に近いテストデータセットを構築できます。手作業でダミーデータを考えて入力する時間を大幅に短縮できます。

GenerateRandomData デモ

📖 使い方

  1. VBAエディタを開く(Alt + F11)
  2. モジュールを挿入(挿入 > モジュール)
  3. 下記VBAコードをコピー&ペースト
  4. ブック上で実行(Alt + F8 でマクロ選択)
💡 実行例: 実行すると行数・列数・データ型を選択してテストデータを生成する

🎯 活用シーン

  • ✓プレゼンや研修用デモのための架空の売上データを素早く生成
  • ✓システム開発のテスト用に1000件分のサンプル顧客データを作成
  • ✓統計分析の練習問題用に正規分布に従ったランダムデータセットを生成
  • ✓新システムの負荷テスト用に、実データに近い分布のダミーレコードを大量に用意したいとき
  • ✓Excel研修の演習教材として、毎回異なるランダムなサンプルデータセットを配布したいとき

💡 実装のヒント

  • ▸Randomize で毎回異なる乱数シードを設定します
  • ▸WorksheetFunction.RandBetween(最小, 最大) で範囲指定の整数乱数を生成できます
  • ▸配列にサンプルデータを格納してInt(Rnd*配列数)でランダム選択できます
  • ▸正規分布に従うデータが必要な場合は、一様乱数を複数回加算する近似手法で疑似的に再現できます。
  • ▸本番データに似せすぎたテストデータは情報漏洩リスクになるため、実在しそうな値でも実データとは無関係であることを明示してください。

💻 VBAコード

' GenerateRandomData
' -----------------
' Macro Name: GenerateRandomData
' Description: ランダムなテストデータを生成する
' Parameters: なし
' Returns: なし
' Usage: 実行すると行数・列数・データ型を選択してテストデータを生成する
' -----------------

Sub GenerateRandomData()
    Dim ws As Worksheet
    Dim numRows As Long
    Dim numCols As Long
    Dim dataType As String
    Dim startRow As Long
    Dim startCol As Long
    Dim i As Long
    Dim j As Long

    On Error GoTo ErrorHandler

    Set ws = ActiveSheet

    numRows = InputBox("生成する行数を入力 (1-1000):", "ランダムデータ生成", "10")
    If numRows = "" Then Exit Sub
    If Not IsNumeric(numRows) Then
        MsgBox "数値を入力してください。", vbExclamation
        Exit Sub
    End If
    numRows = CLng(numRows)
    If numRows < 1 Or numRows > 1000 Then numRows = 10

    numCols = InputBox("生成する列数を入力 (1-20):", "ランダムデータ生成", "5")
    If numCols = "" Then Exit Sub
    If Not IsNumeric(numCols) Then
        MsgBox "数値を入力してください。", vbExclamation
        Exit Sub
    End If
    numCols = CLng(numCols)
    If numCols < 1 Or numCols > 20 Then numCols = 5

    dataType = InputBox("データ型を選択:" & vbCrLf & _
                "1: 整数 (1-100)" & vbCrLf & _
                "2: 小数 (1-100)" & vbCrLf & _
                "3: 英字文字列" & vbCrLf & _
                "4: 日付", "データ型選択", "1")

    startRow = InputBox("開始行:", "ランダムデータ生成", "1")
    If startRow = "" Then startRow = "1"
    If Not IsNumeric(startRow) Then startRow = "1"
    startRow = CLng(startRow)

    startCol = InputBox("開始列:", "ランダムデータ生成", "1")
    If startCol = "" Then startCol = "1"
    If Not IsNumeric(startCol) Then startCol = "1"
    startCol = CLng(startCol)

    Randomize

    For i = 0 To numRows - 1
        For j = 0 To numCols - 1
            Select Case dataType
                Case "1"
                    ws.Cells(startRow + i, startCol + j).Value = Int((100 * Rnd) + 1)
                Case "2"
                    ws.Cells(startRow + i, startCol + j).Value = Round(Rnd * 100, 2)
                Case "3"
                    Dim strLen As Long
                    strLen = Int((10 * Rnd) + 5)
                    Dim randStr As String
                    randStr = ""
                    Dim k As Long
                    For k = 1 To strLen
                        randStr = randStr & Chr(Int((122 - 65 + 1) * Rnd) + 65)
                    Next k
                    ws.Cells(startRow + i, startCol + j).Value = randStr
                Case "4"
                    Dim startDate As Date
                    Dim endDate As Date
                    startDate = DateSerial(2020, 1, 1)
                    endDate = Date
                    ws.Cells(startRow + i, startCol + j).Value = startDate + Rnd * (endDate - startDate)
                    ws.Cells(startRow + i, startCol + j).NumberFormat = "yyyy/mm/dd"
                Case Else
                    ws.Cells(startRow + i, startCol + j).Value = Int((100 * Rnd) + 1)
            End Select
        Next j
    Next i

    ws.Columns(ws.Cells(startRow, startCol).Column).AutoFit
    MsgBox "ランダムデータを " & numRows & " 行 x " & numCols & " 列 生成しました。", vbInformation
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub