Microsoft Excel Mastery

Part XI: Capstone Projects

10 industry-grade capstone projects with VBA automation, dashboards, pivot tables, charts, and comprehensive assessment rubrics. Plus glossary, certification prep, interview questions & 90+ bonus project ideas.

🏗️ 10 Capstone Projects  |  📊 50+ Formulas  |  🤖 VBA Automation  |  📝 100+ Glossary Terms

Capstone Project 1

🏫 School Management System

Real-World Scenario

Greenfield Public School (CBSE-affiliated, Delhi) has 1,200 students across Classes I–XII. The administration currently maintains records in paper registers, leading to errors in fee tracking, lost attendance records, and delayed result processing. You are hired to build a comprehensive Excel-based School Management System that handles student registration, class allocation, fee collection, attendance tracking, and exam result management — all interlinked.

📋 Learning Objectives

  • Design a multi-sheet relational database structure in Excel
  • Use VLOOKUP, INDEX-MATCH to link data across sheets
  • Build dynamic dashboards with COUNTIFS, SUMIFS
  • Create a VBA UserForm for data entry with validation
  • Apply conditional formatting for visual alerts

📊 Dataset Description & Sheet Structure

The workbook consists of 5 interlinked sheets plus a Dashboard sheet:

Sheet 1: Students (Master Data)

StudentIDNameClassSectionDOBGenderFather's NamePhoneAddressAdmission Date
GFS001Aarav Sharma10A15-Mar-2010MRajesh Sharma9876543210Dwarka, Delhi01-Apr-2020
GFS002Priya Gupta10A22-Jul-2010FAmit Gupta9876543211Rohini, Delhi01-Apr-2020
GFS003Rohan Patel9B08-Nov-2011MSuresh Patel9876543212Janakpuri, Delhi01-Apr-2021
GFS004Ananya Singh10B30-Jan-2010FVikram Singh9876543213Pitampura, Delhi01-Apr-2019
GFS005Karan Mehta9A14-Sep-2011MDinesh Mehta9876543214Vasant Kunj, Delhi01-Apr-2021

Sheet 2: Classes (Structure)

ClassSectionClass TeacherRoom NoMax CapacityCurrent Strength
9AMrs. Sunita Verma2014542
9BMr. Rakesh Kumar2024540
10AMrs. Kavita Joshi3014544
10BMr. Ashok Tiwari3024543

Sheet 3: Fees

StudentIDFee TypeAmountDue DatePaid DateStatusPayment Mode
GFS001Tuition Q11500015-Apr-202410-Apr-2024PaidOnline
GFS001Tuition Q21500015-Jul-202420-Jul-2024Paid (Late)Cash
GFS002Tuition Q11500015-Apr-202412-Apr-2024PaidOnline
GFS003Tuition Q11500015-Apr-2024Pending
GFS004Transport500015-Apr-202415-Apr-2024PaidCheque

Sheet 4: Attendance

StudentIDDateStatusRemarks
GFS00101-Jul-2024P
GFS00102-Jul-2024ASick Leave
GFS00201-Jul-2024P
GFS00301-Jul-2024LFamily Function

Sheet 5: Results

StudentIDExamEnglishHindiMathsScienceSSTTotalPercentageGradeRank
GFS001Mid-Term857892887641983.8%A2
GFS002Mid-Term908578828842384.6%A1
GFS004Mid-Term726865707434969.8%B3

🔧 Design — Sheet Layout Plan

Create a workbook named GFS_School_Management.xlsx with the following sheet tabs (colour-coded):

Sheet NameTab ColourPurposeKey Columns
Dashboard🟢 GreenKPI summary with chartsAuto-calculated metrics
Students🔵 BlueMaster student dataStudentID (Primary Key)
Classes🟡 YellowClass structure & teachersClass+Section (Composite Key)
Fees🔴 RedFee recordsStudentID (Foreign Key)
Attendance🟠 OrangeDaily attendance logStudentID + Date
Results🟣 PurpleExam marks & gradesStudentID + Exam

📐 Key Formulas Used

