Claude Code Plugins

Community-maintained marketplace

Feedback

excel-vba-refactoring

@CBoser/ConstructionPlatform
0
0

Comprehensive guide for refactoring and modernizing Excel VBA projects. Use when users need to clean up legacy VBA code, implement modular architecture, add error handling, create working mode systems, transition from color-based to field-based status management, implement centralized configuration, add validation and business rules, or prepare VBA projects for future migration to web platforms.

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name excel-vba-refactoring
description Comprehensive guide for refactoring and modernizing Excel VBA projects. Use when users need to clean up legacy VBA code, implement modular architecture, add error handling, create working mode systems, transition from color-based to field-based status management, implement centralized configuration, add validation and business rules, or prepare VBA projects for future migration to web platforms.

Excel VBA Project Refactoring & Modernization

This skill provides comprehensive guidance for refactoring legacy Excel VBA projects into maintainable, modular, and robust systems.

Core Refactoring Patterns

1. Modular Architecture with Constants

Problem: Hardcoded values scattered across modules, inconsistent naming, brittle code.

Solution: Create a central constants module that acts as single source of truth.

'====================================================================
' MODULE: mod_Constants
' PURPOSE: Central configuration for all modules
'====================================================================
Option Explicit

' Sheet names (prevents typos across modules)
Public Const SHEET_WHITEBOARD As String = "WHITE BOARD"
Public Const SHEET_UPCOMING As String = "Upcoming Packs"
Public Const SHEET_COMPLETED As String = "Completed Packs"
Public Const SHEET_ARCHIVE As String = "Archive"

' Status definitions
Public Const STATUS_NOTDONE As String = "Not Done"
Public Const STATUS_UPCOMING As String = "Upcoming Orders"
Public Const STATUS_READYTOWRITE As String = "Ready to Write"
Public Const STATUS_SCHEDULED As String = "Scheduled"
Public Const STATUS_SHIPPED As String = "Shipped/Done"

' Global settings
Public DEBUG_MODE As Boolean
Public CORRELATION_ID As String

' Initialize settings on workbook open
Public Sub InitGlobalSettings()
    DEBUG_MODE = False
    CORRELATION_ID = GenerateCorrelationID()
    EnsureConfigSheet
End Sub

' Generate unique tracking ID
Private Function GenerateCorrelationID() As String
    GenerateCorrelationID = Format(Now, "YYYYMMDD_HHNNSS") & "_" & _
                           Right("000" & Int(Rnd * 1000), 3)
End Function

' Ensure config sheet exists for status colors
Private Sub EnsureConfigSheet()
    Dim ws As Worksheet
    On Error Resume Next
    Set ws = ThisWorkbook.Worksheets("Config")
    On Error GoTo 0
    
    If ws Is Nothing Then
        Set ws = ThisWorkbook.Worksheets.Add
        ws.Name = "Config"
        ws.Visible = xlSheetVeryHidden
        
        ' Set up status color configuration
        ws.Cells(1, 1).Value = "Status"
        ws.Cells(1, 2).Value = "Red"
        ws.Cells(1, 3).Value = "Green"
        ws.Cells(1, 4).Value = "Blue"
        
        ' Default colors
        ws.Cells(2, 1).Value = STATUS_NOTDONE
        ws.Cells(2, 2).Value = 255: ws.Cells(2, 3).Value = 0: ws.Cells(2, 4).Value = 0
        
        ws.Cells(3, 1).Value = STATUS_SCHEDULED
        ws.Cells(3, 2).Value = 255: ws.Cells(3, 3).Value = 255: ws.Cells(3, 4).Value = 0
        
        ws.Cells(4, 1).Value = STATUS_SHIPPED
        ws.Cells(4, 2).Value = 146: ws.Cells(4, 3).Value = 208: ws.Cells(4, 4).Value = 80
    End If
End Sub

Usage: Import this module first, then update all other modules to use constants instead of hardcoded strings.

2. Standardized Error Handling

Problem: Inconsistent error handling, difficult debugging, silent failures.

Solution: Implement consistent error handling pattern with correlation IDs.

'====================================================================
' MODULE: mod_Utilities
' PURPOSE: Common utility functions
'====================================================================
Option Explicit

' Standard error handler with logging
Public Sub LogError(moduleName As String, procedureName As String, _
                   errNumber As Long, errDescription As String)
    Dim errorMsg As String
    errorMsg = "ERROR [" & CORRELATION_ID & "] " & _
               "Module: " & moduleName & " | " & _
               "Procedure: " & procedureName & " | " & _
               "Error #" & errNumber & ": " & errDescription & " | " & _
               "Time: " & Format(Now, "YYYY-MM-DD HH:NN:SS")
    
    ' Write to immediate window
    Debug.Print errorMsg
    
    ' Write to system log sheet
    WriteToSysLog moduleName, procedureName, errDescription, "ERROR"
    
    ' Show user-friendly message
    MsgBox "An error occurred in " & moduleName & "." & vbNewLine & _
           "Error: " & errDescription & vbNewLine & vbNewLine & _
           "Correlation ID: " & CORRELATION_ID & vbNewLine & _
           "Please save this ID for troubleshooting.", _
           vbCritical, "Error"
End Sub

' Write to system log
Public Sub WriteToSysLog(moduleName As String, procedureName As String, _
                        message As String, logLevel As String)
    On Error Resume Next
    Dim ws As Worksheet
    Set ws = GetOrCreateSheet("SysLog")
    
    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
    
    ws.Cells(lastRow, 1).Value = Format(Now, "YYYY-MM-DD HH:NN:SS")
    ws.Cells(lastRow, 2).Value = CORRELATION_ID
    ws.Cells(lastRow, 3).Value = logLevel
    ws.Cells(lastRow, 4).Value = moduleName
    ws.Cells(lastRow, 5).Value = procedureName
    ws.Cells(lastRow, 6).Value = message
    On Error GoTo 0
End Sub

' Helper function to get or create sheet
Private Function GetOrCreateSheet(sheetName As String) As Worksheet
    On Error Resume Next
    Set GetOrCreateSheet = ThisWorkbook.Worksheets(sheetName)
    On Error GoTo 0
    
    If GetOrCreateSheet Is Nothing Then
        Set GetOrCreateSheet = ThisWorkbook.Worksheets.Add
        GetOrCreateSheet.Name = sheetName
        GetOrCreateSheet.Visible = xlSheetVeryHidden
    End If
End Function

' Example usage in any procedure
Sub ExampleProcedure()
    On Error GoTo ErrorHandler
    
    ' Your code here
    WriteToSysLog "mod_Example", "ExampleProcedure", "Process started", "INFO"
    
    ' More code...
    
    WriteToSysLog "mod_Example", "ExampleProcedure", "Process completed", "INFO"
    Exit Sub
    
ErrorHandler:
    LogError "mod_Example", "ExampleProcedure", Err.Number, Err.Description
End Sub

3. Sheet Locking & Working Mode System

Problem: Users editing wrong sheets simultaneously, data corruption, lost work.

Solution: Implement a working mode system that prevents conflicting edits. See references/working-mode-system.md for complete implementation.

Key functions:

  • ToggleWhiteboardWorkingMode() - Activate/deactivate working mode
  • IsSheetAccessible(sheetName) - Check if sheet can be edited
  • Visual indicators show working mode status

Always add working mode checks before data modification:

If Not IsSheetAccessible(SHEET_WHITEBOARD) Then Exit Sub

4. Transitioning from Color-Based to Field-Based Status

Problem: Status determined by cell colors is error-prone and unmaintainable.

Solution: Add explicit Status column while maintaining backward compatibility. See references/status-migration-guide.md for detailed steps.

Key steps:

  1. Add Status column to sheets
  2. Migrate existing color data to Status field
  3. Update code to use Status field instead of colors
  4. Add data validation dropdowns
' OLD WAY - Color based
If ws.Cells(i, col).Interior.Color = RGB(255, 255, 0) Then
    ' Handle scheduled status
End If

' NEW WAY - Field based
If ws.Cells(i, 4).Value = STATUS_SCHEDULED Then
    ' Handle scheduled status
End If

