Alla fine ho fatto come hai suggerito tu, usando il transfertext.
Mi rimane il dubbio del perché non funzionasse la modalità con query inglobata, ma mi sono convinto che non si possano fare query di comando basate su tabelle di transito... se mi sbaglio e qualcuno sa il contrario, per favore me lo faccia sapere.
Il file .csv contiene la prima riga di intestazione. IL codice che ho usato è questo:
Sub aggiorna()
Dim dire As String, sqlstatement As String, nomefile As String
Dim qdef As QueryDef, db As Database
dire = CurrentProject.Path
nomefile = Dir(dire & "\")
Do While nomefile <> ""
Set db = CurrentDb
On Error Resume Next: db.TableDefs.Delete "tblImport": On Error GoTo 0
db.TableDefs.Refresh
DoCmd.TransferText transfertype:=acImportDelim, tablename:="TblImport", FileName:=nomefile, hasfieldnames:=True
db.TableDefs.Refresh
Set qdef = db.CreateQueryDef("")
sqlstatement = ("insert into Silente SELECT * FROM TblImport;")
qdef.SQL = sqlstatement
qdef.Execute
nomefile = Dir
Loop
End Sub
Come vedi è la stessa soluzione che hai proposto: import in una tabella fisica tblImport e da li poi inserimento nella tabella Silente.
Ho solo due dubbi a questo punto:
1. la tabella, essendo un .csv, usa i punti some separazione per i decimali. Ma i decimali la mia macchina li separa con le virgole. Devo quindi convertire tutti i separatori della tabella Silente (ovviametne dopo averli importati) da punti a virgole.
2. Come dici tu rimane il problema del confronto tra i recordset dei file csv e quelli della tabella silente. Potrei spostare i file come hai detto tu in un'altra directory e creare una tabella dei log (anzi questo lo avevo già pensato e sviluppato). Ma provando col codice sopra riportato mi sono accorto che facendo girare la macro 10 volte, non sovrascrive i record 10 volte, come mi aspettavo originariamente. Sembra che importi solo i record nuovi. E questo credo sia motivato dal fatto che c'è una chiave primaria impostata che ovviamente non può prevedere duplicazioni. Quindi il problema si è risolto da solo. Il dubbio che mi rimane è che non evidenzia alcun segnale di errore...