Written by Allen Wyatt (last updated January 17, 2026)
This tip applies to Excel 2007, 2010, 2013, 2016, 2019, 2021, 2024, and Excel in Microsoft 365
Excel is great at generating random numbers, but it is less great at filling a range of cells with random numbers in which no 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.)
If you are using Excel 2021 or Excel 365, then the solution is very simple using this formula:
=SORTBY(SEQUENCE(52), RANDARRAY(52))
As long as there is nothing in the 52 cells beneath where you use the formula, you are golden. The SEQUENCE function returns the values 1 through 52, the RANDARRAY returns an array of 52 random values, and SORTBY uses those random values to sort the SEQUENCE. Easy peasy.
If you are using an older version of Excel, then there is no combination of functions that will allow you to get the desired results without the use of helper columns. The easiest solution is to work with macros. The following macro will do the trick nicely:
Sub FillRand()
Dim X As Long
Dim RandIndex As Long
Dim Nums As Variant
Dim c As Range
Randomize
Nums = Evaluate("ROW(1:" & Selection.Count & ")")
X = UBound(Nums)
For Each c In Selection
RandIndex = Int(X * Rnd + 1)
c.Value = Nums(RandIndex, 1)
Nums(RandIndex, 1) = Nums(X, 1)
X = X - 1
Next c
End Sub
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.
Note:
ExcelTips is your source for cost-effective Microsoft Excel training. This tip (8269) applies to Microsoft Excel 2007, 2010, 2013, 2016, 2019, 2021, 2024, and Excel in Microsoft 365.
Best-Selling VBA Tutorial for Beginners Take your Excel knowledge to the next level. With a little background in VBA programming, you can go well beyond basic spreadsheets and functions. Use macros to reduce errors, save time, and integrate with other Microsoft applications. Fully updated for the latest version of Office 365. Check out Microsoft 365 Excel VBA Programming For Dummies today!
If you keep on-going data in a worksheet, some of your data�"over time�"may need to be deleted. If you have an ...
Discover MoreWhen you design your worksheets, you probably want users to interact with those worksheets in specific ways. What ...
Discover MoreIf your macro closes workbooks, you'll want to make sure that it will save any changes you made to the workbook. Here's ...
Discover MoreFREE SERVICE: Get tips like this every week in ExcelTips, a free productivity newsletter. Enter your address and click "Subscribe."
2026-01-17 07:06:18
Mike J
Probably a little off topic, but the stipulation that 52 cells needed to be pre-selected prompted this suggestion.The macro selects down any number of cells as input via MsgBox prior to running this type of sub that requires a range to be pre-selected.
Could easily be modified to include other criteria.
Sub SelectCellsDownFromSelection()
Dim n As Variant
Dim startRange As Range
Dim resultRange As Range
Dim cell As Range
Dim hasData As Boolean
Dim c As Range
Dim response As VbMsgBoxResult
' Ensure something is selected
If TypeName(Selection) <> "Range" Then
MsgBox "Please select one or more cells first.", vbExclamation
Exit Sub
End If
Set startRange = Selection
' Ensure selection is on a single row - REM out if not required
If startRange.Rows.Count > 1 Then
MsgBox "Please select cells on a single row only.", vbExclamation
Exit Sub
End If
' Ask for number of cells down
n = Application.InputBox( _
Prompt:="Enter the number of cells to select downward:", _
Title:="Select Cells Down", _
Type:=1)
' Handle Cancel or invalid input
If n = False Or n < 1 Or n <> CLng(n) Then
MsgBox "Please enter a valid whole number greater than zero.", vbExclamation
Exit Sub
End If
' Build the resulting range
For Each cell In startRange.Cells
If resultRange Is Nothing Then
Set resultRange = cell.Resize(n, 1)
Else
Set resultRange = Union(resultRange, cell.Resize(n, 1))
End If
Next cell
' Check for existing data
hasData = False
For Each c In resultRange.Cells
If Not IsEmpty(c.Value) Then
hasData = True
Exit For
End If
Next c
' Prompt user if data exists - REM out if overwrite is OK
If hasData Then
response = MsgBox( _
"Some cells in the target range already contain data." & vbCrLf & _
"Do you want to overwrite them?", _
vbYesNo + vbExclamation, _
"Confirm Overwrite")
If response = vbNo Then Exit Sub
End If
' Select the final range
resultRange.Select
End Sub
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 © 2026 Sharon Parq Associates, Inc.
Comments