VLOOKUP — Fetch Student Name from ID
=VLOOKUP(A2, Students!A:J, 2, FALSE)
Looks up the StudentID in column A of the Fees/Attendance/Results sheet and returns the student's name from the Students master sheet. The FALSE parameter ensures exact match.
COUNTIFS — Count Students Per Class
=COUNTIFS(Students!C:C, "10", Students!D:D, "A")
Counts students in Class 10, Section A. Used on the Dashboard to show class-wise strength. Example: Returns 2 for our sample data (GFS001 and GFS002).
SUMIFS — Total Fee Collection by Status
=SUMIFS(Fees!C:C, Fees!F:F, "Paid")
Sums the Amount column where Status = "Paid". For our sample: ₹15,000 + ₹15,000 + ₹15,000 + ₹5,000 = ₹50,000 collected.
IF with COUNTIFS — Attendance Percentage
=COUNTIFS(Attendance!A:A, A2, Attendance!C:C, "P") / COUNTIFS(Attendance!A:A, A2, Attendance!C:C, "<>") * 100
Calculates attendance percentage for each student. For GFS001: 1 Present out of 2 total days = 50%. Conditional formatting highlights <75% in red.
IFS — Grade Calculation
=IFS(I2>=90,"A+", I2>=80,"A", I2>=70,"B+", I2>=60,"B", I2>=50,"C", I2>=33,"D", TRUE,"Fail")
Assigns grades based on percentage. GFS001 at 83.8% gets "A", GFS002 at 84.6% gets "A", GFS004 at 69.8% gets "B+".

📊 Pivot Tables

  1. Class-wise Student Count: Rows = Class, Columns = Section, Values = Count of StudentID
  2. Fee Collection Summary: Rows = Fee Type, Columns = Status, Values = Sum of Amount
  3. Monthly Attendance Summary: Rows = StudentID+Name, Columns = Month, Values = Count of "P" status
  4. Subject-wise Average Marks: Rows = Class, Values = Average of each subject column

📈 Charts

  • Bar Chart: Class-wise student strength (clustered by section)
  • Pie Chart: Fee collection status distribution (Paid vs Pending vs Late)
  • Line Chart: Monthly attendance trend per class
  • Column Chart: Subject-wise average marks comparison across classes

🖥️ Dashboard Layout

[Screenshot: Dashboard with 4 KPI cards at top — Total Students, Fee Collection %, Average Attendance %, Pass Percentage — followed by 4 charts arranged in 2×2 grid]

The Dashboard sheet contains:

  • Row 1-3: School header with logo placeholder, date, academic year
  • Row 5-8: 4 KPI cards — Total Students (=COUNTA(Students!A:A)-1), Total Fee Collected, Overall Attendance %, Overall Pass %
  • Row 10-25: Left — Class strength bar chart; Right — Fee status pie chart
  • Row 27-42: Left — Attendance trend line chart; Right — Subject average column chart

🤖 VBA Automation — Student Data Entry Form

VBA
' === UserForm: frmStudentEntry ===
' Controls: txtStudentID, txtName, cmbClass, cmbSection,
'           txtDOB, cmbGender, txtFatherName, txtPhone, txtAddress
'           btnSave, btnClear, btnClose

Private Sub UserForm_Initialize()
    ' Auto-generate next StudentID
    Dim lastRow As Long
    lastRow = Sheets("Students").Cells(Rows.Count, 1).End(xlUp).Row
    If lastRow = 1 Then
        txtStudentID.Value = "GFS001"
    Else
        Dim lastID As String
        lastID = Sheets("Students").Cells(lastRow, 1).Value
        Dim nextNum As Long
        nextNum = CLng(Mid(lastID, 4)) + 1
        txtStudentID.Value = "GFS" & Format(nextNum, "000")
    End If
    txtStudentID.Enabled = False

    ' Populate Class dropdown
    Dim cls As Variant
    For Each cls In Array(1,2,3,4,5,6,7,8,9,10,11,12)
        cmbClass.AddItem cls
    Next
    ' Populate Section dropdown
    cmbSection.AddItem "A"
    cmbSection.AddItem "B"
    cmbSection.AddItem "C"
    ' Populate Gender
    cmbGender.AddItem "M"
    cmbGender.AddItem "F"
