ExcelVBA ランダム抽出で特定のデータからランダムに要素を選び出す方法

 

ExcelVBA ランダム抽出は、特定のデータセットからランダムに要素を選び出すことにより、抽選やサンプルデータの生成、アンケート回答者の選定などに活用されます。使い方や注意点など、サンプルコードをもとに具体的に解説します。

 

2025年の目標は繰り返し作業に悩まされない年にしませんか? Excel VBAを活用した効率化がその第一歩
本サイト参考:Excel VBAで自動化するコードのベースを習得したい方におすすめの記事

 

Excel VBA ランダムに要素を選び出す利用シーン

以下のようなシーンで利用で表示します。

1.顧客データからランダムにサンプルを抽出

2.社内イベントの抽選

3.ランダムなシミュレーションデータの作成

4.大量データの中から一部を無作為に選ぶ作業

使い方

Rnd 関数を使用してランダムな値を生成し、その値を使って範囲内の行や列からデータを選び出します。 Randomize で乱数を初期化することを忘れないようにします。

ポイント

1. 重複回避
ランダム抽出では、重複を避ける必要がある場合があります。これには、一度抽出した値をリストから削除するか、選択済みを記録して管理します。

2. 抽出範囲の正確な設定
抽出元の範囲を正確に指定しないと、エラーや意図しない動作が発生することがあります。

3. データの確保
抽出対象のデータが空白や不正データを含む場合、抽出結果に影響する可能性があります。

 

Excel VBA  ランダムに要素を選び出すサンプルコード

Excel VBAで効率化の準備をしてみませんか?2025年をよりスムーズに過ごすための資格
基本的な文法やVBAの実践的な応用までを網羅的に学習できる方法は、ExcelVBAエキスパート資格の取得を目指すこと。学習を通して、より効率的に、着実に基礎を身につけることが可能です。資格取得すれば、スキルの証明にもなり、職場での評価アップにも繋がるため、勉強を進めるモチベーションにもなります。
本サイト参考:マクロ知識がないから「何から学べば良いのかわからない」という人におすすめの記事

標準モジュール(シートのリストからランダムに値を抽出して別のセルに表示)

Option Explicit

Sub RandomSelection()
    Dim ws As Worksheet
    Dim sourceRange As Range
    Dim outputRange As Range
    Dim randomRow As Integer
    Dim i As Integer
    Dim totalRows As Integer
    Dim numSamples As Integer
    Dim selectedRows As Collection
    Dim randomValue As Variant
    
    ' シートと範囲の設定
    Set ws = ThisWorkbook.Sheets(1)
    Set sourceRange = ws.Range("A1:A10") ' 抽出元の範囲
    Set outputRange = ws.Range("C1") ' 結果を出力するセル
    
    totalRows = sourceRange.Rows.Count
    numSamples = 3 ' 抽出する個数
    Set selectedRows = New Collection
    
    ' 乱数の初期化
    Randomize
    
    ' ランダム抽出
    For i = 1 To numSamples
        Do
            randomRow = Int(totalRows * Rnd + 1) ' 1~totalRowsのランダム値
        Loop While IsInCollection(selectedRows, randomRow)
        
        ' 抽出行を記録
        selectedRows.Add randomRow
        
        ' 抽出した値を出力
        randomValue = sourceRange.Cells(randomRow, 1).value
        outputRange.Offset(i - 1, 0).value = randomValue
    Next i
End Sub

' 重複チェックの関数
Function IsInCollection(col As Collection, value As Variant) As Boolean
    Dim item As Variant
    On Error Resume Next
    item = col(value)
    If Err.Number = 0 Then
        IsInCollection = True
    Else
        IsInCollection = False
    End If
    On Error GoTo 0
End Function

フォームモジュール(ユーザーフォームでランダム抽出を行い、リストボックスに結果を表示する)

ユーザーフォームに以下を配置

1. リストボックス(例: ListBox1 )を配置します。
2. コマンドボタン(例: CommandButton1 )を配置します。

Option Explicit

Private Sub CommandButton1_Click()
    Dim sourceArray As Variant
    Dim selectedItems As Collection
    Dim i As Integer, randomIndex As Integer
    Dim totalItems As Integer
    
    ' 抽出元のデータ
    sourceArray = Array("Apple", "Banana", "Cherry", "Date", "Fig", "Grape", "Honeydew")
    totalItems = UBound(sourceArray) + 1
    Set selectedItems = New Collection
    
    ' 乱数の初期化
    Randomize
    
    ' ランダム抽出
    For i = 1 To 3 ' 3個抽出
        Do
            randomIndex = Int(totalItems * Rnd) ' 0~totalItems-1のランダム値
        Loop While IsInCollection(selectedItems, randomIndex)
        selectedItems.Add randomIndex
        
        ' リストボックスに表示
        Me.ListBox1.AddItem sourceArray(randomIndex)
    Next i
End Sub

' 重複チェックの関数
Function IsInCollection(col As Collection, value As Variant) As Boolean
    Dim item As Variant
    On Error Resume Next
    item = col(value)
    If Err.Number = 0 Then
        IsInCollection = True
    Else
        IsInCollection = False
    End If
    On Error GoTo 0
End Function

ThisWorkbookモジュール(ワークブックを開いたときにランダム抽出を実行して結果をシートに表示)

Option Explicit

Private Sub Workbook_Open()
    Dim ws As Worksheet
    Dim sourceRange As Range
    Dim outputCell As Range
    Dim randomRow As Integer
    
    ' シートと範囲の設定
    Set ws = ThisWorkbook.Sheets(1)
    Set sourceRange = ws.Range("A1:A20") ' 抽出元
    Set outputCell = ws.Range("C1") ' 出力先
    
    ' 乱数の初期化
    Randomize
    
    ' ランダム抽出
    randomRow = Int(sourceRange.Rows.Count * Rnd + 1)
    outputCell.value = sourceRange.Cells(randomRow, 1).value
End Sub

データからランダムに抽出することで抽選やサンプル作成が可能です。重複の管理と抽出範囲の確認が重要。

これらを応用して、Excelで効率的にランダム抽出を行えます。

 

Excel VBAで自動化するコードのベースを習得したい方におすすめ!

VBAエキスパート資格は、日常業務でExcelを多用し、手動作業を減らしたいと考えている方には価値あるものです。

ExcelVBAエキスパートベーシック
仕事の効率をあげるためにExcelVBAを利用する人が対象の問題集です。


ExcelVBAエキスパートスタンダード

ExcelVBAの開発を仕事にする人が対象の問題集です。

 

Excel  VBA エキスパート資格について知りたい方は、下記「Excel VBAスキルアップを目指すなら知っておきたいVBAエキスパート」をご確認ください。