Files
jimmycheung93/task4/1/APAnalysis.bas
louiscklaw 1b62961605 update,
2025-02-01 02:02:37 +08:00

413 lines
14 KiB
QBasic

Attribute VB_Name = "APAnalysis"
Option Explicit
Function APAnalysis_Calc(ByVal TablesMeta As Variant) As Variant
Dim agent_sales_table As Variant
Dim product_sales_meta As Variant
Dim product_sales_table As Variant
Dim agent_working_performance As Variant
Dim i, j, k, m, intMonth, intQuarter As Integer
Dim ps As Integer
Dim val_product_sales_date As String
Dim sales_name As Variant
Dim dt As String
Dim monthly_top_5_comission_details(12, 5, 10) As Double
Dim monthly_top_5_comission_value(12, 5) As Double
Dim monthly_top_5_comission_name(12, 5) As String
agent_sales_table = TablesMeta(0)
Dim agent_sales_table_rows As Variant
agent_sales_table_rows = agent_sales_table(0)
product_sales_table = TablesMeta(1)
Dim product_sales_table_row As Variant
product_sales_table_row = product_sales_table(0)
agent_working_performance = TablesMeta(2)
Dim val_product_sales_comission As String
Dim val_product_sales_selling_price As String
Dim val_product_sales_selling_unit As String
Dim val_agent_sale_commision_pct As String
Dim val_agent_sale_agent_name As String
Dim val_agent_sale_agent_team As String
Dim monthly_total(12) As Double
Dim monthly_total_TA(12) As Double ' team a
Dim monthly_total_TB(12) As Double ' team b
Dim monthly_commission(12) As Double
Dim montyly_commission_TA(12) As Double ' team a
Dim montyly_commission_TB(12) As Double ' team b
Dim quartely_commission_TA(12) As Double ' team a
Dim quartely_commission_TB(12) As Double ' team b
For j = 1 To 12
monthly_total(j) = 0
monthly_total_TA(j) = 0
monthly_total_TB(j) = 0
Next j
For ps = 1 To product_sales_table(1)
val_product_sales_date = product_sales_table_row(ps, 2)
dt = DateValue(val_product_sales_date)
intMonth = month(dt)
intQuarter = Int((intMonth - 1) / 3) + 1
val_product_sales_selling_unit = product_sales_table_row(ps, 4)
val_product_sales_selling_price = product_sales_table_row(ps, 5)
val_agent_sale_agent_name = agent_sales_table_rows(ps, 3)
val_agent_sale_agent_team = agent_sales_table_rows(ps, 4)
val_agent_sale_commision_pct = agent_sales_table_rows(ps, 6)
val_product_sales_comission = (val_product_sales_selling_unit * val_product_sales_selling_price) * val_agent_sale_commision_pct
product_sales_table_row(ps, 6) = val_product_sales_comission
Dim temp_key As String
temp_key = val_agent_sale_agent_name + "," + CStr(intMonth)
' initialize per agent result
If (Not (IsEmpty(temp_key)) And Not (monthly_commission_per_agent.exists(temp_key))) Then
For j = 1 To 12
Var.monthly_commission_per_agent(val_agent_sale_agent_name + "," + CStr(j)) = 0
Var.monthly_product_sales_selling_unit_per_agent(val_agent_sale_agent_name + "," + CStr(j)) = 0
Var.monthly_product_sales_selling_price_per_agent(val_agent_sale_agent_name + "," + CStr(j)) = 0
Var.monthly_product_sales_per_agent(val_agent_sale_agent_name + "," + CStr(j)) = 0
Next j
End If
monthly_total(intMonth) = monthly_total(intMonth) + (val_product_sales_selling_unit * val_product_sales_selling_price)
monthly_commission_per_agent(temp_key) = monthly_commission_per_agent(temp_key) + val_product_sales_comission
Var.monthly_product_sales_selling_unit_per_agent(temp_key) = Var.monthly_product_sales_selling_unit_per_agent(temp_key) + val_product_sales_selling_unit
Var.monthly_product_sales_selling_price_per_agent(temp_key) = Var.monthly_product_sales_selling_price_per_agent(temp_key) + val_product_sales_selling_price
Var.monthly_product_sales_per_agent(temp_key) = Var.monthly_product_sales_per_agent(temp_key) + val_product_sales_selling_price
monthly_commission(intMonth) = monthly_commission(intMonth) + val_product_sales_comission
If (val_agent_sale_agent_team = "A") Then
montyly_commission_TA(intMonth) = montyly_commission_TA(intMonth) + val_product_sales_comission
End If
If (val_agent_sale_agent_team = "B") Then
montyly_commission_TB(intMonth) = montyly_commission_TB(intMonth) + val_product_sales_comission
End If
If (val_agent_sale_agent_team = "A") Then
quartely_commission_TA(intQuarter) = quartely_commission_TA(intQuarter) + val_product_sales_comission
End If
If (val_agent_sale_agent_team = "B") Then
quartely_commission_TB(intQuarter) = quartely_commission_TB(intQuarter) + val_product_sales_comission
End If
Next ps
For m = 1 To 12
Dim temp_sort(20) As Double
i = 0
For Each sales_name In SALES_ARRAY
temp_key = sales_name + "," + CStr(m)
temp_sort(i) = monthly_commission_per_agent(temp_key)
i = i + 1
Next sales_name
sort_result = SortArray(temp_sort)
monthly_top_5_comission_value(m, 0) = sort_result(0)
monthly_top_5_comission_value(m, 1) = sort_result(1)
monthly_top_5_comission_value(m, 2) = sort_result(2)
monthly_top_5_comission_value(m, 3) = sort_result(3)
monthly_top_5_comission_value(m, 4) = sort_result(4)
For Each sales_name In SALES_ARRAY
temp_key = sales_name + "," + CStr(m)
If (monthly_top_5_comission_value(m, 0) = monthly_commission_per_agent(temp_key)) Then
monthly_top_5_comission_name(m, 0) = sales_name
End If
If (monthly_top_5_comission_value(m, 1) = monthly_commission_per_agent(temp_key)) Then
monthly_top_5_comission_name(m, 1) = sales_name
End If
If (monthly_top_5_comission_value(m, 2) = monthly_commission_per_agent(temp_key)) Then
monthly_top_5_comission_name(m, 2) = sales_name
End If
If (monthly_top_5_comission_value(m, 3) = monthly_commission_per_agent(temp_key)) Then
monthly_top_5_comission_name(m, 3) = sales_name
End If
If (monthly_top_5_comission_value(m, 4) = monthly_commission_per_agent(temp_key)) Then
monthly_top_5_comission_name(m, 4) = sales_name
End If
Next sales_name
Next m
APAnalysis_Calc = Array( _
monthly_commission_per_agent, _
monthly_commission, _
montyly_commission_TA, _
montyly_commission_TB, _
quartely_commission_TA, _
quartely_commission_TB, _
monthly_top_5_comission_name, _
monthly_top_5_comission_value, _
monthly_total, _
monthly_total_TA, _
monthly_total_TB)
Debug.Print "calc done"
End Function
Function APAnalysis_WriteTable(ByVal calc_result As Variant, ByVal file_path As String, ByRef wb As Workbook)
Dim monthly_commission As Variant
Dim montyly_commission_TA As Variant ' team a
Dim montyly_commission_TB As Variant ' team b
Dim quartely_commission_TA As Variant ' team a
Dim quartely_commission_TB As Variant ' team b
Dim monthly_top_5_comission_name As Variant
Dim monthly_top_5_comission_value As Variant
Dim range_need_merge, ranges_need_merge As Variant
Dim ranges_need_paint As Variant
Dim i, j, k, m, r, intMonth, intQuarter As Integer
Dim sale_name_comma_month As String
monthly_commission = calc_result(1)
montyly_commission_TA = calc_result(2) ' team a
montyly_commission_TB = calc_result(3) ' team b
quartely_commission_TA = calc_result(4) ' team a
quartely_commission_TB = calc_result(5) ' team b
monthly_top_5_comission_name = calc_result(6)
monthly_top_5_comission_value = calc_result(7)
Const TOP_ROW As Long = 1
Const START_CELL As String = "A2"
Dim ws As Worksheet
Dim startCell As Range
Dim tempArray() As Variant
' Check if the sheet exists
On Error Resume Next
Set ws = wb.Sheets("Agent performance analysis")
On Error GoTo 0
' If not found, create a new sheet
If ws Is Nothing Then
Set ws = wb.Sheets.Add(After:=wb.Sheets(wb.Sheets.Count))
ws.Name = "Agent performance analysis"
Else
' Empty the entire sheet
ws.UsedRange.ClearContents
End If
' Write month names
Set startCell = ws.Range("B1")
tempArray = Array("January", "Feburary", "March", "April", "May", "June", "July", "Augest", "September", "October", "November", "December")
For i = LBound(tempArray) To UBound(tempArray)
startCell.Offset(0, i).Value = tempArray(i)
Next i
' Write month names
Set startCell = ws.Range("A2")
For i = LBound(SALES_ARRAY) To UBound(SALES_ARRAY)
startCell.Offset(i, 0).Value = SALES_ARRAY(i)
Next i
' Write month names
Set startCell = ws.Range("A14")
tempArray = Array("Total", "", "Team A total", "Team B Total", "Team A Quartely", "Team B Quartely")
For i = LBound(tempArray) To UBound(tempArray)
startCell.Offset(i, 0).Value = tempArray(i)
Next i
Set startCell = ws.Range("B2")
For m = 1 To 12
For i = LBound(SALES_ARRAY) To UBound(SALES_ARRAY)
Dim sales_name As String
sale_name_comma_month = SALES_ARRAY(i) + "," + CStr(m)
startCell.Offset(i, m - 1).Value = monthly_commission_per_agent(sale_name_comma_month)
Next i
Next m
' Write month names
Set startCell = ws.Range("B14")
tempArray = Array("Total", "", "Team A total", "Team B Total", "Team A Quartely", "Team B Quartely")
' For i = LBound(tempArray) To UBound(tempArray)
' startCell.Offset(i, 0).Value = tempArray(i)
' Next i
For m = 1 To 12
intQuarter = Common.GetQuarterFromMonth(m)
startCell.Offset(0, m - 1).Value = monthly_commission(m)
startCell.Offset(2, m - 1).Value = montyly_commission_TA(m)
startCell.Offset(3, m - 1).Value = montyly_commission_TB(m)
startCell.Offset(4, m - 1).Value = quartely_commission_TA(intQuarter)
startCell.Offset(5, m - 1).Value = quartely_commission_TB(intQuarter)
Next m
' styling
For i = 0 To 100
ws.Range("A1").Offset(0, i).EntireColumn.AutoFit
Next i
For i = 1 To 14
Range("A1").Offset(0, i).EntireColumn.ColumnWidth = 15
Next i
ranges_need_merge = Array("B18:D18", "E18:G18", "H18:J18", "K18:M18", "B19:D19", "E19:G19", "H19:J19", "K19:M19")
For r = LBound(ranges_need_merge) To UBound(ranges_need_merge)
range_need_merge = ranges_need_merge(r)
With Range(range_need_merge)
.Merge
.VerticalAlignment = xlVAlignCenter
.HorizontalAlignment = xlHAlignCenter
End With
Next r
ranges_need_paint = Array("B1:M1")
For r = LBound(ranges_need_paint) To UBound(ranges_need_paint)
range_need_merge = ranges_need_paint(r)
With Range(range_need_merge)
.Interior.Color = RGB(217, 210, 233)
End With
Next r
ranges_need_paint = Array("A2:A11", "A14")
For r = LBound(ranges_need_paint) To UBound(ranges_need_paint)
range_need_merge = ranges_need_paint(r)
With Range(range_need_merge)
.Interior.Color = RGB(180, 167, 214)
End With
Next r
ranges_need_paint = Array("A16:A19")
For r = LBound(ranges_need_paint) To UBound(ranges_need_paint)
range_need_merge = ranges_need_paint(r)
With Range(range_need_merge)
.Interior.Color = RGB(142, 124, 195)
End With
Next r
' Rank for each month
Set startCell = ws.Range("A21")
startCell.Value = "Rank for each month"
tempArray = Array("January", "Feburary", "March", "April", "May", "June")
For i = 0 To 5
startCell.Offset(1, (i * 2) + 1).Value = tempArray(i)
Next i
For i = 1 To 5
startCell.Offset(i + 1, 0).Value = i
Next i
tempArray = Array("July", "Augest", "September", "October", "November", "December")
For i = 0 To 5
startCell.Offset(8, (i * 2) + 1).Value = tempArray(i)
Next i
For i = 1 To 5
startCell.Offset(i + 8, 0).Value = i
Next i
For m = 1 To 6
i = m - 1
startCell.Offset(2, (i * 2) + 1).Value = monthly_top_5_comission_name(m, 0)
startCell.Offset(3, (i * 2) + 1).Value = monthly_top_5_comission_name(m, 1)
startCell.Offset(4, (i * 2) + 1).Value = monthly_top_5_comission_name(m, 2)
startCell.Offset(5, (i * 2) + 1).Value = monthly_top_5_comission_name(m, 3)
startCell.Offset(6, (i * 2) + 1).Value = monthly_top_5_comission_name(m, 4)
startCell.Offset(2, (i * 2) + 2).Value = monthly_top_5_comission_value(m, 0)
startCell.Offset(3, (i * 2) + 2).Value = monthly_top_5_comission_value(m, 1)
startCell.Offset(4, (i * 2) + 2).Value = monthly_top_5_comission_value(m, 2)
startCell.Offset(5, (i * 2) + 2).Value = monthly_top_5_comission_value(m, 3)
startCell.Offset(6, (i * 2) + 2).Value = monthly_top_5_comission_value(m, 4)
Next m
For m = 7 To 12
i = m - 7
startCell.Offset(9, (i * 2) + 1).Value = monthly_top_5_comission_name(m, 0)
startCell.Offset(10, (i * 2) + 1).Value = monthly_top_5_comission_name(m, 1)
startCell.Offset(11, (i * 2) + 1).Value = monthly_top_5_comission_name(m, 2)
startCell.Offset(12, (i * 2) + 1).Value = monthly_top_5_comission_name(m, 3)
startCell.Offset(13, (i * 2) + 1).Value = monthly_top_5_comission_name(m, 4)
startCell.Offset(9, (i * 2) + 2).Value = monthly_top_5_comission_value(m, 0)
startCell.Offset(10, (i * 2) + 2).Value = monthly_top_5_comission_value(m, 1)
startCell.Offset(11, (i * 2) + 2).Value = monthly_top_5_comission_value(m, 2)
startCell.Offset(12, (i * 2) + 2).Value = monthly_top_5_comission_value(m, 3)
startCell.Offset(13, (i * 2) + 2).Value = monthly_top_5_comission_value(m, 4)
Next m
' styling
For i = 0 To 100
ws.Range("A1").Offset(0, i).EntireColumn.AutoFit
Next i
For i = 1 To 14
Range("A1").Offset(0, i).EntireColumn.ColumnWidth = 15
Next i
ranges_need_merge = Array("B22:C22", "D22:E22", "F22:G22", "H22:I22", "J22:k22", "L22:M22", "B29:C29", "D29:E29", "F29:G29", "H29:I29", "J29:k29", "L29:M29")
For r = LBound(ranges_need_merge) To UBound(ranges_need_merge)
range_need_merge = ranges_need_merge(r)
With Range(range_need_merge)
.Merge
.VerticalAlignment = xlVAlignCenter
.HorizontalAlignment = xlHAlignCenter
End With
Next r
ranges_need_paint = Array("B22:C22", "D22:E22", "F22:G22", "H22:I22", "J22:k22", "L22:M22", "B29:C29", "D29:E29", "F29:G29", "H29:I29", "J29:k29", "L29:M29")
For r = LBound(ranges_need_paint) To UBound(ranges_need_paint)
range_need_merge = ranges_need_paint(r)
With Range(range_need_merge)
.Interior.Color = RGB(234, 209, 220)
End With
Next r
ranges_need_paint = Array("A21", "A23", "A25", "A27", "A30", "A32", "A34")
For r = LBound(ranges_need_paint) To UBound(ranges_need_paint)
range_need_merge = ranges_need_paint(r)
With Range(range_need_merge)
.Interior.Color = RGB(234, 209, 220)
End With
Next r
' Save and close the workbook
' wb.Close SaveChanges:=True
End Function