Excelリストをシャッフル・ランダム並び替えする方法

2025年12月11日

English version.

はじめに:Excelリストをランダムで並び替える複数の解決策

業務において、抽選のため名簿を無作為に並び替える、テスト用にダミーデータの順序をランダム化する、といった場面は少なくありません。手作業で一つずつ入れ替える作業は時間と労力がかかり、ミスのリスクも伴います。

本記事では、Excelのリストをランダムに並び替えるための複数の手法を網羅的に解説します。推奨手法として、補助列やマクロを使わずに数式だけで実現できる最新の動的配列関数を用いた方法を提示します。この手法では、F9キーやセルの編集による再計算のたびに結果が自動更新されるため、繰り返し使用する場合に効率的です。

また、旧バージョンのExcelを使用している環境や、結果を固定値として保存したい場合、自動化を実装したい場合に適した代替手法として、RAND関数と手動並び替え、VBA、Office Scriptを用いた方法も併せて紹介します。環境や目的に応じて、最適な方法を選択できます。

概要解説動画

【推奨】数式一つで完結:新しい機能(スピル)による並び替え

最も効率的な解決策は、スピルを組み合わせた数式を用いる方法です。補助列やマクロは不要で、一つのセルに数式を入力するだけで結果が得られます。

この手法の特徴は、再計算が発生するたびに並び順が自動的に変更される点です。F9キーを押す、任意のセルを編集する、ファイルを開き直すといった操作により、ランダムな結果が即座に更新されます。抽選を複数回実施したい場合や、頻繁にデータの順序を変えたい場合に有効です。

対応環境は、Microsoft 365(旧Office 365)のExcel、またはExcel 2021以降のバージョンです。動的配列関数が搭載されていない古いバージョンでは使用できません。

もし並び替え結果を固定したい場合は、値形式でセル範囲をペーストします。

縦方向(列)のデータ並び替えの数式と手順

縦方向に並んだリスト(例: A2:A10)をランダムに並び替える場合、以下の数式を使用します。

CHOOSECOLSSORTHSTACKRANDARRAYROWSを使用します。

=CHOOSECOLS(SORT(HSTACK(対象範囲,RANDARRAY(ROWS(対象範囲),1)),2),1)

具体的な入力例(A2:A10を並び替える場合):

=CHOOSECOLS(SORT(HSTACK(A2:A10,RANDARRAY(ROWS(A2:A10),1)),2),1) 

数式の仕組み

この数式は以下の処理を順に実行しています。

  1. RANDARRAY(ROWS (対象範囲),1): 対象範囲の行数と同じ数の乱数を縦に生成します。ROWS関数で行数を自動取得するため、範囲が変更されても対応できます。
  2. HSTACK(対象範囲,RANDARRAY(...)): 元のデータと乱数の列を横に結合します。これにより、各データ項目に対応する乱数が生成されます。
  3. SORT(...,2): 結合したデータを2列目(乱数の列)を基準にして昇順で並び替えます。乱数は毎回異なる値になるため、並び順もランダムになります。
  4. CHOOSECOLS(...,1): 並び替え後のデータから1列目(元のデータ列)のみを抽出します。乱数の列は不要なため削除されます。

使用手順

  1. 結果を表示したいセルを選択します(例: C2)。
  2. 上記の数式を入力し、対象範囲を実際のセル範囲に置き換えます。
  3. Enterキーを押すと、並び替えられたリストが自動的に展開されます。
  4. F9キーを押すか、任意のセルを編集すると、並び順が再生成されます。

横方向(行)のデータ並び替えの数式と手順

横方向に並んだリスト(例: A2:J2)をランダムに並び替える場合、以下の数式を使用します。

CHOOSEROWSSORTVSTACKRANDARRAYCOLUMNSを使用します。

=CHOOSEROWS(SORT(VSTACK(対象範囲,RANDARRAY(1, COLUMNS(対象範囲))),2,1,TRUE),1) 

具体的な入力例(A2:J2を並び替える場合):

=CHOOSEROWS(SORT(VSTACK(A2:J2,RANDARRAY(1,COLUMNS(A2:J2))),2,1,TRUE),1) 

縦方向との違い

基本的な考え方は縦方向と同じですが、以下の点が異なります。

  • VSTACK: 横方向のデータと乱数を縦に結合します。
  • RANDARRAY(1, COLUMNS (...)): 横方向に乱数を生成するため、行数を1、列数を対象範囲の長さに指定します。
  • SORT(...,2,1,TRUE): 2行目(乱数の行)を基準に、列方向(引数1)で並び替えます。TRUEは昇順を意味します。
  • CHOOSEROWS(...,1): 並び替え後の1行目(元のデータ行)のみを抽出します。

使用手順は縦方向と同様です。結果を表示したいセルに数式を入力し、Enterキーで確定すると、横方向に並び替えられたリストが展開されます。

