iSnakes value is now 2
iRabbits value is now 1
iOtters value is now 2

Explanation:
iSnakes starts off with a value of 1, gets passed into the Sub Routine ByRef, meaning the actual data is being used, gets incremented in the Sub Routine by 1, giving 2. As the actual data is being used, the value of iSnakes is permanently changed to 2, so this is the value we see when we display iSnakes later.

iRabbits starts off with a value of 1, gets passed into the Sub Routine ByVal, meaning a copy of the data is created and used by the Sub Routine, is incremented by 1 in the Sub Routine giving 2 in the Sub Routine (as proven later by iOtters), but this only applies in the Sub Routine and the actual data is not affected, so when iRabbits is displayed later, its value is still 1.

iOtters just proves that the value of iRabbits did indeed reach 2 whilst it was in the Sub Routine. iOtters has an initial value of 0, it's passed into the Sub Routine ByRef so we are dealing with the actual data for iOtters and it can be permanently changed. In the Sub Routine first we have incremented iRabbits giving 2, then we set iOtters to iRabbits, so iOtters has a value of 2, and this changes the actual iOtters data permanently, so we see a value of 2 for iOtters when it is displayed later.