End Sub

Private Sub btnSave_Click()
    ' Validation
    If txtName.Value = "" Then
        MsgBox "Student Name is required!", vbExclamation
        txtName.SetFocus: Exit Sub
    End If
    If cmbClass.Value = "" Then
        MsgBox "Please select a Class!", vbExclamation
        Exit Sub
    End If
    If Not IsDate(txtDOB.Value) Then
        MsgBox "Enter valid Date of Birth (DD-MMM-YYYY)!", vbExclamation
        txtDOB.SetFocus: Exit Sub
    End If
    If Len(txtPhone.Value) <> 10 Or Not IsNumeric(txtPhone.Value) Then
        MsgBox "Enter valid 10-digit phone number!", vbExclamation
        txtPhone.SetFocus: Exit Sub
    End If

    ' Save to Students sheet
    Dim ws As Worksheet
    Set ws = Sheets("Students")
    Dim nr As Long
    nr = ws.Cells(Rows.Count, 1).End(xlUp).Row + 1

    ws.Cells(nr, 1).Value = txtStudentID.Value
    ws.Cells(nr, 2).Value = txtName.Value
    ws.Cells(nr, 3).Value = CLng(cmbClass.Value)
    ws.Cells(nr, 4).Value = cmbSection.Value
    ws.Cells(nr, 5).Value = CDate(txtDOB.Value)
    ws.Cells(nr, 6).Value = cmbGender.Value
    ws.Cells(nr, 7).Value = txtFatherName.Value
    ws.Cells(nr, 8).Value = txtPhone.Value
    ws.Cells(nr, 9).Value = txtAddress.Value
    ws.Cells(nr, 10).Value = Date  ' Admission Date = Today

    MsgBox "Student " & txtName.Value & " registered successfully!" & vbCrLf & _
           "ID: " & txtStudentID.Value, vbInformation
    btnClear_Click  ' Reset form
End Sub

Private Sub btnClear_Click()
    txtName.Value = ""
    cmbClass.Value = ""
    cmbSection.Value = ""
    txtDOB.Value = ""
    cmbGender.Value = ""
    txtFatherName.Value = ""
    txtPhone.Value = ""
    txtAddress.Value = ""
    ' Regenerate next ID
    UserForm_Initialize
End Sub

📝 Step-by-Step Implementation Guide

  1. Create Workbook: Open Excel → Save As GFS_School_Management.xlsm (Macro-Enabled)
  2. Create Sheets: Add 6 sheets — Dashboard, Students, Classes, Fees, Attendance, Results. Colour-code each tab.
  3. Set Up Students Sheet: Enter headers in Row 1. Apply Data Validation — Class (List: 1-12), Section (List: A,B,C), Gender (List: M,F). Format DOB column as Date.
  4. Set Up Classes Sheet: Enter class structure. Use =COUNTIFS(Students!C:C, A2, Students!D:D, B2) for Current Strength column.
  5. Set Up Fees Sheet: Add headers. Use =VLOOKUP(A2,Students!A:B,2,FALSE) in column B for auto-name lookup. Add Data Validation for Status (Paid/Pending/Late) and Payment Mode (Cash/Online/Cheque).
  6. Set Up Attendance Sheet: Add headers. Use Data Validation for Status (P/A/L). Apply Conditional Formatting: P=Green, A=Red, L=Yellow.
  7. Set Up Results Sheet: Add subject columns. Calculate Total with =SUM(C2:G2), Percentage with =H2/500*100, Grade using IFS formula, Rank using =RANK(H2, H$2:H$100).
  8. Build Pivot Tables: Insert → PivotTable for each summary. Place on Dashboard sheet.
  9. Create Charts: Insert charts from pivot data. Format with school colors.
  10. Build Dashboard: Arrange KPI cards and charts. Add school header. Freeze panes at Row 4.
  11. Create VBA Form: Alt+F11 → Insert → UserForm. Add controls and paste code above.
  12. Add Macro Button: On Students sheet, Insert → Button → Assign Macro frmStudentEntry.Show.