旧バージョン、VBA、Office Scriptによる並び替え(代替手法)

スピルが使用できない環境や、並び替え結果を固定値として保存したい場合、ボタン操作で自動実行したい場合には、以下の代替手法が選択肢となります。

RAND関数とデータ機能による手動手順(旧バージョン向け)

古いバージョンのExcelでは、RAND関数と標準の並び替え機能を組み合わせることで、ランダムな並び替えを実現できます。

手順

  1. データの隣の列(補助列)に、=RAND()という数式を入力します。
  2. 数式を対象範囲の行数分だけ下方向にコピーします。各行に異なる乱数が生成されます。
  3. 元のデータと補助列を両方選択します。
  4. 「データ」タブから「並び替え」を選択し、補助列を基準に昇順または降順で並び替えます。
  5. 並び替え完了後、補助列を削除します。

この方法は、追加の列を一時的に作成する必要があり、手順が多くなる点が欠点です。ただし、結果は固定値として保存されるため、再計算による変更を避けたい場合には適しています。

VBAのサンプルコード

デスクトップ版Excelでは、VBA(Visual Basic for Applications)を使用することで、ボタン一つでランダム並び替えを実行できます。繰り返し使用する業務では、作業時間の大幅な短縮が可能です。

サンプルコード

以下は、選択した範囲をランダムに並び替えるシンプルなコードです。

Sub ShuffleSelection()
    Dim rng As Range
    Dim i As Long, j As Long
    Dim temp As Variant
    
    ' 選択範囲の取得
    If Selection.Cells.Count = 0 Then
        MsgBox "セル範囲を選択してください。", vbExclamation
        Exit Sub
    End If
    
    Set rng = Selection
    
    ' Fisher-Yatesアルゴリズムでシャッフル
    Randomize
    For i = rng.Rows.Count To 2 Step -1
        j = Int((i - 1 + 1) * Rnd + 1)
        temp = rng.Rows(i).Value
        rng.Rows(i).Value = rng.Rows(j).Value
        rng.Rows(j).Value = temp
    Next i
End Sub

使用方法

  1. Alt + F11キーを押して、VBAエディターを開きます。
  2. 「挿入」メニューから「標準モジュール」を選択します。
  3. 上記のコードをコピーして貼り付けます。
  4. 並び替えたい範囲を選択し、Alt + F8キーでマクロ一覧を開き、「ShuffleSelection」を実行します。
  5. このコードは選択範囲内の行をシャッフルします。実行前に対象となるセル範囲を選択する必要があります。

Office Scriptによるクラウド環境での自動化とサンプルコード

Web版Excel(Microsoft 365)では、VBAは使用できませんが、Office Scriptを利用することで同様の自動化が可能です。Office ScriptはTypeScriptベースで、クラウド環境に対応しています。

サンプルコード

以下は、指定範囲をランダムに並び替えるコードです。

function main(workbook: ExcelScript.Workbook) {
    const sheet = workbook.getActiveWorksheet();
    const range = workbook.getSelectedRange();

    // 選択範囲のチェック
    if (!range) {
        console.log("セル範囲を選択してください。");
        return;
    }

    const values = range.getValues();

    //シャッフル
    for (let i = values.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [values[i], values[j]] = [values[j], values[i]];
    }

    range.setValues(values);
}

使用方法

  1. Web版Excelで「自動化」タブを選択します。
  2. 「新しいスクリプト」をクリックします。
  3. コードエディターに上記のコードを貼り付けます。
  4. スクリプトを保存し、「実行」ボタンをクリックすると、指定範囲がシャッフルされます。

このコードは選択範囲内の行をシャッフルします。実行前に対象となるセル範囲を選択する必要があります。

まとめ:最適な並び替え方法の選択

Excelでリストをランダムに並び替える方法には、複数の選択肢があります。環境と目的に応じて、以下の基準で手法を選択することが効率的です。

最新関数による数式(推奨)

  • Microsoft 365またはExcel 2021以降が使用可能
  • 補助列やマクロを使用せず、最も手軽に実装できる
  • 再計算のたびに結果が動的に変化する
  • 繰り返し抽選を行う場合や、動的な並び替えが必要な場合に最適

RAND関数と手動並び替え

  • 旧バージョンのExcelを使用している
  • 結果を固定値として保存したい
  • 補助列の作成と削除の手間がかかる点を許容できる

VBAまたはOffice Script

  • ボタン操作で実行したい
  • 結果を固定値として保存したい
  • デスクトップ版ではVBA、Web版ではOffice Scriptを選択
  • 繰り返し使用する業務で作業時間を短縮できる

各手法にはメリットと制約があります。使用環境、結果の固定化の必要性、作業頻度を考慮して、最も適した方法を選択してください。