**Please Note: **
This article is written for users of the following Microsoft Excel versions: 2007, 2010, and 2013. If you are using an earlier version (Excel 2003 or earlier), *this tip may not work for you*. For a version of this tip written specifically for earlier versions of Excel, click here: Playing with a Full Deck.

Excel is great at generating random numbers, but it is less great at filling a range of cells with random numbers in which no particular number is repeated twice. For instance, you might want to populate 52 cells with the numbers 1 through 52, in random order. (This is very similar to choosing cards from a deck in random order, where a particular card can only be chosen once. Thus the title for this tip.)

There obviously is no built-in Excel function to provide this capability, so you are left to work with macros. Fortunately, such a macro is not terribly difficult to create. The following macro will do the trick nicely:

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

This macro uses a two-dimensional array (nums) to figure out which numbers to use and the order in which they should be used. Near the beginning of the macro the array is filled with a static number (1 through the number of cells) and a random number between 1 and the number of cells. This second number is then used to sort the array. Once the array is stored, it is a simple matter to place the original numbers in the cells.

By the way, the reason a two-dimensional array is used is because the Rnd function that VBA uses to generate random numbers can return duplicate values. Thus, even through the second dimension of the array can have duplicates in it, when the array is finally sorted, the first dimension will not have duplicates.

To use the macro, start by selecting the cells you want to have filled with sequential values in a random order. When you run the macro, that range is filled. For instance, if you select ten cells and then run the macro, then those cells are filled with the numbers 1 through 10, in random order.

*ExcelTips* is your source for cost-effective Microsoft Excel training.
This tip (8269) applies to Microsoft Excel 2007, 2010, and 2013. You can find a version of this tip for the older menu interface of Excel here: **Playing with a Full Deck**.

**Save Time and Supercharge Excel!** Automate virtually any routine task and save yourself hours, days, maybe even weeks. Then, learn how to make Excel do things you thought were simply impossible! Mastering advanced Excel macros has never been easier. Check out *Excel 2010 VBA and Macros* today!

Want to select only the formulas in your worksheet? It's easy to do using the Go To Special dialog box.

Discover MoreWhen working with data created outside of Excel, you may need to check that data to make sure it contains no unwanted ...

Discover MoreIf you lose your place on the screen quite often, you might find it helpful to have not just a single cell highlighted, but ...

Discover More**FREE SERVICE:** Get tips like this every week in *ExcelTips,* a free productivity newsletter. Enter your address and click "Subscribe."

2016-01-09 10:56:53

Rick Rothstein

Sub FillRand()

Dim X As Long, RandIndex As Long, Nums As Variant, Cell As Range

Randomize

Nums = Evaluate("TRANSPOSE(ROW(1:" & Selection.Count & "))")

For Each Cell In Selection

RandIndex = Int((UBound(Nums) - X) * Rnd + 1)

Cell.Value = Nums(RandIndex)

Nums(RandIndex) = Nums(UBound(Nums) - X)

X = X + 1

Next

End Sub

Note: This macro will work in XL2003 or later for sure... it may work in earlier versions as well, but XL2003 is the earliest version I own, so I cannot be sure about earlier versions.

2013-09-30 10:01:31

Bryan

CPearson has a method that is even faster than using the worksheet to sort (http://www.cpearson.com/excel/SortingArrays.aspx) I tested all 4 methods and here are the results I got with 7,700 values to sort:

Allen Sort: 30.4057

Wrksht Sort: 0.3405

CPrson Sort: 0.1668

With something more reasonable (52, since we are talking cards), the time difference is negligible:

Allen Sort: 0.0015

Wrksht Sort: 0.0738

CPrson Sort: 0.0005

This time the worksheet sorting solution is actually the slowest!

2013-09-28 14:52:43

A simpler and much faster way is to insert two new columns in A and B and fill the first new column A, with a sequence of numbers from 1 to the number of cells in the selection, place next to it, that is the second inserted column B the formula =rand() and fill it down.

Then sort the two new columns having B as key and cutting the sorted A column, to slices equal to the number of rows of the selection and moving them to the selection.

A trial with some 550 rows and 14 columns, run on my PC approximately seven times faster.

If anybody is interested in this version I will be pleased to provide it

Got a version of Excel that uses the
ribbon interface (Excel 2007 or later)?
**This site is for you!** If you
use an earlier version of Excel, visit
our *ExcelTips* site focusing on the menu interface.

**FREE SERVICE:** Get tips like this every week in *ExcelTips,* a free productivity newsletter. Enter your address and click "Subscribe."

Copyright © 2017 Sharon Parq Associates, Inc.

## Comments