Excelは乱数の生成には優れていますが、特定の数値が2回繰り返されない乱数でセルの範囲を埋めるのにはあまり優れていません。たとえば、52個のセルに1から52までの数字をランダムな順序で入力したい場合があります。 (これは、特定のカードを1回しか選択できない、ランダムな順序でデッキからカードを選択するのと非常に似ています。したがって、このヒントのタイトルです。)

明らかに、この機能を提供する組み込みのExcel関数はないため、マクロを操作する必要があります。幸い、このようなマクロを作成するのはそれほど難しくありません。次のマクロはうまく機能します:

Sub FillRand()

Dim nums() As Integer     Dim maxval As Integer     Dim nrows As Integer, ncols As Integer     Dim j As Integer, k As Integer     Dim Ptr As Integer     Randomize

Set s = Selection     maxval = s.Cells.Count     nrows = s.Rows.Count     ncols = s.Columns.Count

ReDim nums(maxval, 2)



'Fill the initial array     For j = 1 To maxval         nums(j, 1) = j         nums(j, 2) = Int((Rnd * maxval) + 1)

Next j

'Sort the array based on the random numbers     For j = 1 To maxval - 1         Ptr = j         For k = j + 1 To maxval             If nums(Ptr, 2) > nums(k, 2) Then Ptr = k         Next k         If Ptr <> j Then             k = nums(Ptr, 1)

nums(Ptr, 1) = nums(j, 1)

nums(j, 1) = k             k = nums(Ptr, 2)

nums(Ptr, 2) = nums(j, 2)

nums(j, 2) = k         End If     Next j

'Fill in the cells     Ptr = 0     For j = 1 To nrows         For k = 1 To ncols             Ptr = Ptr + 1             s.Cells(j, k) = nums(Ptr, 1)

Next k     Next j End Sub

このマクロは、2次元配列(nums)を使用して、使用する数値とそれらを使用する順序を決定します。マクロの先頭近くで、配列は静的な数値(1からセルの数まで)と1からセルの数の間の乱数で埋められます。次に、この2番目の数値を使用して配列をソートします。配列が保存されたら、元の番号をセルに配置するのは簡単です。

ちなみに、2次元配列を使用する理由は、VBAが乱数を生成するために使用するRnd関数が重複した値を返す可能性があるためです。したがって、配列の2番目の次元に重複がある場合でも、配列が最終的に並べ替えられたときに、最初の次元に重複はありません。

マクロを使用するには、ランダムな順序で連続した値を入力するセルを選択することから始めます。マクロを実行すると、その範囲がいっぱいになります。たとえば、10個のセルを選択してからマクロを実行すると、それらのセルには1から10までの数字がランダムな順序で入力されます。

注:

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

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

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