Option Explicit
Const cStake As Double = 5#
Const cCommish As Double = 0.935
Sub Betting()
Dim rData As Range, rDataNoHeaders As Range, rstart As Range, rEnd As Range
Dim wsData As Worksheet, wsSummary As Worksheet
Dim vData As Variant
Dim i As Long, iStart As Long, iEnd As Long, iData As Long
Dim dblBlockCommishTotal As Double, dblBlockLoserTotal As Double, dblTotalOutcome As Double
Dim iNumLoser As Long
Application.ScreenUpdating = False
'set up
Set wsData = Worksheets("Data")
Set rData = wsData.Cells(1, 1).CurrentRegion
Set rDataNoHeaders = rData.Cells(2, 1).Resize(rData.Rows.Count - 1, rData.Columns.Count)
'sort into the order I want
With wsData.Sort
.SortFields.Clear
.SortFields.Add Key:=rDataNoHeaders.Columns(3)
.SortFields.Add Key:=rDataNoHeaders.Columns(2)
.SetRange rData
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
dblTotalOutcome = 0#
' 1 2 3 4 5 6 7 8 9 10
'PRICE L or W SERIES Probability% Subtotals Stake Stake-Commish Liability Loser Subset Outcome
vData = rData.Value
i = 2
Do While i <= UBound(vData)
iStart = i
iEnd = iStart - 1
Do
iEnd = iEnd + 1
If iEnd > UBound(vData) Then Exit Do
Loop Until vData(iStart, 3) <> vData(iEnd, 3)
iEnd = iEnd - 1
Application.StatusBar = "Processing Block " & iStart & "-" & iEnd & " for " & vData(iStart, 3)
dblBlockCommishTotal = 0#
iNumLoser = 0
dblBlockLoserTotal = 0#
For iData = iStart To iEnd
'probability
vData(iData, 4) = 1# / vData(iData, 1)
'subtotals
If iData = iStart Then
vData(iData, 5) = vData(iData, 4)
Else
vData(iData, 5) = vData(iData, 4) + vData(iData - 1, 5)
End If
Next iData
For iData = iStart To iEnd
'stake
vData(iData, 6) = (vData(iData, 4) / vData(iEnd, 5)) * cStake
'stake-commish
vData(iData, 7) = vData(iData, 6) * cCommish
dblBlockCommishTotal = dblBlockCommishTotal + vData(iData, 7)
Next iData
For iData = iStart To iEnd
'liability
vData(iData, 8) = -vData(iData, 6) * (vData(iData, 1) - 1) + dblBlockCommishTotal - vData(iData, 7)
Next iData
For iData = iStart To iEnd
'loser subset
If vData(iData, 2) = "L" Then
vData(iData, 9) = 0#
Else
iNumLoser = iNumLoser + 1
vData(iData, 9) = vData(iData, 8)
End If
dblBlockLoserTotal = dblBlockLoserTotal + vData(iData, 9)
Next iData
'outcome
If iNumLoser = 0 Then
vData(iEnd, 10) = cStake * cCommish
Else
vData(iEnd, 10) = dblBlockLoserTotal
End If
dblTotalOutcome = dblTotalOutcome + vData(iEnd, 10)
i = iEnd + 1
Loop
rData.Value = vData
wsData.Cells(1, 12).Value = "Total Outcome"
wsData.Cells(2, 12).Value = dblTotalOutcome
Application.ScreenUpdating = True
Application.StatusBar = False
End Sub