VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "months"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = True
Option Explicit

Private x As New TheBigOne
Private units() As Variant
Private price() As Variant
Private sales() As Variant
Private tunits() As Variant
Private tprice() As Variant
Private tsales() As Variant
Private dumping As Boolean
Private vedit As String
Private adjust() As Object
Private jtext() As Variant
Private basejson As Object


Private Sub Worksheet_Activate()

    Call Me.load_sheet

End Sub

Private Sub Worksheet_Change(ByVal target As Range)

    Application.Calculation = xlCalculationManual
    If Not dumping Then

        If Not Intersect(target, Range("E6:E17")) Is Nothing Then Call Me.mvp_adj
        If Not Intersect(target, Range("F6:F17")) Is Nothing Then Call Me.mvp_set
        If Not Intersect(target, Range("K6:K17")) Is Nothing Then Call Me.mvp_adj
        If Not Intersect(target, Range("L6:L17")) Is Nothing Then Call Me.mvp_set
        'If Not Intersect(Target, Range("Q6:Q17")) Is Nothing Then Call Me.ms_adj
        'If Not Intersect(Target, Range("R6:R17")) Is Nothing Then Call Me.ms_set
            
    End If
    
    'Call Me.set_format
    Application.Calculation = xlCalculationAutomatic
    

End Sub



Sub mvp_set()

    Dim i As Integer
    Call Me.get_sheet

    For i = 1 To 12
        If units(i, 5) = "" Then units(i, 5) = 0
        If price(i, 5) = "" Then price(i, 5) = 0
        units(i, 4) = units(i, 5) - (units(i, 2) + units(i, 3))
        price(i, 4) = price(i, 5) - (price(i, 2) + price(i, 3))
        sales(i, 5) = units(i, 5) * price(i, 5)
        sales(i, 4) = sales(i, 5) - (sales(i, 2) + sales(i, 3))
    Next i
    
    Me.crunch_array
    Me.set_sheet
    
        
End Sub

Sub mvp_adj()

    Dim i As Integer
    Call Me.get_sheet

    For i = 1 To 12
        If units(i, 4) = "" Then units(i, 4) = 0
        If price(i, 4) = "" Then price(i, 4) = 0
        units(i, 5) = units(i, 4) + (units(i, 2) + units(i, 3))
        price(i, 5) = price(i, 4) + (price(i, 2) + price(i, 3))
        sales(i, 5) = units(i, 5) * price(i, 5)
        sales(i, 4) = sales(i, 5) - (sales(i, 2) + sales(i, 3))
    Next i
    
    Me.crunch_array
    Me.set_sheet
    
        
End Sub

Sub ms_set()

    Dim i As Integer
    Call Me.get_sheet

    For i = 1 To 12
        units(i, 4) = units(i, 5) - (units(i, 2) + units(i, 3))
        price(i, 4) = price(i, 5) - (price(i, 2) + price(i, 3))
        sales(i, 5) = units(i, 5) * price(i, 5)
        sales(i, 4) = sales(i, 5) - (sales(i, 2) + sales(i, 3))
    Next i
    
    set_sheet
    
        
End Sub


Sub get_sheet()

    Dim i As Integer
    
    units = Range("B6:F17")
    price = Range("H6:L17")
    sales = Range("N6:R17")
    tunits = Range("B18:F18")
    tprice = Range("H18:L18")
    tsales = Range("N18:R18")
    ReDim adjust(12)
    Set basejson = JsonConverter.ParseJson("{""scenario"":" & Sheets("_month").Range("P1").FormulaR1C1 & "}")
      
End Sub

Sub set_sheet()

    dumping = True

    Range("B6:F17") = units
    Range("H6:L17") = price
    Range("N6:R17") = sales
    
    dumping = False
    
End Sub

Sub load_sheet()

    units = Sheets("_month").Range("A2:E13").FormulaR1C1
    price = Sheets("_month").Range("F2:J13").FormulaR1C1
    sales = Sheets("_month").Range("K2:O13").FormulaR1C1
   

End Sub

Sub set_format()

    Dim prices As Range
    Dim price_adj As Range
    Dim price_set As Range
    Dim vol As Range
    Dim vol_adj As Range
    Dim vol_set As Range
    Dim val As Range
    Dim val_adj As Range
    Dim val_set As Range
    
    Set prices = Sheets("month").Range("H6:L17")
    Set price_adj = Sheets("month").Range("K6:K17")
    Set price_set = Sheets("month").Range("L6:L17")
    
    Set vol = Sheets("month").Range("B6:F17")
    Set vol_adj = Sheets("month").Range("E6:E17")
    Set vol_set = Sheets("month").Range("F6:F17")
    
    Set val = Sheets("month").Range("N6:R17")
    Set val_adj = Sheets("month").Range("Q6:Q17")
    Set val_set = Sheets("month").Range("R6:R17")
    
    Call Me.format_price(prices)
    Call Me.set_border(prices)
    Call Me.fill_yellow(price_adj)
    Call Me.fill_none(price_set)
    
    Call Me.format_number(vol)
    Call Me.set_border(vol)
    Call Me.fill_yellow(vol_adj)
    Call Me.fill_none(vol_set)
    
    Call Me.format_number(val)
    Call Me.set_border(val)
    Call Me.fill_yellow(val_adj)
    Call Me.fill_none(val_set)
    
End Sub

Sub set_border(ByRef targ As Range)

    targ.Borders(xlDiagonalDown).LineStyle = xlNone
    targ.Borders(xlDiagonalUp).LineStyle = xlNone
    With targ.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With targ.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With targ.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With targ.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With targ.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With targ.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With

End Sub

Sub fill_yellow(ByRef target As Range)

    With target.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent4
        .TintAndShade = 0.799981688894314
        .PatternTintAndShade = 0
    End With

End Sub

Sub fill_none(ByRef target As Range)

    With target.Interior
        .Pattern = xlNone
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    
End Sub

Sub format_price(ByRef target As Range)

    target.NumberFormat = "_(* #,##0.000_);_(* (#,##0.000);_(* ""-""???_);_(@_)"

End Sub

Sub format_number(ByRef target As Range)

    target.NumberFormat = "_(* #,##0_);_(* (#,##0);_(* ""-""_);_(@_)"

End Sub

Sub build_json(ByVal pos As Integer)

    'if there is no existing volume on the target month
    If units(pos, 2) + units(pos, 3) = 0 Then
        'add month
        If price(pos, 4) = 0 Then
            'if the target price is diferent from the average
            adjust(pos)("type") = "addmonth_vd"
        End If
    End If

End Sub

Sub crunch_array()

    Dim i As Integer
    
    For i = 1 To 5
        tunits(1, i) = 0
        tprice(1, i) = 0
        tsales(1, i) = 0
    Next i
    
    For i = 1 To 12
        tunits(1, 1) = tunits(1, 1) + units(i, 1)
        tsales(1, 1) = tsales(1, 1) + sales(i, 1)
    Next i
    
    'prior
    tprice(1, 1) = tsales(1, 1) / tunits(1, 1)
    'base
    tprice(2, 1) = tsales(2, 1) / tunits(2, 1)
    'forecast
    tprice(5, 1) = tsales(5, 1) / tunits(5, 1)
    'adjust
    tprice(3, 1) = (tsales(2, 1) + tsales(3, 1)) / (tunits(2, 1) + tunits(3, 1)) - tprice(2, 1)
    'current adjust
    tprice(4, 1) = tprice(5, 1) - (tprice(2, 1) + tprice(3, 1))
    

End Sub