[Screenshot: Completed Dashboard showing KPI cards, charts, and school branding]

✅ Final Deliverables Checklist

  • Students master sheet with 50+ sample records and data validation
  • Classes sheet with auto-calculated current strength
  • Fees sheet with VLOOKUP-linked student names and payment tracking
  • Attendance sheet with conditional formatting (P/A/L color codes)
  • Results sheet with auto-calculated Total, Percentage, Grade, Rank
  • Dashboard with 4 KPI cards and 4 charts
  • Working VBA Student Entry Form with validation
  • At least 2 Pivot Tables with slicers
  • Print-ready report card format on a separate sheet

📋 Assessment Rubric

CriteriaExcellent (5)Good (4)Average (3)Needs Work (1-2)Marks
Data Structure & DesignAll 5 sheets properly linked, normalized data4 sheets linked correctly3 sheets with some linkingSheets not linked/5
Formulas & FunctionsVLOOKUP, COUNTIFS, SUMIFS, IFS, RANK all working4 formula types used correctly3 formula typesBasic formulas only/5
Dashboard & Charts4 KPIs + 4 charts, professional layout3 KPIs + 3 charts2 KPIs + 2 chartsNo dashboard/5
VBA UserFormFull form with validation, auto-IDForm works with partial validationBasic form, no validationNo VBA/5
Data Validation & FormattingAll dropdowns, conditional formatting, protectionMost validations appliedSome validationsNo validation/5
Total/25
Allow 8-10 class hours for this project. Have students enter at least 50 student records to make pivot tables meaningful. Encourage peer review of dashboards. This project integrates skills from Parts I through X.
Capstone Project 2

📝 Student Result Management System

Real-World Scenario

Saraswati Vidya Mandir, a CBSE school in Jaipur with 800 students (Classes IX–XII), needs a system to process board exam results. The system must handle multi-subject marks entry, implement the CBSE 9-point grading system, generate rank lists, calculate percentiles, and produce individual report cards that can be exported as PDFs — all automated via Excel and VBA.

📋 Learning Objectives

  • Implement the CBSE 9-point grading scale using IFS
  • Use RANK, PERCENTILE, and LARGE for rank generation
  • Master INDEX-MATCH for flexible data retrieval
  • Create a print-ready report card template
  • Automate PDF report card generation with VBA

📊 Dataset Description

Sheet: MarksEntry

RollNoNameClassEnglishHindiMathsScienceSSTComputerTotal%CGPA
1001Arjun RajputX-A89769588829152186.839.0
1002Sneha AgarwalX-A92887480908550984.838.8
1003Vikash YadavX-B65584255604832854.675.8
1004Nisha SharmaX-A78828590768849983.178.6
1005Rahul JainX-B45383035422821836.334.0

CBSE 9-Point Grading Scale

Marks RangeGradeGrade PointDescription
91–100A110Outstanding
81–90A29Excellent
71–80B18Very Good
61–70B27Good
51–60C16Above Average
41–50C25Average
33–40D4Below Average
21–32E13Needs Improvement
0–20E22Unsatisfactory

📐 Key Formulas

IFS — CBSE Grade Assignment
=IFS(D2>=91,"A1", D2>=81,"A2", D2>=71,"B1", D2>=61,"B2", D2>=51,"C1", D2>=41,"C2", D2>=33,"D", D2>=21,"E1", TRUE,"E2")
Applied to each subject column individually. For Arjun's English (89): returns "A2". For Vikash's Maths (42): returns "C2".
RANK — Class Rank
=RANK(J2, J$2:J$201, 0)
Ranks students by Total marks in descending order. The 0 parameter means highest score = Rank 1. For our data: Arjun (521) = Rank 1, Sneha (509) = Rank 2.
PERCENTILE — Find Cut-off Marks
=PERCENTILE(J2:J201, 0.9)
Returns the 90th percentile total marks — useful for identifying top 10% students. Also used: =PERCENTRANK(J$2:J$201, J2) to find each student's percentile rank.
INDEX-MATCH — Lookup Student Result
=INDEX(MarksEntry!D2:I200, MATCH(ReportCard!B3, MarksEntry!A2:A200, 0), 1)
On the ReportCard sheet, when you enter a Roll Number in B3, this fetches the English marks. Change the last parameter (1→2→3...) for each subject column. More flexible than VLOOKUP as column order doesn't matter.

