The code will demonstrate how to create a simple but customizable sales forecasting model based on historical sales data, trends, and adjustable parameters.
Goal:
We aim to create a VBA solution that can:
- Take historical sales data (e.g., monthly sales figures).
- Apply customizable forecasting methods (e.g., linear regression, moving averages).
- Allow users to adjust certain forecasting parameters (e.g., growth rate, seasonal adjustments).
- Provide a dynamic forecasting model that can be updated with new data.
- Setting Up the Sales Data Sheet
Before writing the code, let’s assume the sales data is laid out in the following manner in Excel:
| Month | Sales |
| Jan-2023 | 1000 |
| Feb-2023 | 1200 |
| Mar-2023 | 1100 |
| … | … |
| Dec-2023 | 1500 |
You will be using this historical sales data to generate forecasts for the next few months (e.g., forecasting for the next 12 months).
- Writing the VBA Code for Sales Forecasting
Step-by-Step Code Explanation:
The following VBA code will:
- Calculate simple moving averages for forecasting.
- Use linear regression for trend-based forecasting.
- Allow adjustments based on user input (e.g., forecast months, growth rate).
- Update forecasts dynamically.
VBA Code:
Sub SalesForecasting()
' Declare variables
Dim ws As Worksheet
Dim LastRow As Long
Dim i As Long
Dim ForecastMonths As Integer
Dim GrowthRate As Double
Dim MovingAvgRange As Integer
Dim HistoricalSales As Range
Dim ForecastRange As Range
Dim xData As Range, yData As Range
Dim Slope As Double, Intercept As Double
Dim PredictedSales As Double
Dim ForecastStartMonth As Long
' Set the worksheet and range for sales data
Set ws = ThisWorkbook.Sheets("SalesData")
' Find the last row of data in the Sales column
LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' Get user input for forecast months and growth rate
ForecastMonths = InputBox("Enter the number of months to forecast:")
GrowthRate = InputBox("Enter the annual growth rate as a percentage (e.g., 5 for 5%):") / 100
MovingAvgRange = InputBox("Enter the number of months for moving average calculation (e.g., 3 for 3-month average):")
' Determine the start month for forecasting
ForecastStartMonth = LastRow + 1
' Create a range for the historical sales data (Sales column)
Set HistoricalSales = ws.Range("B2:B" & LastRow)
' Loop through the data and calculate moving average for the forecast period
For i = 1 To ForecastMonths
' Calculate Moving Average for the last 'MovingAvgRange' months
If i <= MovingAvgRange Then
ws.Cells(ForecastStartMonth + i - 1, 2).Value = WorksheetFunction.Average(HistoricalSales.Cells(LastRow - MovingAvgRange + i + 1, 1))
Else
ws.Cells(ForecastStartMonth + i - 1, 2).Value = WorksheetFunction.Average(HistoricalSales.Cells(LastRow - MovingAvgRange + i, 1))
End If
Next i
' Now, calculate Linear Regression Trendline Forecast
' Set xData (Months) and yData (Sales)
Set xData = ws.Range("A2:A" & LastRow)
Set yData = ws.Range("B2:B" & LastRow)
' Calculate the Slope and Intercept of the linear regression
Slope = Application.WorksheetFunction.Slope(yData, xData)
Intercept = Application.WorksheetFunction.Intercept(yData, xData)
' Create Forecast using Linear Regression
For i = 1 To ForecastMonths
' Predicted Sales = Slope * Month + Intercept
PredictedSales = Slope * (LastRow + i) + Intercept
ws.Cells(ForecastStartMonth + i - 1, 3).Value = PredictedSales
Next i
' Apply Growth Rate Adjustment to the forecasted values (if user provided a growth rate)
If GrowthRate > 0 Then
For i = 1 To ForecastMonths
ws.Cells(ForecastStartMonth + i - 1, 3).Value = ws.Cells(ForecastStartMonth + i - 1, 3).Value * (1 + GrowthRate)
Next i
End If
MsgBox "Sales Forecasting is complete!"
End Sub
- Detailed Explanation of the Code
- Worksheet Setup:
- We start by setting the worksheet (SalesData) and determining the last row of sales data. This helps us identify the range of historical data.
- User Inputs:
- We use the InputBox function to gather user inputs for the number of months to forecast (ForecastMonths), the growth rate (GrowthRate), and the moving average window (MovingAvgRange).
- Moving Average Forecasting:
- The code calculates a simple moving average of the last MovingAvgRange months for the forecast period.
- If there’s not enough data to calculate the moving average (for example, when the forecast period is shorter than the moving average window), it uses as many months as available.
- Linear Regression for Trend Forecasting:
- We use Excel’s built-in SLOPE and INTERCEPT functions to compute the linear regression equation based on historical sales data.
- This equation is then used to forecast sales in the future based on the trend.
- Growth Rate Adjustment:
- If the user provides a growth rate, the forecasted values are adjusted upward by this percentage, simulating an overall growth in sales.
- Final Output:
- The forecasted sales are output to the worksheet starting from the row after the last historical data point.
- Customization Options
This basic model can be customized in several ways:
- Alternative Forecasting Models:
- You can incorporate other forecasting models, such as exponential smoothing or ARIMA, if you need more advanced forecasting methods.
- Seasonal Adjustments:
- You can modify the code to include seasonal adjustments. For example, if certain months have consistently higher or lower sales, you can create a seasonal factor based on historical data and adjust your forecasts accordingly.
- Dynamic Data Ranges:
- Instead of hard-coding column ranges, you can dynamically select data based on user input or a configuration sheet to make the solution more flexible.
- Graphing Forecasts:
- You can add chart generation functionality to visually present the forecast data alongside the historical data.
- Conclusion
This Excel VBA solution gives you a flexible way to forecast sales based on historical data, simple linear regression, and moving averages. It can be expanded or customized to fit more complex needs, including more advanced statistical models or seasonal adjustments. By allowing for easy user input and adjustments, it can be adapted to various business contexts.