If I properly understood, you pass a numerical value to function in 2 formats - integer and string. Of course, you can use variant and before using this value, check it:
IsNumeric(yourVariant) gives you True or False:
IsNumeric("222") - True
IsNumeric(222) - True
IsNumeric("222abc") - False
After that to be sure you can convert your Variant to Integer(http://msdn.microsoft.com/en-us/library/s2dy91zy.aspx):
CInt(yourVariant)
if IsNumeric(yourVariant) then
someIntVariable = CInt(yourVariant)
else
MsgBox "bla bla bla"
EndIf
I looked some your code, you can use Select Case Statement (http://msdn.microsoft.com/en-us/library/cy37t14y.aspx) or keep If-Else-If. Discussion in comments helps you choose.
if my answer is incorrect, please give a more specific piece of your code. I found it hard to understand what is going on your application.
For example I try analyze code step by step running function fcComm
from cell E68, sheet Forecast.
reaching function setFcResult
we have next:
Function setFcResult(bettype As String, fcOption)
' bettype = "FT.OU"
' fcOption = "HF.HL"
setFcResult = True
bettype = UCase(bettype)
fcOption = UCase(fcOption)
If bettype = "FT.OU" Then
If fcOption >= 0 Then ' you compare "HF.HL" with 0. It returns true. You can verify this by yourself.
hfs = 5
afs = fcOption - 5 ' here you perform "HF.HL" - 5. It returns error and function terminates.
Else
setFcResult = False
End If
ElseIf bettype = "HT.OU" Then
...
Table Odds looks like:

Bet Type search:
bettype = Application.WorksheetFunction.VLookup(oddsId, odds.DataBodyRange, 3, False)
- oddsId - 13
- odds.DataBodyRange $A$3:$BT$47
- bettype = 13
You search by oddsId
, VLookup
searches oddsId
in first column of odds.DataBodyRange
- it's column A, but in column A you have TransId.

So you have incorrect bettype for your fcOption variable.