Solution without macros , only using Excel formulas, sorting by several columns and dividing a sheet of the ΠΡΡ
ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ into sheets:
ΠΠ°Π½Π½ΡΠ΅ - contains data with additional columns having a formula for sorting;
Π€ΠΎΡΠΌΡ - displays data in the required format randomly.
In steps:
- We have a sheet
ΠΡΡ
ΠΎΠ΄Π½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ°

- Create a
ΠΠ°Π½Π½ΡΠ΅ sheet, in front of the columns that need to be sorted in a random order, insert new columns with the functions Π‘ΠΠ§ΠΠ‘Π() .

For example, the added columns: Π‘Π» ΠΠ°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠ²Π°ΡΠ° , Π‘Π» ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ 2 .
- To sort by multiple columns, use
ΠΠ°Π½Π½ΡΠ΅ / Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° . In the example columns: Π‘Π» ΠΠ°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠ²Π°ΡΠ° , Π‘Π» ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ 2 .
Note: when you select ΠΠ , the sorting function will be sorted and immediately recalculated Π‘ΠΠ§ΠΠ‘Π() .

- To display the data in the required format, create a
Π€ΠΎΡΠΌΠ° sheet.

- To display the values ββin the fields, we use the formula for the first row
=ΠΠΠΠΠΠ‘(ΠΠ°Π½Π½ΡΠ΅!$A$1:$F$6;Π‘Π’Π ΠΠΠ();3) , which refers to the second row of the third column of the ΠΠ°Π½Π½ΡΠ΅ sheet. For correct display of the third and the following lines, the formula taking into account the offset of the lines - =ΠΠΠΠΠΠ‘(ΠΠ°Π½Π½ΡΠ΅!$A$1:$F$6;Π‘Π’Π ΠΠΠ()/2+1;3)

