Here's one approach, using VBA iterations of random numbers in a listobject table.
It will try up to 1000 times per cell to find a valid random value which doesn't already exist in the intersecting row / column; then reset the table and attempt again, if a valid value is not found..
This code also logs the result, number of attempts, and time taken.
I repeated 50 times - every time I got a successful matrix result. It took an average of 36.1 attempts, taking an average of 3.9 seconds to generate a successful 8x8 matrix.
Bookmarks