📊 Charts

  • Bar Chart: Subject-wise class average marks — shows which subjects need improvement
  • Pie Chart: Grade distribution — proportion of A1, A2, B1, B2, etc.
  • Column Chart: Section-wise comparison (X-A vs X-B average) for each subject
  • Histogram: Total marks frequency distribution (bins: 0-100, 101-200, ... 501-600)

🤖 VBA — Auto-Generate Report Cards & Export PDF

VBA
Sub GenerateAllReportCards()
    Dim wsMarks As Worksheet, wsReport As Worksheet
    Set wsMarks = Sheets("MarksEntry")
    Set wsReport = Sheets("ReportCard")

    Dim lastRow As Long
    lastRow = wsMarks.Cells(Rows.Count, 1).End(xlUp).Row
    Dim savePath As String
    savePath = ThisWorkbook.Path & "\ReportCards\"

    ' Create folder if not exists
    If Dir(savePath, vbDirectory) = "" Then MkDir savePath

    Dim i As Long
    For i = 2 To lastRow
        ' Populate Report Card
        wsReport.Range("B3").Value = wsMarks.Cells(i, 1).Value  ' RollNo
        wsReport.Range("B4").Value = wsMarks.Cells(i, 2).Value  ' Name
        wsReport.Range("B5").Value = wsMarks.Cells(i, 3).Value  ' Class

        ' Marks (fetched via INDEX-MATCH formulas already in sheet)
        wsReport.Calculate

        ' Export as PDF
        Dim fileName As String
        fileName = savePath & wsMarks.Cells(i, 1).Value & "_" & _
                   Replace(wsMarks.Cells(i, 2).Value, " ", "_") & ".pdf"

        wsReport.ExportAsFixedFormat Type:=xlTypePDF, _
            fileName:=fileName, Quality:=xlQualityStandard, _
            IncludeDocProperties:=True, IgnorePrintAreas:=False

        Application.StatusBar = "Generated: " & i - 1 & " of " & lastRow - 1
    Next i

    Application.StatusBar = False
    MsgBox lastRow - 1 & " Report Cards exported to:" & vbCrLf & savePath, vbInformation
End Sub

✅ Final Deliverables

  • MarksEntry sheet with 50+ student records, all formulas for grades, totals, ranks
  • GradeScale reference sheet with CBSE 9-point mapping
  • ReportCard template sheet with INDEX-MATCH formulas, school header, and print layout
  • Analysis sheet with subject-wise averages, pass/fail counts, topper lists
  • 4 charts: subject average bar, grade pie, section comparison, histogram
  • VBA macro to auto-generate and export PDF report cards

📋 Assessment Rubric

CriteriaExcellent (5)Good (4)Average (3)Needs Work (1-2)Marks
CBSE Grading ImplementationAll 9 grades correctly assigned, CGPA calculatedGrades correct, minor CGPA errorsSome grade boundaries wrongGrading not implemented/5
Statistical AnalysisRANK, PERCENTILE, AVERAGE, STDEV all used3 statistical functions used2 functionsOnly SUM/AVERAGE/5
Report Card DesignProfessional print-ready layout with school headerGood layout, minor alignment issuesBasic layoutNo report card/5
Charts & Visualization4+ meaningful charts with formatting3 charts2 charts1 or no charts/5
VBA PDF ExportBatch export all report cards as PDFSingle report card export worksVBA code with errorsNo VBA/5
Total/25
This project is ideal for Classes 11-12 Computer Science students. The CBSE grading system gives real-world relevance. Have students test with edge cases: exactly 33 marks (pass boundary), exactly 91 marks (A1 boundary). Discuss PERCENTILE vs PERCENTRANK difference.