5. Business Rules & Validation (Guardrails)

Problem: Invalid data entered, broken business logic, inconsistent state.

Solution: Implement validation functions that enforce business rules. See references/validation-patterns.md for complete patterns.

Example validation:

' Validate that scheduled jobs have order numbers
Public Function ValidateScheduledHasOrderNumber(entries() As Variant) As Boolean
    For i = 1 To UBound(entries)
        If entries(i).NewStatus = STATUS_SCHEDULED Then
            If Trim(entries(i).OrderNumber) = "" Then
                MsgBox "Job cannot be scheduled without Order Number", vbExclamation
                ValidateScheduledHasOrderNumber = False
                Exit Function
            End If
        End If
    Next i
    ValidateScheduledHasOrderNumber = True
End Function

Implementation Workflow

When refactoring an existing VBA project, follow this sequence:

Phase 1: Foundation (Week 1-2)

  1. Create mod_Constants with all hardcoded values
  2. Add InitGlobalSettings() to Workbook_Open()
  3. Update all modules to use constants instead of literals
  4. Add mod_Utilities with error handling framework
  5. Add error handlers to all existing procedures

Phase 2: Status Migration (Week 3-4)

  1. Add Status column to sheets
  2. Migrate existing color data to Status
  3. Update all procedures to read Status field
  4. Add data validation dropdowns
  5. Test thoroughly

Phase 3: Working Mode (Week 5-6)

  1. Add mod_WorkingMode module
  2. Create working mode toggle buttons
  3. Add IsSheetAccessible() checks
  4. Test with multiple users
  5. Train users

Phase 4: Validation (Week 7-8)

  1. Document business rules
  2. Create validation functions
  3. Add validation calls before commits
  4. Test edge cases

Phase 5: Database Structures (Week 9-10)

  1. Create Customer database
  2. Create Community database
  3. Create Plan database
  4. Add lookup functions
  5. Create data entry forms

Best Practices

Code Organization

  • One module per major functional area
  • Modules should be < 500 lines
  • Use clear, descriptive names: mod_DataExtraction not Module1
  • Group related constants together with comments

Naming Conventions

  • Constants: UPPER_CASE_WITH_UNDERSCORES
  • Public procedures: PascalCase
  • Private procedures: PascalCase
  • Variables: camelCase
  • Type definitions: PascalCase (suffix with Type)

Error Handling

  • Always use On Error GoTo ErrorHandler in public procedures
  • Log errors with correlation IDs
  • Provide user-friendly error messages
  • Write to system log for debugging

Testing Strategy

  • Test with real data before deployment
  • Create a test copy of the workbook
  • Test all error paths and validations
  • Test with multiple users for locking
  • Document test cases

Common Pitfalls

  1. Breaking Backward Compatibility: Keep both systems (color and status) running temporarily
  2. Forgetting Error Handlers: Every public procedure needs error handling
  3. Not Testing with Multiple Users: Locking must be tested concurrently
  4. Hardcoding Sheet Names: Always use constants
  5. Overcomplicating Validations: Start simple, add complexity incrementally

Quick Reference

' Always start with these in Workbook_Open
Private Sub Workbook_Open()
    InitGlobalSettings          ' Initialize constants and settings
    LoadWorkingModeStatus       ' Load working mode state
    CreateWorkingModeIndicators ' Create visual indicators
    WriteToSysLog "Workbook", "Open", "Workbook opened", "INFO"
End Sub

' Always add to data modification procedures
If Not IsSheetAccessible(SHEET_WHITEBOARD) Then Exit Sub

' Always use constants
ws.Name = SHEET_UPCOMING  ' YES
ws.Name = "Upcoming Packs" ' NO

' Always handle errors
On Error GoTo ErrorHandler
' ... code ...
Exit Sub
ErrorHandler:
    LogError "ModuleName", "ProcedureName", Err.Number, Err.Description

Additional Resources

  • references/working-mode-system.md - Complete working mode implementation
  • references/status-migration-guide.md - Step-by-step status migration
  • references/validation-patterns.md - Common validation patterns and examples
  • references/database-design.md - Database structure patterns for VBA