多くの人に共通する作業は、大きなリストからランダムな名前をいくつか選ぶことです。たとえば、コミュニティでコンテストを開催していて、1,000人が参加しているとします。テーブルの各行に名前が表示されているので、特定の数の名前をランダムに選択する方法がわからない場合があります。

Excelでよくあることですが、実行できるさまざまなアプローチがいくつかあります。このヒントで検討する各アプローチは、選択する必要のある名前がセルA1からA1000にリストされていることを前提としています。

もちろん、名前の範囲は短くても長くてもかまいませんが、重要なのは、それらが列Aの連続するセルにあるということです。この例では、リストからランダムに15個の名前を選択する必要があることも前提としています。

最初のアプローチは、INDEX関数を使用することです。セルB1:B15に次の数式を入力します:

=INDEX(A:A,INT((RAND()*1000)+1),1)

同様の式はOFFSET関数を使用します:

=OFFSET($A$1,ROUNDUP(RAND()*1000,0),0,1,1)

結果のリストで同じ名前が2回表示される可能性はありますが、可能性は低いです。 (元のリストのサイズが原因で発生する可能性は低くなります。リストが大きいほど、抽出されたリストに重複が生じる可能性は低くなります。)重複した名前を取得した場合は、F9キーを押してワークシートの再計算を強制します。 。再計算するたびに、抽出された名前のリストが再生成されます。

別の潜在的なアプローチでは、複数の列を使用する必要があります。次の手順に従ってください:

。セルB1に= RAND()と入力します。

。セルC1に次の数式を入力します:

。範囲B1:C1を選択し、行1000まで入力します。

。範囲B1:C1000を選択します。

。 Ctrl + Cを押して、範囲をクリップボードにコピーします。

。リボンの[ホーム]タブを表示します。

。貼り付けツールの下にある下矢印をクリックして、[形式を選択して貼り付け]を選択します。 Excelに[形式を選択して貼り付け]ダイアログボックスが表示されます。 (図1を参照)

。 [値]ラジオボタンが選択されていることを確認します。

。 [OK]をクリックします。これで、B1:C1000に静的な値があります。つまり、ワークシートが再計算されるたびに静的な値が変更されることはありません。

。列Cのセルを選択します。

。リボンの[データ]タブを表示します。

。並べ替えツールをクリックします。 Excelに[並べ替え]ダイアログボックスが表示されます。 (図2を参照)

。 [OK]をクリックします。テーブル(範囲A1:C1000)は、列Cの値に従ってソートされます。

その結果、列Cには列Bのすべての乱数のランキングが含まれます。最初の15行にはランダムな名前が含まれています。

このアプローチでは、列Cを完全に省略し、列Bの静的ランダム値に基づいてリストを単純に並べ替えることもできます。

繰り返しますが、トップ15はあなたのランダムな名前になります。

もちろん、この問題に使用できるマクロソリューションはいくつもあります。マクロのコーディングも同様で、VBAのRND関数を使用して乱数を生成します。考えられるすべてのマクロソリューションの中で、おそらく以下が最もユニークであり、これまでに説明したワークブックソリューションでは利用できないいくつかの利点を提供します。

Sub GetRandom()

Dim TempDO As Variant     Dim iRows As Integer     Dim iCols As Integer     Dim iBegRow As Integer     Dim iBegCol As Integer     Dim sCells As String     Dim J As Integer     Dim iWantRow As Integer

Set TempDO = New DataObject

iRows = Selection.Rows.Count     iCols = Selection.Columns.Count     iBegRow = Selection.Row     iBegCol = Selection.Column

If iRows < 16 Or iCols > 1 Then         MsgBox "Too few rows or too many columns"

Else         Randomize Timer         sCells = ""

For J = 1 To 15             iWantRow = Int(Rnd() * iRows) + iBegRow             sCells = sCells & Cells(iWantRow, iBegCol) & vbCrLf         Next J         TempDO.SetText sCells         TempDO.PutInClipboard     End If End Sub

このマクロは、変数が宣言された直後に新しいDataObjectを定義し、それをTempDO変数に割り当てることに注意してください。マクロがこのコード行で爆破された場合、それは単に、適切なライブラリを参照するようにVBAに指示する必要があることを意味します。

。 VBAエディターで、[ツール]メニューから[参照]を選択します。 VBAは[参照]ダイアログボックスを表示します。 (図3を参照)

。 Microsoft Forms Object Libraryと呼ばれるものが表示されるまで、参照のリストをスクロールします。 (Microsoft Forms 2.0オブジェクトライブラリなど、参照名にバージョン番号が含まれている場合があります。)

。オブジェクトライブラリの左側にあるチェックボックスが選択されていることを確認します。

。 [OK]をクリックします。

マクロを使用するには、15個のランダムな名前を選択する名前を選択するだけです。これまでの例では、範囲A1:A1000を選択します。次に、マクロはセルからランダムに15個の名前を取得し、クリップボードに配置します。マクロを実行すると、クリップボードの内容を好きな場所に貼り付けることができます。マクロが実行されるたびに、15の異なるグループが選択されます。

注:

このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(12475)は、Microsoft Excel 2007、2010、2013、2016、2019、およびOffice 365のExcelに適用されます。Excelの古いメニューインターフェイス用のこのヒントのバージョンは、次の場所にあります。