here is one example. I like to use public functions to implement business rules as then you can use the business rules everywhere.
Private metric As String
'encapsulating form properties in synthetic public properties using public functions has lots of advantages but is not necessary
Public Function getMetric() As String
getMetric = IIf(IsNull(metric), "default", metric)
End Function
Public Function setMetric(value) As Boolean
metric = value
setMetric = True ' calling subroutines can be confusing so pointless return value to make a function
End Function
Public Function MonthSum(Month As Integer, metric As String) As Double
Dim X, Y As Double
X = DLookup("X", "Table3", "Month = " & Month) 'need to get values from other rows so we must resort to Dlookup or correlated sub queries
Y = DLookup("Y", "Table3", "Month = " & Month)
MonthSum = IIf(metric = "x", X, IIf(metric = "y", Y, 0))
End Function
Public Function FYTD(Month As Integer, metric As String) As Double
'todo tighten this loop
Select Case Month
Case 1
FYTD = MonthSum(1, metric)
Case 2
FYTD = MonthSum(1, metric) + MonthSum(2, metric)
Case 3
FYTD = MonthSum(1, metric) + MonthSum(2, metric) + MonthSum(3, metric)
Case 4
FYTD = MonthSum(1, metric) + MonthSum(2, metric) + MonthSum(3, metric) + MonthSum(4, metric)
Case 5
FYTD = MonthSum(1, metric) + MonthSum(2, metric) + MonthSum(3, metric) + MonthSum(4, metric) + MonthSum(5, metric)
Case 6
FYTD = MonthSum(1, metric) + MonthSum(2, metric) + MonthSum(3, metric) + MonthSum(4, metric) + MonthSum(5, metric) + MonthSum(6, metric)
Case 7
FYTD = MonthSum(1, metric) + MonthSum(2, metric) + MonthSum(3, metric) + MonthSum(4, metric) + MonthSum(5, metric) + MonthSum(6, metric) + MonthSum(7, metric)
Case 8
FYTD = MonthSum(1, metric) + MonthSum(2, metric) + MonthSum(3, metric) + MonthSum(4, metric) + MonthSum(5, metric) + MonthSum(6, metric) + MonthSum(7, metric) + MonthSum(8, metric)
Case 9
FYTD = MonthSum(1, metric) + MonthSum(2, metric) + MonthSum(3, metric) + MonthSum(4, metric) + MonthSum(5, metric) + MonthSum(6, metric) + MonthSum(7, metric) + MonthSum(8, metric) + MonthSum(9, metric)
Case 10
FYTD = MonthSum(1, metric) + MonthSum(2, metric) + MonthSum(3, metric) + MonthSum(4, metric) + MonthSum(5, metric) + MonthSum(6, metric) + MonthSum(7, metric) + MonthSum(8, metric) + MonthSum(9, metric) + MonthSum(10, metric)
Case 11
FYTD = MonthSum(1, metric) + MonthSum(2, metric) + MonthSum(3, metric) + MonthSum(4, metric) + MonthSum(5, metric) + MonthSum(6, metric) + MonthSum(7, metric) + MonthSum(8, metric) + MonthSum(9, metric) + MonthSum(10, metric) + MonthSum(11, metric)
Case 12
FYTD = MonthSum(1, metric) + MonthSum(2, metric) + MonthSum(3, metric) + MonthSum(4, metric) + MonthSum(5, metric) + MonthSum(6, metric) + MonthSum(7, metric) + MonthSum(8, metric) + MonthSum(9, metric) + MonthSum(10, metric) + MonthSum(11, metric) + MonthSum(12, metric)
End Select
End Function
for this example I set metric in a combobox on a form:
Private Sub cboMetric_AfterUpdate()
setMetric (Me.cboMetric.value)
End Sub
I then use metric in a query:

When I select y in cboMetric and rerun the query I get:
