Freelance Dashboard v1.0
Excel KPI Dashboard for freelance activity tracking. Features: - Revenue, time and client tracking - Dynamic KPIs and pivot tables - Interactive charts and slicers - VBA automation macros - Professional design
This commit is contained in:
commit
0442c8f995
24
.gitignore
vendored
Normal file
24
.gitignore
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# Excel temp files
|
||||||
|
~$*
|
||||||
|
*.tmp
|
||||||
|
|
||||||
|
# Excel lock files
|
||||||
|
*.xlk
|
||||||
|
|
||||||
|
# Windows reserved names
|
||||||
|
nul
|
||||||
|
con
|
||||||
|
prn
|
||||||
|
aux
|
||||||
|
|
||||||
|
# Windows system files
|
||||||
|
Thumbs.db
|
||||||
|
Desktop.ini
|
||||||
|
|
||||||
|
# Backups
|
||||||
|
*.bak
|
||||||
|
*_backup_*.xlsm
|
||||||
|
|
||||||
|
# Local config
|
||||||
|
.mcp.json
|
||||||
|
.claude/
|
||||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2025 Alexis Trouve
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
71
README.md
Normal file
71
README.md
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
# Freelance Dashboard
|
||||||
|
|
||||||
|
Excel KPI Dashboard for freelance activity tracking - Revenue, time tracking, clients with pivot tables, charts and VBA automation.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- **Structured Data Tables** - Clients, time entries, revenue tracking
|
||||||
|
- **Dynamic KPIs** - Total revenue, hourly rate, active clients, top client
|
||||||
|
- **Pivot Tables** - Revenue by client, by month, hours by project
|
||||||
|
- **Interactive Charts** - Pie chart, bar charts, trends
|
||||||
|
- **Slicers** - Filter by client and period
|
||||||
|
- **VBA Automation** - One-click refresh, rebuild dashboard
|
||||||
|
- **Professional Design** - Clean layout, conditional formatting
|
||||||
|
|
||||||
|
## File Structure
|
||||||
|
|
||||||
|
| Sheet | Content |
|
||||||
|
|-------|---------|
|
||||||
|
| Dashboard | Main view with KPIs, charts and slicers |
|
||||||
|
| Data_Clients | Client list (ID, name, sector, start date) |
|
||||||
|
| Data_Temps | Time entries (date, client, project, hours) |
|
||||||
|
| Data_Revenus | Revenue entries (date, client, amount, type) |
|
||||||
|
| Config | Settings (year, default rate, objectives) |
|
||||||
|
| TCD_Data | Pivot tables data |
|
||||||
|
|
||||||
|
## KPIs
|
||||||
|
|
||||||
|
- Total Revenue
|
||||||
|
- Current Month Revenue
|
||||||
|
- Total Hours
|
||||||
|
- Average Hourly Rate
|
||||||
|
- Number of Active Clients
|
||||||
|
- Top Client (by revenue)
|
||||||
|
- Hours This Week
|
||||||
|
- Unique Projects Count
|
||||||
|
|
||||||
|
## VBA Macros
|
||||||
|
|
||||||
|
| Macro | Description |
|
||||||
|
|-------|-------------|
|
||||||
|
| `RefreshDashboard` | Recalculates formulas and refreshes pivot tables |
|
||||||
|
| `QuickRefresh` | Silent refresh (no message) |
|
||||||
|
| `RebuildAll` | Rebuilds entire dashboard from scratch |
|
||||||
|
| `CreatePivotTables` | Creates/recreates pivot tables |
|
||||||
|
| `CreateCharts` | Creates/recreates charts |
|
||||||
|
| `CreateSlicers` | Creates/recreates slicers |
|
||||||
|
| `ApplyDesign` | Applies professional formatting |
|
||||||
|
|
||||||
|
## Screenshots
|
||||||
|
|
||||||
|
*Coming soon*
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- Microsoft Excel 2016+ (or Microsoft 365)
|
||||||
|
- Macros enabled for VBA features
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
1. Open `FreelanceDashboard.xlsm`
|
||||||
|
2. Enable macros when prompted
|
||||||
|
3. Add your data in Data_Clients, Data_Temps, Data_Revenus
|
||||||
|
4. Press `Alt+F8` and run `RefreshDashboard` to update
|
||||||
|
|
||||||
|
## Author
|
||||||
|
|
||||||
|
Alexis Trouve - alexistrouve.pro@gmail.com
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
MIT License - See [LICENSE](LICENSE) file
|
||||||
20
src/ThisWorkbook.cls
Normal file
20
src/ThisWorkbook.cls
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
VERSION 1.0 CLASS
|
||||||
|
BEGIN
|
||||||
|
MultiUse = -1 'True
|
||||||
|
END
|
||||||
|
Attribute VB_Name = "ThisWorkbook"
|
||||||
|
Attribute VB_GlobalNameSpace = False
|
||||||
|
Attribute VB_Creatable = False
|
||||||
|
Attribute VB_PredeclaredId = True
|
||||||
|
Attribute VB_Exposed = True
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
' =============================================================================
|
||||||
|
' ThisWorkbook Module
|
||||||
|
' Description: Auto-refresh on workbook open
|
||||||
|
' =============================================================================
|
||||||
|
|
||||||
|
Private Sub Workbook_Open()
|
||||||
|
' Automatic refresh when workbook opens
|
||||||
|
QuickRefresh
|
||||||
|
End Sub
|
||||||
76
src/mod_Charts.bas
Normal file
76
src/mod_Charts.bas
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
Attribute VB_Name = "mod_Charts"
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
' =============================================================================
|
||||||
|
' Module: mod_Charts
|
||||||
|
' Description: Creates Charts for the Freelance Dashboard
|
||||||
|
' =============================================================================
|
||||||
|
|
||||||
|
Sub CreateCharts()
|
||||||
|
Dim wsDash As Worksheet
|
||||||
|
Dim wsTCD As Worksheet
|
||||||
|
Dim cht As ChartObject
|
||||||
|
|
||||||
|
On Error GoTo ErrorHandler
|
||||||
|
|
||||||
|
Set wsDash = ThisWorkbook.Sheets("Dashboard")
|
||||||
|
Set wsTCD = ThisWorkbook.Sheets("TCD_Data")
|
||||||
|
|
||||||
|
' Delete existing charts
|
||||||
|
On Error Resume Next
|
||||||
|
For Each cht In wsDash.ChartObjects
|
||||||
|
cht.Delete
|
||||||
|
Next cht
|
||||||
|
On Error GoTo ErrorHandler
|
||||||
|
|
||||||
|
' Chart 1: Pie Chart - Revenue by Client
|
||||||
|
Set cht = wsDash.ChartObjects.Add( _
|
||||||
|
Left:=wsDash.Range("D3").Left, _
|
||||||
|
Top:=wsDash.Range("D3").Top, _
|
||||||
|
Width:=250, _
|
||||||
|
Height:=200)
|
||||||
|
|
||||||
|
With cht.Chart
|
||||||
|
.SetSourceData Source:=wsTCD.PivotTables("TCD_CA_Client").TableRange1
|
||||||
|
.ChartType = xlPie
|
||||||
|
.HasTitle = True
|
||||||
|
.ChartTitle.Text = "CA par Client"
|
||||||
|
.HasLegend = True
|
||||||
|
.Legend.Position = xlLegendPositionRight
|
||||||
|
End With
|
||||||
|
|
||||||
|
' Chart 2: Column Chart - Revenue by Month
|
||||||
|
Set cht = wsDash.ChartObjects.Add( _
|
||||||
|
Left:=wsDash.Range("D12").Left, _
|
||||||
|
Top:=wsDash.Range("D12").Top, _
|
||||||
|
Width:=250, _
|
||||||
|
Height:=200)
|
||||||
|
|
||||||
|
With cht.Chart
|
||||||
|
.SetSourceData Source:=wsTCD.PivotTables("TCD_CA_Mois").TableRange1
|
||||||
|
.ChartType = xlColumnClustered
|
||||||
|
.HasTitle = True
|
||||||
|
.ChartTitle.Text = "CA par Mois"
|
||||||
|
.HasLegend = False
|
||||||
|
End With
|
||||||
|
|
||||||
|
' Chart 3: Bar Chart - Hours by Project
|
||||||
|
Set cht = wsDash.ChartObjects.Add( _
|
||||||
|
Left:=wsDash.Range("H3").Left, _
|
||||||
|
Top:=wsDash.Range("H3").Top, _
|
||||||
|
Width:=250, _
|
||||||
|
Height:=200)
|
||||||
|
|
||||||
|
With cht.Chart
|
||||||
|
.SetSourceData Source:=wsTCD.PivotTables("TCD_Heures_Projet").TableRange1
|
||||||
|
.ChartType = xlBarClustered
|
||||||
|
.HasTitle = True
|
||||||
|
.ChartTitle.Text = "Heures par Projet"
|
||||||
|
.HasLegend = False
|
||||||
|
End With
|
||||||
|
|
||||||
|
Exit Sub
|
||||||
|
|
||||||
|
ErrorHandler:
|
||||||
|
MsgBox "Error creating charts: " & Err.Description, vbCritical, "Error"
|
||||||
|
End Sub
|
||||||
145
src/mod_Design.bas
Normal file
145
src/mod_Design.bas
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
Attribute VB_Name = "mod_Design"
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
' =============================================================================
|
||||||
|
' Module: mod_Design
|
||||||
|
' Description: Applies professional design to the Dashboard
|
||||||
|
' Color Palette:
|
||||||
|
' - Primary (Blue): #2C3E50 / RGB(44, 62, 80)
|
||||||
|
' - Accent (Green): #27AE60 / RGB(39, 174, 96)
|
||||||
|
' - Neutral (Gray): #ECF0F1 / RGB(236, 240, 241)
|
||||||
|
' - Alert (Red): #E74C3C / RGB(231, 76, 60)
|
||||||
|
' =============================================================================
|
||||||
|
|
||||||
|
Sub ApplyDesign()
|
||||||
|
Dim wsDash As Worksheet
|
||||||
|
|
||||||
|
On Error GoTo ErrorHandler
|
||||||
|
|
||||||
|
Set wsDash = ThisWorkbook.Sheets("Dashboard")
|
||||||
|
|
||||||
|
' Colors
|
||||||
|
Dim bleuFonce As Long, vert As Long, grisClair As Long, rouge As Long
|
||||||
|
bleuFonce = RGB(44, 62, 80)
|
||||||
|
vert = RGB(39, 174, 96)
|
||||||
|
grisClair = RGB(236, 240, 241)
|
||||||
|
rouge = RGB(231, 76, 60)
|
||||||
|
|
||||||
|
' Euro symbol
|
||||||
|
Dim euroSymbol As String
|
||||||
|
euroSymbol = Chr(128)
|
||||||
|
|
||||||
|
With wsDash
|
||||||
|
' Hide gridlines
|
||||||
|
ActiveWindow.DisplayGridlines = False
|
||||||
|
|
||||||
|
' Light gray background
|
||||||
|
.Cells.Interior.Color = grisClair
|
||||||
|
|
||||||
|
' Dashboard Title (A1:C1)
|
||||||
|
.Range("A1:C1").Merge
|
||||||
|
With .Range("A1")
|
||||||
|
.Font.Name = "Calibri"
|
||||||
|
.Font.Size = 24
|
||||||
|
.Font.Bold = True
|
||||||
|
.Font.Color = bleuFonce
|
||||||
|
.HorizontalAlignment = xlLeft
|
||||||
|
.VerticalAlignment = xlCenter
|
||||||
|
.RowHeight = 40
|
||||||
|
End With
|
||||||
|
|
||||||
|
' Section header "KPIs Principaux" (A3)
|
||||||
|
With .Range("A3")
|
||||||
|
.Font.Name = "Calibri"
|
||||||
|
.Font.Size = 14
|
||||||
|
.Font.Bold = True
|
||||||
|
.Font.Color = bleuFonce
|
||||||
|
End With
|
||||||
|
|
||||||
|
' KPI Labels (A4:A9)
|
||||||
|
With .Range("A4:A9")
|
||||||
|
.Font.Name = "Calibri"
|
||||||
|
.Font.Size = 11
|
||||||
|
.Font.Color = bleuFonce
|
||||||
|
End With
|
||||||
|
|
||||||
|
' KPI Values (B4:B9)
|
||||||
|
With .Range("B4:B9")
|
||||||
|
.Font.Name = "Calibri"
|
||||||
|
.Font.Size = 16
|
||||||
|
.Font.Bold = True
|
||||||
|
.Font.Color = bleuFonce
|
||||||
|
.HorizontalAlignment = xlRight
|
||||||
|
End With
|
||||||
|
|
||||||
|
' Number formats
|
||||||
|
.Range("B4").NumberFormat = "# ##0 [$" & euroSymbol & "-40C]"
|
||||||
|
.Range("B5").NumberFormat = "# ##0 [$" & euroSymbol & "-40C]"
|
||||||
|
.Range("B6").NumberFormat = "0.0 ""h"""
|
||||||
|
.Range("B7").NumberFormat = "0.00 [$" & euroSymbol & "-40C]""/h"""
|
||||||
|
.Range("B8").NumberFormat = "0"
|
||||||
|
.Range("B9").NumberFormat = "0.0 ""h"""
|
||||||
|
|
||||||
|
' Top Client (A11:B11)
|
||||||
|
With .Range("A11")
|
||||||
|
.Font.Name = "Calibri"
|
||||||
|
.Font.Size = 11
|
||||||
|
.Font.Color = bleuFonce
|
||||||
|
End With
|
||||||
|
With .Range("B11")
|
||||||
|
.Font.Name = "Calibri"
|
||||||
|
.Font.Size = 14
|
||||||
|
.Font.Bold = True
|
||||||
|
.Font.Color = vert
|
||||||
|
End With
|
||||||
|
|
||||||
|
' Statistics Section (A13:B16)
|
||||||
|
With .Range("A13")
|
||||||
|
.Font.Name = "Calibri"
|
||||||
|
.Font.Size = 14
|
||||||
|
.Font.Bold = True
|
||||||
|
.Font.Color = bleuFonce
|
||||||
|
End With
|
||||||
|
.Range("A14:A16").Font.Color = bleuFonce
|
||||||
|
.Range("B14:B16").Font.Bold = True
|
||||||
|
.Range("B14:B15").NumberFormat = "DD/MM/YYYY"
|
||||||
|
|
||||||
|
' Column widths
|
||||||
|
.Columns("A").ColumnWidth = 25
|
||||||
|
.Columns("B").ColumnWidth = 18
|
||||||
|
.Columns("C").ColumnWidth = 3
|
||||||
|
.Columns("D:G").ColumnWidth = 12
|
||||||
|
.Columns("H:J").ColumnWidth = 12
|
||||||
|
.Columns("K:L").ColumnWidth = 15
|
||||||
|
|
||||||
|
' Light borders around KPIs
|
||||||
|
With .Range("A4:B9").Borders
|
||||||
|
.LineStyle = xlContinuous
|
||||||
|
.Weight = xlThin
|
||||||
|
.Color = RGB(189, 195, 199)
|
||||||
|
End With
|
||||||
|
|
||||||
|
With .Range("A11:B11").Borders
|
||||||
|
.LineStyle = xlContinuous
|
||||||
|
.Weight = xlThin
|
||||||
|
.Color = RGB(189, 195, 199)
|
||||||
|
End With
|
||||||
|
|
||||||
|
With .Range("A14:B16").Borders
|
||||||
|
.LineStyle = xlContinuous
|
||||||
|
.Weight = xlThin
|
||||||
|
.Color = RGB(189, 195, 199)
|
||||||
|
End With
|
||||||
|
|
||||||
|
' Row heights
|
||||||
|
.Rows("1").RowHeight = 40
|
||||||
|
.Rows("2").RowHeight = 10
|
||||||
|
.Rows("3:16").RowHeight = 22
|
||||||
|
End With
|
||||||
|
|
||||||
|
MsgBox "Design applied successfully!", vbInformation
|
||||||
|
Exit Sub
|
||||||
|
|
||||||
|
ErrorHandler:
|
||||||
|
MsgBox "Error applying design: " & Err.Description, vbCritical, "Error"
|
||||||
|
End Sub
|
||||||
92
src/mod_Refresh.bas
Normal file
92
src/mod_Refresh.bas
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
Attribute VB_Name = "mod_Refresh"
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
' =============================================================================
|
||||||
|
' Module: mod_Refresh
|
||||||
|
' Description: Main refresh and rebuild macros for the Dashboard
|
||||||
|
' =============================================================================
|
||||||
|
|
||||||
|
Sub RefreshDashboard()
|
||||||
|
' Main refresh macro - recalculates formulas and refreshes pivot tables
|
||||||
|
Application.ScreenUpdating = False
|
||||||
|
Application.Calculation = xlCalculationManual
|
||||||
|
|
||||||
|
On Error GoTo ErrorHandler
|
||||||
|
|
||||||
|
' 1. Recalculate all formulas
|
||||||
|
Application.CalculateFull
|
||||||
|
|
||||||
|
' 2. Refresh all Pivot Tables
|
||||||
|
Dim ws As Worksheet
|
||||||
|
Dim pt As PivotTable
|
||||||
|
|
||||||
|
For Each ws In ThisWorkbook.Worksheets
|
||||||
|
For Each pt In ws.PivotTables
|
||||||
|
pt.RefreshTable
|
||||||
|
Next pt
|
||||||
|
Next ws
|
||||||
|
|
||||||
|
' 3. Refresh external connections (if any)
|
||||||
|
On Error Resume Next
|
||||||
|
Dim conn As WorkbookConnection
|
||||||
|
For Each conn In ThisWorkbook.Connections
|
||||||
|
conn.Refresh
|
||||||
|
Next conn
|
||||||
|
On Error GoTo ErrorHandler
|
||||||
|
|
||||||
|
Application.Calculation = xlCalculationAutomatic
|
||||||
|
Application.ScreenUpdating = True
|
||||||
|
|
||||||
|
MsgBox "Dashboard refreshed!" & vbCrLf & _
|
||||||
|
"- Formulas recalculated" & vbCrLf & _
|
||||||
|
"- Pivot tables updated", vbInformation, "Refresh Complete"
|
||||||
|
Exit Sub
|
||||||
|
|
||||||
|
ErrorHandler:
|
||||||
|
Application.Calculation = xlCalculationAutomatic
|
||||||
|
Application.ScreenUpdating = True
|
||||||
|
MsgBox "Error during refresh: " & Err.Description, vbCritical, "Error"
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Sub QuickRefresh()
|
||||||
|
' Silent refresh without message box
|
||||||
|
On Error GoTo ErrorHandler
|
||||||
|
|
||||||
|
Application.ScreenUpdating = False
|
||||||
|
Application.CalculateFull
|
||||||
|
|
||||||
|
Dim ws As Worksheet
|
||||||
|
Dim pt As PivotTable
|
||||||
|
For Each ws In ThisWorkbook.Worksheets
|
||||||
|
For Each pt In ws.PivotTables
|
||||||
|
pt.RefreshTable
|
||||||
|
Next pt
|
||||||
|
Next ws
|
||||||
|
|
||||||
|
Application.ScreenUpdating = True
|
||||||
|
Exit Sub
|
||||||
|
|
||||||
|
ErrorHandler:
|
||||||
|
Application.ScreenUpdating = True
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Sub RebuildAll()
|
||||||
|
' Rebuilds entire dashboard from scratch
|
||||||
|
On Error GoTo ErrorHandler
|
||||||
|
|
||||||
|
Application.ScreenUpdating = False
|
||||||
|
|
||||||
|
' Call other macros
|
||||||
|
CreatePivotTables
|
||||||
|
CreateCharts
|
||||||
|
CreateSlicers
|
||||||
|
ApplyDesign
|
||||||
|
|
||||||
|
Application.ScreenUpdating = True
|
||||||
|
MsgBox "Dashboard rebuilt entirely!", vbInformation
|
||||||
|
Exit Sub
|
||||||
|
|
||||||
|
ErrorHandler:
|
||||||
|
Application.ScreenUpdating = True
|
||||||
|
MsgBox "Error during rebuild: " & Err.Description, vbCritical, "Error"
|
||||||
|
End Sub
|
||||||
94
src/mod_Slicers.bas
Normal file
94
src/mod_Slicers.bas
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
Attribute VB_Name = "mod_Slicers"
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
' =============================================================================
|
||||||
|
' Module: mod_Slicers
|
||||||
|
' Description: Creates Slicers for interactive filtering
|
||||||
|
' =============================================================================
|
||||||
|
|
||||||
|
Sub CreateSlicers()
|
||||||
|
Dim wsDash As Worksheet
|
||||||
|
Dim wsTCD As Worksheet
|
||||||
|
Dim sc As SlicerCache
|
||||||
|
Dim sl As Slicer
|
||||||
|
Dim pt As PivotTable
|
||||||
|
|
||||||
|
On Error GoTo ErrorHandler
|
||||||
|
|
||||||
|
Set wsDash = ThisWorkbook.Sheets("Dashboard")
|
||||||
|
Set wsTCD = ThisWorkbook.Sheets("TCD_Data")
|
||||||
|
|
||||||
|
' Delete existing slicers
|
||||||
|
On Error Resume Next
|
||||||
|
Dim existingSC As SlicerCache
|
||||||
|
For Each existingSC In ThisWorkbook.SlicerCaches
|
||||||
|
existingSC.Delete
|
||||||
|
Next existingSC
|
||||||
|
On Error GoTo ErrorHandler
|
||||||
|
|
||||||
|
' Slicer 1: ClientID on TCD_CA_Client
|
||||||
|
Set pt = wsTCD.PivotTables("TCD_CA_Client")
|
||||||
|
|
||||||
|
Set sc = ThisWorkbook.SlicerCaches.Add2( _
|
||||||
|
pt, _
|
||||||
|
"ClientID", _
|
||||||
|
"Slicer_ClientID")
|
||||||
|
|
||||||
|
Set sl = sc.Slicers.Add( _
|
||||||
|
wsDash, _
|
||||||
|
, _
|
||||||
|
"ClientID", _
|
||||||
|
"Client", _
|
||||||
|
wsDash.Range("K1").Left, _
|
||||||
|
wsDash.Range("K1").Top, _
|
||||||
|
150, _
|
||||||
|
180)
|
||||||
|
|
||||||
|
sl.Style = "SlicerStyleLight1"
|
||||||
|
|
||||||
|
' Connect slicer to other pivot tables
|
||||||
|
On Error Resume Next
|
||||||
|
sc.PivotTables.AddPivotTable wsTCD.PivotTables("TCD_CA_Mois")
|
||||||
|
On Error GoTo ErrorHandler
|
||||||
|
|
||||||
|
' Slicer 2: Date on TCD_CA_Mois
|
||||||
|
Set pt = wsTCD.PivotTables("TCD_CA_Mois")
|
||||||
|
|
||||||
|
On Error Resume Next
|
||||||
|
Set sc = ThisWorkbook.SlicerCaches.Add2( _
|
||||||
|
pt, _
|
||||||
|
"Date", _
|
||||||
|
"Slicer_Date")
|
||||||
|
|
||||||
|
If Not sc Is Nothing Then
|
||||||
|
Set sl = sc.Slicers.Add( _
|
||||||
|
wsDash, _
|
||||||
|
, _
|
||||||
|
"Date", _
|
||||||
|
"Periode", _
|
||||||
|
wsDash.Range("K10").Left, _
|
||||||
|
wsDash.Range("K10").Top, _
|
||||||
|
150, _
|
||||||
|
150)
|
||||||
|
|
||||||
|
sl.Style = "SlicerStyleLight2"
|
||||||
|
End If
|
||||||
|
On Error GoTo ErrorHandler
|
||||||
|
|
||||||
|
MsgBox "Slicers created successfully!", vbInformation
|
||||||
|
Exit Sub
|
||||||
|
|
||||||
|
ErrorHandler:
|
||||||
|
MsgBox "Error creating slicers: " & Err.Description, vbCritical, "Error"
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Sub ClearSlicerFilters()
|
||||||
|
' Clears all slicer filters
|
||||||
|
Dim sc As SlicerCache
|
||||||
|
|
||||||
|
On Error Resume Next
|
||||||
|
For Each sc In ThisWorkbook.SlicerCaches
|
||||||
|
sc.ClearManualFilter
|
||||||
|
Next sc
|
||||||
|
On Error GoTo 0
|
||||||
|
End Sub
|
||||||
99
src/mod_TCD.bas
Normal file
99
src/mod_TCD.bas
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
Attribute VB_Name = "mod_TCD"
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
' =============================================================================
|
||||||
|
' Module: mod_TCD
|
||||||
|
' Description: Creates Pivot Tables for the Freelance Dashboard
|
||||||
|
' =============================================================================
|
||||||
|
|
||||||
|
Sub CreatePivotTables()
|
||||||
|
Dim ws As Worksheet
|
||||||
|
Dim pt As PivotTable
|
||||||
|
Dim pc As PivotCache
|
||||||
|
|
||||||
|
On Error GoTo ErrorHandler
|
||||||
|
|
||||||
|
' Create TCD sheet if it doesn't exist
|
||||||
|
On Error Resume Next
|
||||||
|
Set ws = ThisWorkbook.Sheets("TCD_Data")
|
||||||
|
On Error GoTo ErrorHandler
|
||||||
|
|
||||||
|
If ws Is Nothing Then
|
||||||
|
Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
|
||||||
|
ws.Name = "TCD_Data"
|
||||||
|
End If
|
||||||
|
|
||||||
|
' Clear the sheet
|
||||||
|
ws.Cells.Clear
|
||||||
|
|
||||||
|
' TCD 1: Revenue by Client
|
||||||
|
Set pc = ThisWorkbook.PivotCaches.Create( _
|
||||||
|
SourceType:=xlDatabase, _
|
||||||
|
SourceData:="tbl_Revenus")
|
||||||
|
|
||||||
|
Set pt = pc.CreatePivotTable( _
|
||||||
|
TableDestination:=ws.Range("A1"), _
|
||||||
|
TableName:="TCD_CA_Client")
|
||||||
|
|
||||||
|
With pt
|
||||||
|
.PivotFields("ClientID").Orientation = xlRowField
|
||||||
|
.PivotFields("ClientID").Position = 1
|
||||||
|
With .PivotFields("Montant")
|
||||||
|
.Orientation = xlDataField
|
||||||
|
.Function = xlSum
|
||||||
|
.NumberFormat = "# ##0 $"
|
||||||
|
.Name = "CA Total"
|
||||||
|
End With
|
||||||
|
End With
|
||||||
|
|
||||||
|
' TCD 2: Revenue by Month
|
||||||
|
Set pt = pc.CreatePivotTable( _
|
||||||
|
TableDestination:=ws.Range("E1"), _
|
||||||
|
TableName:="TCD_CA_Mois")
|
||||||
|
|
||||||
|
With pt
|
||||||
|
.PivotFields("Date").Orientation = xlRowField
|
||||||
|
.PivotFields("Date").Position = 1
|
||||||
|
With .PivotFields("Montant")
|
||||||
|
.Orientation = xlDataField
|
||||||
|
.Function = xlSum
|
||||||
|
.NumberFormat = "# ##0 $"
|
||||||
|
.Name = "CA Mensuel"
|
||||||
|
End With
|
||||||
|
End With
|
||||||
|
|
||||||
|
' Group dates by month and year
|
||||||
|
On Error Resume Next
|
||||||
|
pt.PivotFields("Date").DataRange.Cells(1).Group _
|
||||||
|
Start:=True, End:=True, _
|
||||||
|
Periods:=Array(False, False, False, False, True, False, True)
|
||||||
|
On Error GoTo ErrorHandler
|
||||||
|
|
||||||
|
' TCD 3: Hours by Project
|
||||||
|
Set pc = ThisWorkbook.PivotCaches.Create( _
|
||||||
|
SourceType:=xlDatabase, _
|
||||||
|
SourceData:="tbl_Temps")
|
||||||
|
|
||||||
|
Set pt = pc.CreatePivotTable( _
|
||||||
|
TableDestination:=ws.Range("I1"), _
|
||||||
|
TableName:="TCD_Heures_Projet")
|
||||||
|
|
||||||
|
With pt
|
||||||
|
.PivotFields("Projet").Orientation = xlRowField
|
||||||
|
.PivotFields("Projet").Position = 1
|
||||||
|
With .PivotFields("Heures")
|
||||||
|
.Orientation = xlDataField
|
||||||
|
.Function = xlSum
|
||||||
|
.NumberFormat = "0.0"
|
||||||
|
.Name = "Total Heures"
|
||||||
|
End With
|
||||||
|
End With
|
||||||
|
|
||||||
|
ws.Activate
|
||||||
|
|
||||||
|
MsgBox "3 Pivot Tables created successfully!", vbInformation, "TCD Created"
|
||||||
|
Exit Sub
|
||||||
|
|
||||||
|
ErrorHandler:
|
||||||
|
MsgBox "Error creating Pivot Tables: " & Err.Description, vbCritical, "Error"
|
||||||
|
End Sub
|
||||||
BIN
templates/FreelanceDashboard.xlsm
Normal file
BIN
templates/FreelanceDashboard.xlsm
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user