This has to do with the type of the operands. VBA will imply the datatype of numerics into an Integer, Long, or Double if no datatype is specified. When you perform operations upon the operands, VBA will assume the result to be of a datatype that matches the "heaviest" datatype.
So ...
? VarType(256)
2 'Integer
? 256 * 256 => VBA sees Integer * Integer, thus assumes the result to be Integer and allocates accordingly
? VarType(15*15)
2 'Integer
----
You will get the same error raised with ...
? 32768 * 32768 * 32768
'Overflow
? VarType(32768)
3 'Long Integer
So VBA expects the result to be Long Integer as well.
----
What I have done to force VBA to think like me, without calling one of the coercion functions is to declare the type of the literal ...
? 256& * 256& '& is a type declaration character for Long Integer
65536
Or if you are good with a Double you can just add the decimal ...
? 256.0 * 256
But if you write your VBA that way, the VBA editor will change 256.0 to 256#
Another solution is to coerce all of your operands to a Variant/SubType, then VBA will choose the appropriate datatype to fit the result ..
? CVar(256) * CVar(256)
65536
? VarType(CVar(256) * CVar(256))
3 'Long Integer
Also, note that not all operators use the "result datatype must match the 'heaviest' operand datatype" philosophy. I beleive it is just addition, subtraction, and multiplication. Division and raising to a power always return Double.