Excelで複数の範囲からランダムに値を抽出するユーザー定義関数

Excelで簡単に複数の範囲からランダムに値を抽出する方法

この記事では、Excelで複数の範囲からランダムに値を抽出するためのユーザー定義関数の作成方法と使い方を解説します。ここでは作成するユーザー定義関数に「RANDOM_SELECT」と名前を付けています。

「RANDOM_SELECT」関数の意義

Excelの標準機能では、単一の範囲からランダムに値を抽出することは可能ですが、複数の範囲からランダムに値を抽出することは直接的にはできません。この「RANDOM_SELECT」関数を使うことで、複数の範囲を指定して簡単にランダムな値を取得することができます。これにより、データのサンプリングやシミュレーションなど、さまざまな場面で役立ちます。

ユーザー定義関数のコード

ユーザー定義関数のコードは以下の通りです。

Function RANDOM_SELECT(ParamArray Ranges() As Variant) As Variant
    Dim AllCells As Collection
    Dim Cell As Range
    Dim Target As Range
    Dim rng As Variant
    
    Set AllCells = New Collection
    
    For Each rng In Ranges
        If TypeName(rng) = "Range" Then
            For Each Cell In rng.Cells
                If Not IsEmpty(Cell) Then
                    AllCells.Add Cell
                End If
            Next Cell
        End If
    Next rng
    
    If AllCells.Count > 0 Then
        Set Target = AllCells.Item(Application.WorksheetFunction.RandBetween(1, AllCells.Count))
        RANDOM_SELECT = Target.Value
    Else
        RANDOM_SELECT = CVErr(xlErrNA)
    End If
End Function

「RANDOM_SELECT」関数の作成方法

この関数を使うためには、まずExcelのVBAエディタでユーザー定義関数を作成する必要があります。VBAエディタを開いて、標準モジュールにコードを貼り付けるだけです。詳細な手順は、過去の記事を参照してください。

「RANDOM_SELECT」関数の使い方

以下に、「RANDOM_SELECT」関数の使用例を示します。次のようなデータがA1:C4の範囲にあると仮定します。

A B C
前菜1 メイン1 デザート1
前菜2 メイン2 デザート2
前菜3 メイン3 デザート3
前菜4 メイン4 デザート4

このデータを使って、メイン1~4をランダムに表示したいならば、「RANDOM_SELECT」関数を使って次のように入力します。

=RANDOM_SELECT(B2:B5)

また、前菜1~4とデザート1~4をランダムに表示したいならば、「RANDOM_SELECT」関数を使って次のように入力します。

=RANDOM_SELECT(A2:A5,C2:C5)

複数回の抽出を行う場合

もし、複数回の抽出を行いたい場合は、別のセルに同じ関数を入力してください。それぞれのセルで異なる組み合わせが表示されます。

この関数に自動再計算機能:揮発性を持たせる

ユーザー定義関数では自動再計算機能(揮発性)を持ちません。揮発性を持たせるならば以下の記事を参考にしてください。

ユーザー定義関数を自動再計算型に改良する方法・揮発性の設定
Excel VBA: ユーザー定義関数を自動再計算型に改良する方法・揮発性の設定 Excel VBAを利用したユーザー定義関数は、デフォルトではその引数に関連するセルの値が変わらない限り再計算されません。しかし、特定のケースでは、関数がシー...

まとめ

この記事では、Excelで複数の範囲からランダムに値を抽出するユーザー定義関数「RANDOM_SELECT」の作成方法と使い方を解説しました。この関数を活用することで、データのサンプリングやシミュレーションなど、様々な場面で役立ちます。是非お試しください。

コメント

PAGE TOP
タイトルとURLをコピーしました