A type that can contain any other value type is Variant. Most of the time it is better to avoid using it, it tends to promote sloppy programming, and it performs much slower than dedicated types too.
The ByVal would not change a string 01 to 1, if the parameter is defined as a string, e.g.:
Code:
Public Function DoSomething(ByVal WithThis As String) As String
End Function
If the parameter is defined as Variant however, it depends on what you do with it inside the function, if there are any implicit conversions applied.
The ByVal indicates that the parameter is passed as a copy, instead of a reference to the original variable, the opposite keyword is ByRef. So, in itself, ByVal has nothing to do with value or string...