Here is just a little bit extra about coercion. I'm in a brain-dump mood for some reason.
Type coercion (forcing something to a particular type) is not always necessary in an expression. However, when dealing with constants (e.g. the "32767 + 1" case used above) there can be an issue with overflows.
A constant in an expression starts life as the smallest data type that could hold the given constant. So both 32767 and 1 (without coercion) start life as INTEGER variables. We can't actually examine the code generated by the VBA compiler, but if it is like other pseudo-compilers I have seen, it stores all constants as though they were STATIC variables. They have the data types implied by their format and, if not coerced, their size.
The VBA expression analyzer looks at the data types of the components of an expression before it attempts to evaluate it. It "up-types" smaller variables if some of the variables are larger types. So if variable X is declared as LONG, then expression "X + 1" works just fine. The analyzer internally up-types the 1 (which is an INTEGER if not coerced otherwise), so you add a LONG to a LONG and the result is a LONG.
This is also why you can work with mixed integer and SINGLE or DOUBLE variables in an expression. If Z is a DOUBLE, "Z+1" still works because of automatic up-typing.
You can even create expressions with dates and integers since type DATE is merely a typecast of type DOUBLE. If HocDies is of type DATE then you can write "HocDies + 1" to mean the day after the date in the variable.
The situation that makes coercion necessary is that the expression analyzer does the up-type conversion BEFORE it sets up the math instructions. But for the "32767 + 1" case, those constants are "comfortable" as INTEGER variables (=16 bits) so the analyzer has no need to do the "up-type" operation. That leads to an integer overflow because the analyzer doesn't check ahead of time for that possibility. By using "32767+1&" you force the analyzer to up-type one of the variables and the other has to follow suit. As a result, there is no overflow.
Note also that there is an automatic type conversion across the equals sign. That is, if you had Z as a DOUBLE, what would happen (according to what I can make out from the language specification) is that "Z = 32767 + 1&" causes this sequence:
1. Up-type the 1 to LONG by local coercion - the "&"
2. Up-type the 32767 based on its presence in an expression with a LONG
3. Do the math to get LONG 32768
4. Convert the expression value to DOUBLE to match Z, the target, because Z's type CANNOT be coerced. (It was declared DOUBLE so cannot be changed.)
Which means that if you tried to assign our expression to an Integer, call it I, then the expression I = 32676 + 1& would STILL overflow - at the assignment step - because you can't coerce the target variable.
Using CLng or CDbl in an expression has the same effect as local coercion because the data types of the results (returned function values) are as definite as any variable.
Remember our friend I, the INTEGER? You can write "Z = I + 1&" and avoid the overflow. BUT the up-type of I isn't a problem here. Why? Because the language specification clearly states that you can't affect the values of variables on the right-hand side of the assignment statement. Only the left-hand side would be affected. Therefore, the up-type that occurs only affects the temporary copy of I, not the variable itself, because you are not allowed to affect the variable. And the same principle applies to the constants if, as I suspect, they are stored as STATIC constant variables.