Efectivamente se puede hacer lo que preguntas, pero sin saber cómo tienes montada tu BD, sólo te puedo dar unas indicaciones, a ver si logras adaptarlo.
Esto es lo que hice hace unos años para una escuela de música, en la que al marcar en un formulario la casilla de matrícula (40 €), la de curso completo (120 €) o la de una o más de las 6 asignaturas colectivas (a 60 € cada una), se calculaba el total de la matrícula para imprimir el recibo.
Tablas:
1º/ Alumnos: donde tendrás los datos que sean de los alumnos, con un campo Clave principal.
2º/ Matriculas: con un ID (principal), el Código del alumno (Clave principal de la tabla alumnos), campo fecha, para recoger la fecha de matricula, y tantos campos de tipo Sí/No como asignaturas (en tu caso temas) tengas.
3º/ Tarifas: con esta estructura: ID (clave principal), Concepto (texto) e Importe (moneda).
En esta tabla tendrías tus distintos temas con sus precios. Podrías añadir otro campo Curso, para saber los temas que corresponden a cada curso...
Formularios:
1º/ Un formulario basado en la tabla Matrículas, en el que aparecerán los checkbox para seleccionar uno u otro concepto (temas, en tu caso).
Ahora, a cada checkbox, le generas este código es su evento "Después de actualizar" (en vista diseño del formulario, sacas las propiedades del check->pestaña Eventos->Despues de actualizar->pulsas el botón de los 3 puntos->eliges generador de código)
Private Sub ..._AfterUpdate
Call subCalculaImporte
End Sub
en vez de los ... tendrás el nombre de tu check, por ejemplo Private Sub Tema01_AfterUpdate. Este código a cada uno de los checks.
Para acabar, añades este otro código, al inicio o al final del módulo del formulario ( en el que programaste los eventos de los checks):
Private Sub subCalculaImporte
Me.txtImporte = fncMatricula(Me.Tema01, Me.Tema02, Me.Tema03, Me.Tema04, Me.Tema05, Me.Tema06, Me.Tema07, Me.Tema08, Me.Tema09, Me.Tema10)
End Sub
Este código está pensado para 10 checks llamados Tema01, Tema02..., puedes añadir más o quitar alguno según tus necesidades, teniendo en cuenta que tienes que poner los nombre que tú tengas en tu formulario.
Además, el cuadro de texto en el que se muestra el resultado se llamaría txtImporte.
Módulo:
En tu BD, insertas un módulo (lo llamaré mdlMatricula), y en él escribes esta función:
Public Function fncMatricula(ParamArray Temas()) As Currency
'Función creada por Sveinbjorn para tologo en TodoExpertos - 2014-11-07
'Declaramos las varables
Dim vImporte As Currency ' Para el precio de cada tema
Dim vMatricula As Currency ' Para ir acumulando el importe de la matricula
vMatricula = 0
For i = 0 To UBound(Temas)
'Buscamos el importe de la tasa de cada tema
vImporte = DLookup("Importe", "Tarifas", "[ID]=" & i + 1)
'Acumulamos el importe
vMatricula = vMatricula + Abs(vImporte * CInt(Nz(Temas(i), 0)))
Next i
fncMatricula = vMatricula
End Function
Te subo un mini ejemplo, para que lo veas más claro: http://filebig.net/files/gNvmMZcAkT