La butto li
Provare a creare una tabella temporanea dove aggiungi dinamicamente le colonne che ti servono da codice sfruttando la proprietà del recordset .fields.count per sapere quanti campi aggiungere.
una cosa tipo questa
Dim tdf As DAO.TableDef
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset
dim RstOutput As DAO.Recordset
dim i as integer
Set qdf = db.QueryDefs("Nome query a campi incrociati") ' Apri il recordset della query passandogli i relativi parametri
qdf.Parameters("parametro1") = xxxx
qdf.Parameters("parametro2") = yyyy
....
qdf.Parameters("parametron") = nnn
Set rst = qdf.OpenRecordset(dbOpenSnapshot)
Set tdf = CurrentDb.CreateTableDef("Nome tabella") ' Crei la nuova tabella
for i=1 to rst.fileds.count
tdf.Fields.Append .CreateField("Campo"&i, dbText) ' Aggiungi i campi necessari
next i
set RstOutput = currentdb.openrecordset("Nome tabella",dbopendynaset) ' Apri un recordset sulla tabella appena creata
rst.movefirst
do until rst.eof
RstOutput .addnew
for i=1 to rst.fileds.count ' Ciclo per riempire la tabella (non so se ci va .value non ricordo)
rstoutput(i)=rst(i)
next i
rstoutput.update
rst.movenext
loop
Non so se potrebbe funzionare con una query a campi incrociati (non ho provato) ma se funziona alla fine dovresti avere la tabella pronta per essere esportata su excel
PS il codice l'ho scritto di getto giusto per illustrare l'idea