Вот есть функция IsArray(M) - она может определить: M содержит массив значений или только одно значение.
Есть функции LBound(M,1) и UBound(M,1) для определения нижней и верхней границы 1-ой размерности массива.
Функции LBound(M,2) и UBound(M,2) - для определения нижней и верхней границы 2-ой размерности массива. И т.д.
А как определить, сколько всего размерностей у массива?
Функция в качестве аргумента принимает Variant-переменную: это может быть одно значение или массив, причем, одномерный или двумерный - вот и надо анализировать, что именно получает функция.