It all works in the following way: the RINOUND () function assigns a random value to cells, when Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ applied on the ΠΠ°Π½Π½ΡΠ΅ sheet, the order of values ββin the cells is changed, the result of sorting by reference is displayed on the Π€ΠΎΡΠΌΠ° sheet.
If necessary, the cells from the Π€ΠΎΡΠΌΠ° sheet are copied and the values ββare inserted on another sheet.
Solution using macros. The basic idea: the cell values ββnecessary for sorting are copied to the original array, which is sorted randomly (we get the resulting array) and then written to the table cells.
In steps:
Macro code
Option Explicit ' Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΠ²Π½ΠΎΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
Option Base 1 ' ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΠΌ Π½ΠΈΠΆΠ½ΡΡ Π³ΡΠ°Π½ΠΈΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ² ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² ' ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ ΠΈΠ΄Π΅Ρ: Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠ΅Π΅ΠΊ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ Π² ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ², ' ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΡΡΠΈΡΡΠ΅ΡΡΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ (ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠΉ ΠΌΠ°ΡΡΠΈΠ²) ΠΈ Π΄Π°Π»Π΅Π΅ ' Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π² ΡΡΠ΅ΠΉΠΊΠΈ ΡΠ°Π±Π»ΠΈΡΡ Sub RandomOrderTable() Dim sSrtblClmn As String ' ΡΡΡΠΎΠΊΠ° ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ°Ρ Π½ΠΎΠΌΠ΅Ρ ΡΡΠΎΠ»Π±ΡΠΎΠ², Π² ΠΊΠΎΡΠΎΡΡΡ
Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡΡ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΡΡΠ΅Π΅ΠΊ Dim aSrtblClmn() As String ' ΠΌΠ°ΡΡΠΈΠ² Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ Π½ΠΎΠΌΠ΅ΡΠΎΠ² ΡΡΠΎΠ»Π±ΡΠΎΠ², Π² ΠΊΠΎΡΠΎΡΡΡ
Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΡΡΠ΅Π΅ΠΊ Dim aRw() As Variant ' ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΡΠ΅Π΅ΠΊ ΡΠ°Π±Π»ΠΈΡΡ Dim aRndRw() As Variant ' ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠΉ ΠΌΠ°ΡΡΠΈΠ² ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² aRw ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Dim i As Integer Dim k As Integer Dim l As Integer ' ΠΈΠ½Π΄Π΅ΠΊΡ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π° (ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΡΡΠ΅Π΅ΠΊ), ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄Π²Π΅ΡΠ³Π½ΡΡ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ΅ Dim iLstRw As Integer ' ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΡΠΎΠΊ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ Dim iClrIndx As Integer ' Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΡΠ²Π΅Ρ Π·Π°Π»ΠΈΠ²ΠΊΠΈ Π΄Π»Ρ ΡΡΡΠΎΠΊ Π½Π΅ ΡΡΠ°ΡΡΠ²ΡΡΡΠΈΡ
Π² ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ΅ iLstRw = Cells.SpecialCells(xlLastCell).Row ' ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΠ²ΡΠΎ ΡΡΡΠΎΠΊ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ sSrtblClmn = "2;4" aSrtblClmn = Split(sSrtblClmn, ";") iClrIndx = Cells(2, 1).Interior.ColorIndex ' ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡ ΡΠ²Π΅ΡΠ° ΡΡΠ΅ΠΉΠΊΠΈ Π±Π΅Π· Π·Π°Π»ΠΈΠ²ΠΊΠΈ ' ΡΠΈΠΊΠ» ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ° ΡΡΠΎΠ»Π±ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡΡΡ Π² ΠΌΠ°ΡΡΠΈΠ² For i = LBound(aSrtblClmn) To UBound(aSrtblClmn) l = 1 ' ΡΠΈΠΊΠ» ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ° ΡΡΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡΡΡ Π² ΠΌΠ°ΡΡΠΈΠ² For k = 1 To iLstRw ' ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΡΠΎΠ½ ΡΡΠ΅ΠΉΠΊΠΈ, Π΅ΡΠ»ΠΈ Π·Π°Π»ΠΈΠ²ΠΊΠΈ Π½Π΅Ρ, ΡΠΎ ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅ΠΉΠΊΠΈ Π² ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² If Cells(k, Int(aSrtblClmn(i))).Interior.ColorIndex = iClrIndx Then ' ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ ΠΌΠ°ΡΡΠΈΠ² ΠΈ Π·Π°Π½ΠΎΡΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅ΠΉΠΊΠΈ Π² ΠΌΠ°ΡΡΠΈΠ² ReDim Preserve aRw(l) aRw(l) = Cells(k, Int(aSrtblClmn(i))).Value l = l + 1 End If Next k ' ΡΠΎΡΡΠΈΡΡΠ΅ΠΌ ΠΌΠ°ΡΡΠΈΠ² ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΈ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π² ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠ΅ΠΌ ΠΌΠ°ΡΡΠΈΠ²Π΅ aRndRw = SortRndArray(aRw) l = 1 ' Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠ΅Π³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π° Π² ΡΡΠ΅ΠΉΠΊΠΈ For k = 1 To iLstRw If Cells(k, Int(aSrtblClmn(i))).Interior.ColorIndex = iClrIndx Then Cells(k, Int(aSrtblClmn(i))).Value = aRndRw(l) l = l + 1 End If Next k Next i End Sub ' ΡΡΠ½ΠΊΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΉ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ Π²Π·ΡΡΠ° ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅ http://hav.su/index.php?option=com_content&view=article&id=64:-2&catid=35:calc Function SortRndArray(A As Variant) As Variant 'B - ΠΌΠ°ΡΡΠΈΠ²-ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Dim B As Variant 'ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΉ ΠΈΠ½Π΄Π΅ΠΊΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΌΠ°ΡΡΠΈΠ²Π° Dim MyRndValue As Byte Dim i As Integer 'Max_i - ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Dim Max_i As Integer Max_i = UBound(A, 1) ReDim B(LBound(A, 1) To UBound(A, 1)) As Variant 'Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²ΡΡ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π° B 'Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ Π²ΡΠ±ΠΈΡΠ°Ρ ΠΈΡ
ΠΈΠ· A For i = LBound(A, 1) To UBound(A, 1) 'ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠΌΠ΅ΡΠ° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈΠ· A MyRndValue = Int((Max_i * Rnd) + 1) 'Π·Π°Π½Π΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π² Π²ΡΡ
ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΠ² B(i) = A(MyRndValue) 'Π·Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈΠ· A ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠΌ ΠΈΠ· A A(MyRndValue) = A(Max_i) 'ΠΏΠΎΠ½ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π²Π΅ΡΡ
Π½Π΅ΠΉ Π³ΡΠ°Π½ΠΈΡΡ ΠΌΠ°ΡΡΠΈΠ²Π° 'Ρ.ΠΎ. "ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΠΌ" ΡΠ°Π·ΠΌΠ΅Ρ ΠΌΠ°ΡΡΠΈΠ²Π° Π½Π° ΠΎΠ΄ΠΈΠ½ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Max_i = Max_i - 1 Next i 'Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΌΠ°ΡΡΠΈΠ² Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ B SortRndArray = B End Function
Copy the macro code into the Excel ( Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ - Vsual Basic );
Source table:

- Run the macro (
Alt+F8 )

- We get the result:
