「Excelで名簿からランダムに5人を選びたい」
「売上データから無作為に10件ピックアップしたい」
「統計的に信頼できるサンプルデータを作成したい」
こんなとき、わざわざ手作業で番号を書き出したり、直感で選んだりしていませんか?実はExcelには、データをランダムに抽出する強力な機能がいくつも用意されています。
ランダム抽出は、アンケート集計での標本抽出、品質管理でのサンプル検査、テストデータの作成、公平な抽選の実施など、様々な場面で重要な役割を果たします。手動で選択すると、無意識のうちに偏りが生じてしまいがちですが、Excelの機能を使えば完全に客観的な抽出が可能になります。
今回は、Excelでできるランダム抽出の基本的なやり方から、条件付き抽出、重複なしの抽出、さらに実際のビジネスシーンでの応用例まで、初心者の方にもわかりやすく詳しく解説します。
【基本編】Excelのランダム関数を理解しよう

主要なランダム関数の特徴
RAND関数
基本構文
=RAND()
特徴
- 0以上1未満の小数を返す
- 引数なし(括弧内は空)
- ワークシートが再計算されるたびに値が変化
- 最も基本的なランダム関数
使用例
=RAND() → 0.234567891
=RAND()*10 → 2.34567891 (0以上10未満)
=RAND()*100 → 23.4567891 (0以上100未満)
RANDBETWEEN関数
基本構文
=RANDBETWEEN(最小値, 最大値)
特徴
- 指定した範囲内の整数を返す
- 最小値と最大値を含む
- 重複する値が出る可能性がある
- 整数のみ(小数は出ない)
使用例
=RANDBETWEEN(1,10) → 1から10の整数
=RANDBETWEEN(1,100) → 1から100の整数
=RANDBETWEEN(50,150) → 50から150の整数
RANDARRAY関数(Excel 365/2021以降)
基本構文
=RANDARRAY([行数], [列数], [最小値], [最大値], [整数])
特徴
- 複数のランダム値を一度に生成
- 配列として結果を返す
- 動的配列機能を使用
- より高度なランダム生成が可能
使用例
=RANDARRAY(5,1,1,100,TRUE) → 5行1列、1-100の整数
=RANDARRAY(3,3,0,1,FALSE) → 3×3、0-1の小数
ランダム関数の再計算について
再計算が発生するタイミング
自動再計算の場面
- セルの値を変更したとき
- 新しい数式を入力したとき
- ファイルを開いたとき
- F9キーを押したとき
- 並べ替えを実行したとき
値を固定する方法
- 値のコピー&貼り付け
- ランダム値を選択してCtrl+C
- 同じ場所でCtrl+Alt+V
- 「値」を選択してOK
- 数式を値に変換
- セルを選択してF2(編集モード)
- F9キーで計算実行
- Enterで確定
【実践編】基本的なランダム抽出方法
方法1:RAND関数と並べ替えによる抽出
基本的な手順
データの準備
A列:抽出したいデータ(名前、商品名など)
B列:ランダム値生成用
ステップ1:ランダム値の生成
- B1セルに「=RAND()」と入力
- データの最下行まで数式をコピー
- 各行に異なるランダム値が生成される
ステップ2:並べ替えの実行
- A列とB列の範囲を選択
- 「データ」タブ→「並べ替え」
- 「列B」を基準に「昇順」または「降順」で並べ替え
ステップ3:必要な件数の抽出
- 上から必要な件数分を選択
- 別の場所にコピー&貼り付け
実際の例
元データ(社員名簿)
A列 | B列 |
---|---|
田中太郎 | =RAND() |
佐藤花子 | =RAND() |
鈴木一郎 | =RAND() |
高橋美咲 | =RAND() |
山田健太 | =RAND() |
並べ替え後(例)
A列 | B列 |
---|---|
高橋美咲 | 0.123456 |
田中太郎 | 0.345678 |
山田健太 | 0.567890 |
佐藤花子 | 0.789012 |
鈴木一郎 | 0.901234 |
結果:上位3名を抽出
- 高橋美咲
- 田中太郎
- 山田健太
方法2:RANDBETWEEN関数による番号指定抽出
基本的な手順
前提条件
- データに連番(行番号)が振られている
- または行番号を自動で生成する
ステップ1:ランダム番号の生成
# データが100行ある場合
=RANDBETWEEN(1,100)
ステップ2:INDEX関数との組み合わせ
# A列のデータから1つをランダム抽出
=INDEX(A:A,RANDBETWEEN(1,COUNTA(A:A)))
ステップ3:複数件の抽出
# 複数のセルに上記数式をコピー
C1: =INDEX(A:A,RANDBETWEEN(1,COUNTA(A:A)))
C2: =INDEX(A:A,RANDBETWEEN(1,COUNTA(A:A)))
C3: =INDEX(A:A,RANDBETWEEN(1,COUNTA(A:A)))
方法3:SORTBY関数による高度な抽出(Excel 365/2021)
動的配列機能を活用
基本構文
=SORTBY(範囲, RANDARRAY(ROWS(範囲)))
実際の使用例
# A2:A100のデータをランダムに並べ替え
=SORTBY(A2:A100, RANDARRAY(ROWS(A2:A100)))
# 複数列のデータを含めてランダム抽出
=SORTBY(A2:C100, RANDARRAY(ROWS(A2:C100)))
上位指定件数の抽出
# ランダム並べ替え後、上位5件のみ抽出
=TAKE(SORTBY(A2:A100, RANDARRAY(ROWS(A2:A100))), 5)
【応用編】重複なしのランダム抽出

