Premessina: l'esportazione di RecordSource estrae tutti i record dell'origine dati, non solo quelli filtrati. Dovresti quindi creare una query anche temporanea in cui la clausola WHERE corrisponde alla proprietà Filter della maschera.
Qui trovi il codice da adattare: https://stackoverflow.com/questions/61368321/ms-access-vba-to-export-a-filtered-form-to-excel
Alla domanda: “Esiste un modo da non inserire il percorso nel codice e far scegliere ogniqualvolta come succede usando la macro ?” la risposta secca è no: il nome del file in barba a quanto sembra dalla guida
11/08/2023 - OsvaldoLaviosa ha scritto:
Che vuol dire non funziona? Il 4° argomento è opzionale
DoCmd.TransferSpreadsheet method (Access) | Microsoft Learn
…mi aspetto che se è vuoto, Access ti chieda dove esportarlo.
è un elemento obbligatorio e deve essere definito prima di lanciare il comando. Se manca si ottiene l'errore 2522: per l'azione o il metodo è necessario l'argomento Nome file.
Puoi scriverlo in una textbox e prendere il valore da lì, includendo o meno il percorso. Se non includi il percorso lo puoi definire staticamente tipo
DoCmd.TransferSpreadsheet acExport, , Me.RecordSource, "C:\TestFolder\" & Me.txtNomeFile.Value & ".xlsx"
dove txtNomeFile è la casella di testo dove hai inserito il nome del file (che fantasia, eh? )
Visto che esporti in xlsx specifica anche il secondo argomento, acSpreadsheetTypeExcel12Xml.
Anche il percorso/directory di destinazione può essere in una textbox, di “libera” compilazione oppure di compilazione obbligata attraverso FileDialog. Con quest'ultima è impossibile sbagliare perché si è obbligati a selezionare un percorso esistente e corretto.
Con l'uso invece di una textbox a compilazione libera è meglio sottoporre quel valore alla funzione Dir, per verificarne l'esistenza
If (GetAttr(Me.txtDirectory.Value) And vbDirectory) <> vbDirectory Then
'la directory non è valida
'svuotamento della textbox che ha un valore non valido
Me.txtDirectory.Value = vbnullstring
'Focus sulla textbox per inserire un nuovo valore
Me.txtDirectory.SetFocus
'Messaggio di spiegazione
MsgBox "Percorso non valido"
End If
Attenzione all'uso della barra alla fine del percorso, perché
GetAttr(Me.txtDirectory.Value) And vbDirectory
restituisce vbDirectory sia se alla fine di txtDirectory c'è “\” o no.
Ipotizzando quindi di costruire il percorso in questo modo
strPath & "\" & Me.txtNomeFile.Value & ".xlsx"
devi prima assicurarti che non ci sia già alla fine della textbox non ci sia già “\”
Dim strPath as String
If Right$(Me.txtDirectory.Value, 1) = "\" Then
strPath = Left$(Me.txtDirectory.Value, Len(Me.txtDirectory.Value) - 1)
Else
strPath = Me.txtDirectory.Value
Ecco perché l'uso di FileDialog mette al riparo da ogni ulteriore verifica perché la scelta è forzata attraverso la “finestrella” di navigazione nel filesystem.
Sarebbe opportuno verificare anche la correttezza formale del nome del file, affinché non contega uno o più caratteri vietati:
\ / ; * ? " < > |
altrimenti va in errore il DoCmd.TransferSpreadSheet.
Lo so, sono tante verifiche per una operazione sola, quella di esportazione di un file, ma devono essere considerate tutte.