Muchas gracias, ya conseguí solucionar el primer problema, se debía a la propiedad LoginPrompt del ADOConnection que por defecto está a true.
El error que me da ahora estoy casi segura de que es por la sentencia SQL, la he probado dentro de Access y sin problemas. ¿Será que no interpreta el INNER JOIN? Os la pongo aquí a ver si me podéis echar otra manita
SELECT Sum(IIf(IsNull(g.exrate),gp.total_inv,(gp.total_inv)/g.exrate)) AS INVERSION,
Sum(IIf(IsNull(g.exrate),gp.total_ganado-gp.total_inv,(gp.total_ganado-gp.total_inv)/g.exrate)) AS BENEFICIO, (BENEFICIO/INVERSION)*100 AS MARGEN, Format(g.date'yyyy') & ", " & Format(g.date,'mm') AS meses
FROM tabla1 AS g
INNER JOIN tabla2 AS gp
ON g.id = gp.id
WHERE gp.id = (select prefer_valot from prefs where pref_key = 'PRIN')
GROUP BY Format(g.date,'yyyy') & ", " & Format(g.date,'mm')
ORDER BY Min(g.date);