Как насчет этого:
Public Function iSum(ParamArray p()) As Variant
Dim i As Long
Dim lngUBound As Long
Dim v As Variant
v = Nz(p(LBound(p)), 0)
lngUBound = UBound(p)
For i = LBound(p) + 1 To lngUBound
If Not IsNull(p(i)) Then
v = v + p(i)
End If
Next
If IsNull(v) Then
v = 0
End If
iSum = v
End Function
И в SQL:
SELECT col1, col2, col3, iSum(col1,col2,col3) As Sum
FROM Table
Вы можете передать любое количество столбцов, и не имеет значения, являются ли они пустыми. Если все имеют значение Null, возвращается 0.