› Sviluppare funzionalita su Microsoft Office con VBA › salvare nella stessa cartella del file
-
AutoreArticoli
-
buonasera a tutti,
mi rivolgo a voi perché ho un problema che non riesco a risolvere. Ho un file modello con attivazione macro .xltm, quando lo apro devo poter schiacciare sui vari tasti in alto: stampa... salva.... e quello funziona. Il mio problema è che se stampo... nella funziona c'è una parte che dice di stampare anche una copia in pdf. del documento stampato nella stessa cartella dove si trova il file modello. stessa cosa, il tasto salva, deve infatti salvare con nome nella stessa cartella questa volta in formato normale .xlsm. Ma purtroppo non lo fa e non capisco perché...
codice salvataggio:
Sub Salva_con_nome_S() If MsgBox("Attenzione: il file verrà salvato con nome e si chiuderà in automatico. Procedere?", vbYesNo, "Speichern") = vbYes Then Dim fName As String Worksheets("Gestione").Select fName = Sheets("Gestione").Range("h11") Dim relativePath As String relativePath = ThisWorkbook.Path & "\" & fName ActiveWorkbook.SaveAs Filename:=relativePath, FileFormat:= _ xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False Application.Quit End If End Sub
codice stampa:
Public Sub Stampante_senza_dettaglio() Application.Dialogs(xlDialogPrinterSetup).Show Sheets("LetteraPreventivoForfait").PrintOut Copies:=1, Collate:=True, _ IgnorePrintAreas:=False Dim fName As String Dim relativePath As String Worksheets("Gestione").Select fName = Range("h11").Value relativePath = ThisWorkbook.Path & "\" & fName Sheets("LetteraPreventivoForfait").Select ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _ relativePath, Quality:=xlQualityStandard, _ IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False Sheets("Gestione").Select Range("h14").Select End Sub
Ho provato a farlo con il file non modello... quindi .xlsm e li il codice funziona... e non capisco perché!! vi allego tutte e due i file...
per me sarebbe importante poterlo mettere sul modello, in quando così il file rimane sempre vergine. Spero che qualcuno possa aiutarmi. in attesa vi ringrazio anticipatamente come sempre, e vi auguro una buona serata
Marco
Allegati:
You must be logged in to view attached files.mi dovete scusare,
non sono riuscito a caricarvi il file in formato xltm (modello con attivazione macro)... perché il vostro sistema lo blocca... ce scritto: questo tipo di file non è permesso per ragioni di sicurezza... Penso se prendete il file e lo salvate con nome in formato xltm riuscite a fare delle prove...
vi ringrazio ancora molto e vi auguro una buona serata
marco
Ho scaricato il file xlsm e l'ho convertito in modello. Se preferisci allegare il modello originale allora zippalo e riallegalo, quello verrà accettato sicuramente dal sistema.
Nel merito intanto non trovo il pulsante che scatena il "salvataggio senza dettaglio" a cui è associata la sub cui ti riferisci.
Comunque il problema è in relativePath che non è valorizzato (è una stringa vuota) e quindi la costruzione del filename fallisce; ti spiego perchè: quando attivi un file normale (xlsm) questo ha già un nome e un percorso, perciò le varie routine che vi si riferiscono trovano un valore di path e filename correttamente valorizzato. Invece, quando attivi un file modello, questo genera un file (basato su modello) che non viene salvato da Excel: prova ne è che quando apri il file modello facendo doppio click su esso e fai qualunque modifica, poi tenti di chiuderlo, Excel ti chiede di salvarlo e ti propone la finestra di Save As. Solo allora quel file basato sul modello avrà un nome e un percorso, e infatti diventa un normale file xlsm.
Ma prima no: esiste solo in memoria, ed è per questo che Thisworkbook.Path è vuoto e di conseguenza la stringa relativepath ha un valore non corretto inizia con lo slash e ha il valore della cella H11).
Ora ti cerco un modo semplice per ovviare (ne ho in mente diversi ma te ne propongo qualcuno di facile)
Penso che il consiglio migliore sia di testare il valore di relativepath prima del comando (di salvataggio o di stampa) e se è vuoto, forzarlo a un valore predefinito (per esempio la cartella desktop dell'utente o la sua cartella documenti o una cartella condivisa in rete).
Esempio:
Sub Salva_con_nome_S() If MsgBox("Attenzione: il file verrà salvato con nome e si chiuderà in automatico. Procedere?", vbYesNo, "Speichern") = vbYes Then Dim fName As String Worksheets("Gestione").Select fName = Sheets("Gestione").Range("h11") Dim relativePath As String if thisworkbook.path = "" then relativepath = environ("userprofile") & "\desktop\" & fname else relativePath = ThisWorkbook.Path & "\" & fName end if ActiveWorkbook.SaveAs Filename:=relativePath, FileFormat:= _ xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False Application.Quit End If End Sub
Ciao vecchio fac,
sei fantastico, ti ringrazio davvero moltissimo, sia per la spiegazione dettagliata che mi hai dato e la soluzione che ho provato e funziona! Quindi non c’è la possibilità di vedere dove è salvato il modello e salvarlo nella sua cartella. Infatti avevo notato che con percorsi precisi si poteva risolvere il problema, ma visto che è un file che gira, non sapendo dove i colleghi lo salvano era più semplice far fare che salvasse dove viene messo il modello.
ti ringrazio davvero ancora moltissimo e ti auguro una buona serata!
marco
non c’è la possibilità di vedere dove è salvato il modello
Bè posso provare a interessarmi e se trovo qualcosa lo comunico 🙂
Ho trovato una routine in internet (su stackoverflow) che sembra funzionare, però non so quanto valga la candela perchè ci mette un bel po' a dare un risultato ed è anche inaffidabile perchè può fallire. In pratica conoscendo il nome del modello fa una scansione delle directory e dei file della macchina locale finchè non lo trova (che però se l'utente cambia il nome del file modello, salta il banco).
In alternativa, invece di usare un file modello, puoi usare un file normale (per cui esiste quindi un percorso di salvataggio), in fondo ha la stessa funzionalità (si usa un file modello depositandolo in una cartella comune che poi per esempio ogni utente può attivare per farsi la propria copia locale. Nel tuo caso, visto che devi avere sempre una copia originale immacolata, puoi forzare un SaveAs all'apertura del file stesso e quindi lavorare sempre su una copia (per eccesso di scrupolo puoi anche settare l'attributo Readonly del file originale così questo non verrà sovrascritto neanche per errore).
Ciao vecchio frac!! Ti ringrazio davvero tantissimo per le tue idee e la tua ricerca, per ovviare al mio problema. Si hai ragione la cosa più semplice è che il file lo si apre in Solo lettura e quindi sarebbe comunque salvo, e nessuno potrebbe sovrascriverlo!
grazie davvero per L aiuto e ti auguro una buona giornata
-
AutoreArticoli