Hola te paso un ejemplo rapido que por supuesto podria ser un poco mas optimo.
Option Explicit
Private Sub Form_Load()
Dim ArrNumbers As Variant
Dim TheMatrix() As String
Dim i As Long, j As Long
Dim Rows As Long, Columns As Long
Rows = 3
Columns = 9
ArrNumbers = Split("5,7,15,22,23,30,37,47,57,58,60,64,78,84,88", ",")
GetRndMatrix ArrNumbers, Rows, Columns, TheMatrix
For j = 0 To Rows - 1
For i = 0 To Columns - 1
Debug.Print TheMatrix(j, i) & "|";
Next
Debug.Print
Next
End Sub
Private Function GetRndMatrix(ArrNumbers As Variant, ByVal Rows As Long, ByVal Columns As Long, ByRef OutMatrix() As String) As Boolean
Dim UBoundNum As Long
Dim UBoundMatrix As Long
Dim ArrFlags() As Byte
Dim lCount As Long
Dim lPos As Long
Dim i As Long
Dim j As Long
UBoundNum = UBound(ArrNumbers)
UBoundMatrix = (Rows * Columns) - 1
If UBoundNum > UBoundMatrix Then Exit Function
ReDim OutMatrix(Rows - 1, Columns - 1)
ReDim ArrFlags(UBoundMatrix)
Randomize
Do
lPos = CLng(UBoundMatrix * Rnd)
If ArrFlags(lPos) = 0 Then
ArrFlags(lPos) = 1
lCount = lCount + 1
End If
If lCount = UBoundNum Then Exit Do
Loop
lPos = 0
lCount = 0
For i = 0 To Columns - 1
For j = 0 To Rows - 1
If ArrFlags(lPos) = 1 Then
OutMatrix(j, i) = Format(ArrNumbers(lCount), "00")
lCount = lCount + 1
Else
OutMatrix(j, i) = "00"
End If
lPos = lPos + 1
Next
Next
GetRndMatrix = True
End Function