問題:RANDBETWEENの重複
重複が発生する理由
RANDBETWEENの特性
- 同じ値が複数回選ばれる可能性がある
- 独立した乱数生成のため
- 範囲が狭いほど重複確率が高い
例:1-10の範囲で5個生成
=RANDBETWEEN(1,10) → 3
=RANDBETWEEN(1,10) → 7
=RANDBETWEEN(1,10) → 3 ← 重複発生
=RANDBETWEEN(1,10) → 9
=RANDBETWEEN(1,10) → 5
解決方法1:RAND関数による完全ランダム抽出
重複なし抽出の実装
基本的な考え方
- RAND関数は理論上重複しない
- 並べ替えにより重複なしのランダム順序を作成
- 必要な件数分を上から取得
実装手順
# A列:元データ
# B列:=RAND()
# 並べ替え後、上から必要件数を抽出
解決方法2:Excel 365の動的配列関数
UNIQUE関数との組み合わせ
重複排除しながら抽出
# RANDBETWEENで多めに生成し、UNIQUEで重複排除
=TAKE(UNIQUE(RANDBETWEEN(1,100,20,1)),10)
SEQUENCE関数による連番ランダム抽出
1からNまでの連番をランダム抽出
# 1-100の連番からランダムに10個抽出
=TAKE(SORTBY(SEQUENCE(100),RANDARRAY(100)),10)
解決方法3:VBAによる高度な抽出
重複なしランダム抽出マクロ
Sub RandomSamplingNoDuplicates()
Dim sourceRange As Range
Dim outputRange As Range
Dim sourceData As Variant
Dim sampleSize As Integer
Dim totalSize As Integer
Dim selectedIndices() As Integer
Dim i As Integer, j As Integer
Dim randomIndex As Integer
Dim temp As Integer
' 設定値
Set sourceRange = Range("A2:A100") ' 元データ範囲
Set outputRange = Range("D2") ' 出力開始位置
sampleSize = 10 ' 抽出件数
sourceData = sourceRange.Value
totalSize = UBound(sourceData, 1)
' インデックス配列の初期化
ReDim selectedIndices(1 To totalSize)
For i = 1 To totalSize
selectedIndices(i) = i
Next i
' Fisher-Yates シャッフル
For i = totalSize To 2 Step -1
randomIndex = Int(Rnd() * i) + 1
' 要素の交換
temp = selectedIndices(i)
selectedIndices(i) = selectedIndices(randomIndex)
selectedIndices(randomIndex) = temp
Next i
' 結果の出力
For i = 1 To sampleSize
outputRange.Offset(i - 1, 0).Value = sourceData(selectedIndices(i), 1)
Next i
MsgBox sampleSize & "件のランダム抽出が完了しました"
End Sub
【条件付き抽出】特定条件でのランダム抽出
条件に合致するデータからの抽出
FILTER関数との組み合わせ(Excel 365)
特定条件のデータのみからランダム抽出
# 売上が100万円以上のデータからランダム抽出
=TAKE(SORTBY(FILTER(A2:C100,C2:C100>=1000000),RANDARRAY(ROWS(FILTER(A2:C100,C2:C100>=1000000)))),5)
複数条件での絞り込み
# 地域が「東京」かつ売上が50万円以上
=TAKE(SORTBY(FILTER(A2:D100,(B2:B100="東京")*(C2:C100>=500000)),RANDARRAY(ROWS(FILTER(A2:D100,(B2:B100="東京")*(C2:C100>=500000))))),3)
従来のExcelでの条件付き抽出
ヘルパー列を使った方法
ステップ1:条件判定列の作成
# E列:条件判定
=IF(AND(B2="東京",C2>=500000),RAND(),"")
ステップ2:条件に合致するデータの抽出
- E列が空白でないデータを並べ替え
- 上位から必要件数を抽出
比例抽出(層化抽出)
カテゴリ別の比例抽出
目的
- 各カテゴリから比例的にサンプルを抽出
- 全体の構成比を維持したサンプリング
実装例:部署別比例抽出
Sub ProportionalSampling()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim deptCount As Object
Dim totalSample As Integer
Dim dept As Variant
Dim sampleSize As Integer
Set ws = ActiveSheet
Set deptCount = CreateObject("Scripting.Dictionary")
totalSample = 50 ' 総サンプル数
' 部署別の件数をカウント
lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
For i = 2 To lastRow
dept = ws.Cells(i, 2).Value
If deptCount.Exists(dept) Then
deptCount(dept) = deptCount(dept) + 1
Else
deptCount.Add dept, 1
End If
Next i
' 各部署から比例的に抽出
For Each dept In deptCount.Keys
sampleSize = Round(deptCount(dept) / (lastRow - 1) * totalSample)
' 部署別のランダム抽出処理
Call ExtractByDepartment(dept, sampleSize)
Next dept
End Sub
【実践例】業務での具体的な活用方法

アンケート調査でのサンプル抽出
顧客データベースからの無作為抽出
目的
- 10,000人の顧客から500人を無作為抽出
- アンケート調査の信頼性確保
実装方法
# A列:顧客ID、B列:顧客名、C列:連絡先
# D列にランダム値を生成
=RAND()
# 並べ替え後、上位500件を抽出
注意点
- 母集団の代表性を確保
- 抽出バイアスの除去
- サンプルサイズの適切性
地域別層化抽出
設定例
東京:2000人(全体の20%)→ サンプル100人
大阪:1500人(全体の15%)→ サンプル75人
名古屋:1000人(全体の10%)→ サンプル50人
その他:5500人(全体の55%)→ サンプル275人
品質管理でのサンプル検査
製品ロットからの抜き取り検査
検査プロセス
- ロット番号リストの準備
- 検査率の設定(例:5%)
- ランダム抽出の実行
- 検査結果の記録
実装例
# A列:ロット番号(1000件)
# 5%サンプル = 50件を抽出
=TAKE(SORTBY(A2:A1001,RANDARRAY(1000)),50)
テストデータの生成
ダミーデータの作成
顧客マスタのサンプルデータ
# 顧客ID:連番
=SEQUENCE(1000)
# 顧客名:ランダムな組み合わせ
=INDEX(姓リスト,RANDBETWEEN(1,COUNTA(姓リスト)))&INDEX(名リスト,RANDBETWEEN(1,COUNTA(名リスト)))
# 年齢:20-80歳のランダム
=RANDBETWEEN(20,80)
# 都道府県:リストからランダム選択
=INDEX(都道府県リスト,RANDBETWEEN(1,47))
売上データの生成
リアルな売上パターンの生成
# 基本売上(正規分布に近いパターン)
=ROUND(1000000+RAND()*500000+RAND()*500000+RAND()*500000-750000,0)
# 季節変動を考慮した売上
=基本売上*IF(MONTH(日付)<=3,0.8,IF(MONTH(日付)<=6,1.2,IF(MONTH(日付)<=9,1.1,0.9)))
研修・教育での活用
グループ分けのランダム化
公平なチーム編成
# 参加者リストからランダムに4チームに分割
# A列:参加者名
# B列:チーム番号
=RANDBETWEEN(1,4)
席順のランダム決定
# 座席表のランダム生成
=TAKE(SORTBY(参加者リスト,RANDARRAY(ROWS(参加者リスト))),席数)
抽選・くじ引きシステム
公正な抽選の実施
賞品抽選システム
Sub LotterySystem()
Dim participants As Range
Dim winnerCount As Integer
Dim winners As String
Dim i As Integer
Set participants = Range("A2:A" & Cells(Rows.Count, 1).End(xlUp).Row)
winnerCount = InputBox("当選者数を入力してください")
' ランダム抽出の実行
Application.ScreenUpdating = False
' RAND値の追加
participants.Offset(0, 1).Formula = "=RAND()"
' 並べ替え
participants.Resize(, 2).Sort Key1:=participants.Offset(0, 1), Order1:=xlAscending
' 当選者の決定
For i = 1 To winnerCount
winners = winners & participants.Cells(i, 1).Value & vbCrLf
Next i
' 結果表示
MsgBox "当選者:" & vbCrLf & winners
Application.ScreenUpdating = True
End Sub
【統計的考慮】サンプリングの品質向上
適切なサンプルサイズの決定
統計的な考え方
信頼区間と誤差の関係
サンプルサイズの目安:
- 信頼度95%、誤差±3%:約1,100件
- 信頼度95%、誤差±5%:約400件
- 信頼度90%、誤差±5%:約270件
母集団サイズとサンプルサイズ
# 必要サンプルサイズの計算(簡易版)
=ROUNDUP(1.96^2*0.25/誤差^2/(1+1.96^2*0.25/(誤差^2*母集団サイズ)),0)
バイアスの回避
系統的サンプリングの注意点
避けるべきパターン
- 特定の曜日のデータのみ
- 特定の時間帯のデータのみ
- アルファベット順などの規則的な抽出
改善策
- 完全無作為抽出の実施
- 層化抽出による代表性確保
- 時系列データの考慮
再現性の確保
シード値の設定
VBAでの実装
Sub ReproducibleRandomSampling()
' シード値を固定して再現可能な抽出
Rnd -1 ' 乱数ジェネレータをリセット
Randomize 12345 ' 固定シード値
' 以降の乱数生成は再現可能
' ランダム抽出処理...
End Sub
【注意点とトラブル対策】よくある問題と解決法

数式の再計算問題
問題:ランダム値が頻繁に変わる
現象
- セルを編集するたびに抽出結果が変わる
- 並べ替え時に値が再計算される
- ファイルを開くたびに結果が異なる
解決策1:値の固定化
# ランダム値生成後、すぐに値のみ貼り付け
1. Ctrl+C(コピー)
2. Ctrl+Alt+V(形式を選択して貼り付け)
3. 「値」を選択
解決策2:計算モードの変更
# 手動計算モードに切り替え
「数式」タブ → 「計算方法」 → 「手動」
F9キーで必要時のみ再計算
重複排除の複雑さ
問題:RANDBETWEENで重複が多発
原因分析
重複確率の計算:
10個の数字から3個選ぶ場合
1個目:重複なし
2個目:90%の確率で重複なし
3個目:80%の確率で重複なし
全体:約72%の確率で重複なし
解決策:十分な範囲設定
# 必要数の3-5倍の範囲を設定
必要数が10個 → RANDBETWEEN(1,50)
必要数が100個 → RANDBETWEEN(1,500)
パフォーマンスの問題
大量データでの処理速度
問題
- 10万件以上のデータで処理が遅い
- メモリ不足エラーが発生
- Excelが応答しなくなる
解決策1:バッチ処理
Sub BatchRandomSampling()
Dim batchSize As Long
Dim i As Long
batchSize = 1000 ' バッチサイズ
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
For i = 1 To totalRows Step batchSize
' バッチごとに処理
ProcessBatch i, Application.Min(i + batchSize - 1, totalRows)
DoEvents ' UIの応答を維持
Next i
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
解決策2:効率的なアルゴリズム
' Reservoir Sampling アルゴリズムの実装
Sub ReservoirSampling(sampleSize As Integer)
Dim reservoir() As Variant
Dim i As Long
Dim j As Long
ReDim reservoir(1 To sampleSize)
' 最初のsampleSize個を格納
For i = 1 To sampleSize
reservoir(i) = Cells(i + 1, 1).Value
Next i
' 残りの要素を確率的に選択
For i = sampleSize + 1 To lastRow
j = Int(Rnd() * i) + 1
If j <= sampleSize Then
reservoir(j) = Cells(i + 1, 1).Value
End If
Next i
' 結果の出力
For i = 1 To sampleSize
Cells(i + 1, 10).Value = reservoir(i)
Next i
End Sub
【高度な活用】統計分析との連携
抽出結果の検証
無作為性の検定
連検定(Runs Test)
# 抽出順序の無作為性を検証
# 奇数・偶数の出現パターンをチェック
カイ二乗適合度検定
# 各カテゴリの出現頻度が期待値と一致するかチェック
=CHISQ.TEST(観測値範囲,期待値範囲)
信頼区間の計算
サンプル平均の信頼区間
# 95%信頼区間の計算
平均値 ± 1.96 * 標準偏差 / SQRT(サンプル数)
# Excelでの実装
=AVERAGE(範囲) ± 1.96*STDEV(範囲)/SQRT(COUNT(範囲))
実験計画法への応用
ランダム化比較試験
A/Bテストのサンプル割り当て
# 顧客をA群・B群にランダム割り当て
=IF(RAND()<0.5,"A群","B群")
ブロック化ランダム割り当て
Sub BlockRandomization()
Dim blockSize As Integer
Dim treatments As Variant
Dim i As Long, j As Long
Dim block() As String
blockSize = 4 ' ブロックサイズ
treatments = Array("A", "A", "B", "B") ' 各ブロック内の処理
For i = 1 To totalParticipants Step blockSize
' 各ブロック内でランダム化
Call ShuffleArray(treatments)
For j = 0 To blockSize - 1
Cells(i + j, 2).Value = treatments(j)
Next j
Next i
End Sub
まとめ
Excelでのランダム抽出は、適切な手法を選択することで様々な業務ニーズに対応できる強力な機能です。
手法の選択指針
基本的な無作為抽出
- RAND関数 + 並べ替え:最も確実で汎用的
- SORTBY + RANDARRAY:Excel 365での効率的な方法
- VBAマクロ:大量データや複雑な条件の場合
条件付き抽出
- FILTER関数との組み合わせ:Excel 365での高度な抽出
- ヘルパー列活用:従来バージョンでの実装
- 層化抽出:代表性を重視する場合
重複なし抽出
- RAND関数方式:完全に重複なし
- UNIQUE関数:Excel 365での重複排除
- VBAアルゴリズム:高速で確実な処理
実装時の注意点
統計的配慮
- 適切なサンプルサイズ:統計的有意性の確保
- バイアスの回避:系統的偏りの除去
- 再現性の確保:シード値の固定
技術的配慮
- パフォーマンス:大量データでの効率化
- 数式の固定化:再計算による変動の防止
- エラー処理:例外状況への対応
業務的配慮
- 透明性:
コメント