Efectivamente, ParamArray no puede ser opcional, pero puedes utilizar un pequeño truco, ya que ParamArray debes declararlo como Variant.
Dentro de la función, comprueba el tipo del primer elemento del ParamArray así:
Código:
Private Function MatrizOParam(ByVal ParamArray Matriz() As Variant) As Boolean
...
If VarType(Matriz(0)) And vbArray <> 0 then
' El primer elemento es una matriz, puedes referenciar sus sub-elementos
' como Matriz(0)(0), Matriz(0)(1), etc.
Else
' El primer elemento no es una matriz, así que puedes considerar leer el
' resto de parámetros de la función.
End If
....
End Function
Además, para evitar errores, te recomiendo que lo primero que compruebes en la función es que el límite superior del ParamArray es mayor de -1, por si la llamas sin parámetros, así:
If UBound(Matriz) = -1 Then ' Se ha llamado a MatrizOParam sin argumentos
Espero que esto te sirva!