整数型とlong型でのみオーバーフロー例外が発生します。これを回避するには、System.DoubleまたはSystem.Numerics.BigInteger(またはBigDecimalだと思います)を使用できます。
たとえば、階乗の3つの異なるバージョンを実行する場合:1つはlong、1つはdouble、1つはbigintegerで、次のように5〜50x5の値の範囲で次のようになります。
'Long Factorial
Public Function FactorialInt64(ByVal n As Integer) As Int64
If n = 1 Then
Return 1
Else
Return n * FactorialInt64(n - 1)
End If
End Function
' Double Factorial
Public Function FactorialDouble(ByVal n As Integer) As Double
If n = 1 Then
Return 1
Else
Return n * FactorialDouble(n - 1)
End If
End Function
' BigInteger Factorial
Public Function FactorialBigInteger(ByVal n As Integer) As BigInteger
If n = 1 Then
Return 1
Else
Return n * FactorialBigInteger(n - 1)
End If
End Function
次のような結果が得られます。

完全なソースコードは、私のブログ投稿:VB.NETのFactorialとFibonacciにあります。