Salvare un file



  • Salvare un file
    di trump61 data: 12/02/2015 22:34:06

    Ciao, scusate se ritorno con i miei Problemi.
    Non riesco quando salvo il file a far rimanere aperto quello da cui ho lanciato il codice per eseguire questa operazione, e a salvare una copia del file con un altro nome, sono sicuro che mi sto incartando da solo ma purtroppo sono una settimana che cerco una soluzione e non ne vengo a capo.
    Mi son guardato l'help di excel vba al metodo ActiveWorkbook.SaveAs, ma tra le varie opzioni non mi sembra che ce ne sia una che faccia al mio caso.
    Il codice che uso è quello qui sotto, già postato per un altro quesito.
    qualcuno mi può dare un suggerimento?
    Grazie

     
    Sub salvafile()
    On Error Resume Next
    Dim X, Y, Z, A, T, W, L, N
    Dim Mydates As Date
    Mydates = Date
    X = Month(Mydates)
    Y = Array("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembra", "Ottobre", "Novembre", "Dicembre")
    N = Y(X - 1)
    Z = Day(Mydates)
    A = Year(Mydates)
    W = Array("Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato", "Domenica")
    T = Weekday(Mydates)
        ActiveWorkbook.SaveAs Filename:= _
            "C:ModIf2212015" & N & "" & Z & ".xlsm", FileFormat:= _
            xlOpenXMLWorkbookMacroEnabled, CreateBackup:=True
            ActiveWindow.Close



  • di lepat (utente non iscritto) data: 13/02/2015 08:11:49

    usa SaveCpyAs



  • di lepat (utente non iscritto) data: 13/02/2015 08:12:42

    SaveCopyAs



  • di trump61 data: 13/02/2015 16:16:03

    Ciao Lepat, ti ringrazio per la tua attenzione. Ho corretto i codice prima come scritto in Esempio 1, mi ha dato errore ho guardato l'Help di Excel e l'ho modificato nel secondo Esempio, ma cosi mi fa si la copia del file ma non mi cambia il nome con quello del giorno della data, c'è qualcosa che devo cambiare nel codice?
    Grazie di nuovo
     
    Esempio1
    ActiveWorkbook.SaveCopyAs Filename:= _
            "C:ModIf2212015" & N & "" & Z & ".xlsm", FileFormat:= _
            xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
            ActiveWindow.Close
           puliscifoglio
    
    Esempio1
    ActiveWorkbook.SaveCopyAs  "C:ModIf2212015" & N & "" & Z & ".xlsm"
            ActiveWindow.Close
           puliscifoglio



  • di Vecchio Frac data: 13/02/2015 18:56:59

    cit. "mi ha dato errore"
    ---> Troppo vago! Che errore? codice di errore, descrizione dell'errore. Punto esatto dove la macro si ferma e segnala l'errore.


    cit. " non mi cambia il nome con quello del giorno della data"
    ---> ma se il codice che scrivi è questo: "C:ModIf2212015" & N & "" & Z & ".xlsm", sono valorizzate correttamente le variabili N e Z ? Hai controllato? Hai impostato un punto di interruzione su quella riga per controllare la situazione delle variabili, (oppure) hai seguito passo-passo la macro per controllare, a quel punto, che valore hanno N e Z?





  • di trump61 data: 13/02/2015 21:26:52

    Ciao e grazie per il tuo interessamento. L'errore che mi indica è questo "Numero errato di argomenti o assegnazione di proprietà non valida (errore 450)" e il codice si Blocca si ".SaveCopyAs" Se ho interpretato bene quello che c'è scritto sull' Help , "FileFormat:= _
    xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False" questa parte di codice non fa parte dei parametri di questo metodo, ma potrebbe essere tutto il contrario, non ho un buon rapporto con l'help di excel.

    Nel secondo esempio non salva proprio il file o se lo salva non so in che directory.
    Adesso che mi hai fatto fare queste prove cerco di approfittare della situazione
    Il codice qui sotto fa quello di cui ho bisogno, tranne avvisarmi che sto sovrascrivendo un file esistente, ma poi a me servirà salvarlo una sola volta, quindi il problema non mi si pone.
    Ho fatto quello che mi hai suggerito o almeno credo di averlo fatto.
    Come avrai notato ho definito il tipo di variabile, non so se intendevi questo per valorizzare una Variabile. ho scelto che si di tipo Variant perchè sull' help ho letto questo "Filename(Nome) Facoltativo(obbligatorio/facoltativo) Variant(Tipo di dati)" Ho sbagliato?
    Ho messo un punto di interruzione sulla riga :
    ActiveWorkbook.SaveCopyAs "C:ModIf2212015" & N & "" & Z & ".xlsm", eseguo il codice, nella finestra Variabili locali mi mostra i valori che assumono le Variabile di fianco trovo scritto trovo scritto come ho definito io la variabile in questo caso Variant poi / Integer nel caso di Z e String in caso di N presumo da questo che devo cambiare le definizioni delle Variabili N e Z,
    Ultima cosa quando trovo scritto questo W : : Variant/Variant(0 to 6)
    devo definire la variante Dim W As Variant(0 to 6)?
    perdonami se ho scritto un mucchio di sciocchezze. Sto cercando di imparare sfruttando forum e siti non ho nessuno con cui confrontarmi e chiedere spiegazioni.
    Vi ringrazio di nuovo per la vostra disponibilità e pazienza

     
    Sub salvafile()
    On Error Resume Next
    Dim X, Y, A, T, W, L
    Dim Z, N As Variant
    
    Dim Mydates As Date
    Mydates = Date
    X = Month(Mydates)
    Y = Array("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembra", "Ottobre", "Novembre", "Dicembre")
    N = Y(X - 1)
    Z = Day(Mydates)
    A = Year(Mydates)
    W = Array("Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato", "Domenica")
    T = Weekday(Mydates)
       ActiveWorkbook.SaveCopyAs "C:ModIf2212015" & N & "" & Z & ".xlsm"
       puliscifoglio
    End Sub
    



  • di Vecchio Frac data: 13/02/2015 21:34:25

    Sì. Hai interpretato bene. Comincia pure ad abituarti con l'Help, il tuo (fu il mio) primo amico
    .SaveCopyAs vuole solo un file_name come parametro, anche completo di percorso.

    Ora, interruzioni dei bambini permettendo, leggo il resto del tuo post :P





  • di Vecchio Frac data: 13/02/2015 21:48:09

    Suggerimento: invece di quella sfilza di variabili, gioca un po' con Format.
    Ad esempio, oggi è Date=13/02/2015 e quindi Format(Date, "mmmm") restituisce "febbraio", e WeekDayname(WeekDay(Date)) restituisce il nome del giorno della settimana ("sabato").

    Va bene il punto di interruzione sulla riga di salvataggio.
    Poi (invece della finestra delle variabili locali) puoi passare il mouse sulla riga di testo dopo SaveCopyAs in corrispondenza delle variabili di testo N e Z e aspettare un attimo; un tooltip ti informa del contenuto della variabile (lo ottieni anche con Shift-F9 in una finestra di messaggio).
    Nel tuo codice tutte le variabili sono Variant.

    Quel "puliscifoglio" finale cosa sarebbe?

    Non aver paura a chiedere e ripetere finchè non ti è chiaro cosa fa cosa.





  • di Vecchio Frac data: 13/02/2015 21:53:29

    cit. " ho scelto che si di tipo Variant perchè sull' help ho letto questo "Filename(Nome) Facoltativo (obbligatorio/facoltativo) Variant(Tipo di dati)" Ho sbagliato? "
    ---> Un errore vero e proprio non è, ma poichè stai riempiendo una variabile con un testo, il suo tipo "naturale" è "String".

    In definitiva, come deve essere costruito questo nuovo nome di file?
    Attualmente viene costruito qualcosa come:
    "C:ModIf2212015Febbraio13.xlsm"
    E' sbagliato? volevi qualche altra info nel nome di file?






  • di Vecchio Frac data: 13/02/2015 22:33:33

    Prima di chiudere, ti lascio con una riga di codice da scoprire... che risultato ti darà?

    nome_file = "C:ModIf2212015" & Format(Date, "mmmm\d") & ".xlsm"





  • di trump61 data: 14/02/2015 01:52:54

    Ciao, ho da studiare molto dopo questa conversazione ma mi piace, sono stato indirizzato nella giusta via, questo mi semplifica il compito. La cosa che mi da fastidio è che quando leggo alcuni suggerimenti e mi viene da pensare "perchè non ci ho pensato", per alcuni invece rimango con la bocca aperta.
    Ancora grazie.
    PS ma solo io ho problemi con questo editor? mi fa impazzire



  • di trump61 data: 14/02/2015 02:02:56

    "C:ModIf2212015Febbraio13.xlsm"
    E' sbagliato? volevi qualche altra info nel nome di file?
    No è perfetto, in pratica dopo averlo compilato alle 23:00 salva il foglio che va ad implementare l'archivio delle presenze giornaliere, questo per avere uno storico da consultare in caso di problemi.
    puliscifoglio è una semplice macro che riporta i due fogli allo stato iniziale. per poter ricompilare le presenze del giorno successivo.



  • di Vecchio Frac data: 14/02/2015 09:48:15

    Figurati che anch'io ogni volta che leggo gli interventi di scossa penso "perchè non ci ho pensato io" ? c'è sempre da imparare da qualcuno! e non è certamente una vergogna, anzi.
    Quanto al tuo nome di file, te lo chiedevo perchè se il nome di file va bene così, allora tutto il codice che avevi preparato tu è sovrabbondante, cioè richiami cose che non servono (i nomi dei giorni della settimana), quindi devi scremare.
    Te lo riscrivo tenendo solo quello che ti serve. Poi chiaramente, un quando va avanti nello studio scopre i trucchi (come con Format: una riga sola invece di tutto l'ambaradan), ma questa è un'altra cosa.
     
    Sub salvafile()
    On Error Resume Next
    Dim X as string, Y as Variant
    Dim Z as String, N As string
    Dim Mydates As Date
        
        Mydates = Date
        X = Month(Mydates)
        Y = Array("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembra", "Ottobre", "Novembre", "Dicembre")
        N = Y(X - 1)
        Z = Day(Mydates)
       ActiveWorkbook.SaveCopyAs "C:ModIf2212015" & N & "" & Z & ".xlsm"
       puliscifoglio
    End Sub






  • di Vecchio Frac data: 14/02/2015 09:49:33

    cit. "PS ma solo io ho problemi con questo editor? mi fa impazzire"
    ---> Che problemi incontri? l'editor è semplicissimo. Solo testo, nessuna formattazione, nessuna distrazione
     
    'qui sotto scrivo codice di esempio






  • di trump61 data: 14/02/2015 13:44:08

    Ciao e grazie per la scrematura.
    Quando scrivo un post e mi succede solo in questo Forum il cursore mentre digito mi cambia di posizione, quindi mi tocca cancellare quello che avevo già scritto e riscrivere parte del post, questo succede specialmente se digito velocemente.
    PS La parte dell' orologio che mi attiva il salvataggio automaticamente alla fine della giornata è di Scossa l' ho trovata in rete e l'ho leggermente modificata per adattarla alle mie esigenze.Sotto c'è il vecchio codice ancora non modificato dove la parte del timer è di scossa

     
    Sub salvafile()
    On Error Resume Next
    Dim X, Y, Z, A, T, W, L, N
    Dim Mydates As Date
    Mydates = Date
    X = Month(Mydates)
    Y = Array("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembra", "Ottobre", "Novembre", "Dicembre")
    N = Y(X - 1)
    Z = Day(Mydates)
    A = Year(Mydates)
    W = Array("Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato", "Domenica")
    T = Weekday(Mydates)
        ActiveWorkbook.SaveAs Filename:= _
            "C:ModIf2212015" & N & "" & Z & ".xlsm", FileFormat:= _
            xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
    End Sub
    
    Timer:
    Questo in un modulo 
    Public dTime As Date
    
    Sub Orologio()
    ThisWorkbook.Worksheets("Foglio1").Range("D2").Value = Format(Now, "hh:mm:ss") 
    
    dTime = Now + TimeSerial(0, 0, 1)
    Application.OnTime dTime, "OrologiO"
    If Range("Foglio1!D2") = Range("Foglio1!D1") Then
        Worksheets("Foglio1").Range("D3").Value = 2
        salvafile
        
    End If
    End Sub
    
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    On Error Resume Next
    Application.OnTime EarliestTime:=dTime, Procedure:="OrologiO", Schedule:=False
    On Error GoTo 0
    End Sub
    
    Private Sub Workbook_Open()
    Call OrologiO
    End Sub
    
    Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
    Call OrologiO
    End Sub



  • di Vecchio Frac data: 14/02/2015 16:23:20

    cit. "Quando scrivo un post e mi succede solo in questo Forum il cursore mentre digito mi cambia di posizione, quindi mi tocca cancellare quello che avevo già scritto e riscrivere parte del post, questo succede specialmente se digito velocemente. "
    ---> Proprio strano, che browser utilizzi? su che sistema operativo? desktop o pc?

    Con l'ultimo post hai problemi o riesci a implementare le modifiche?





  • di trump61 data: 14/02/2015 23:18:01

    Ciao, ho Windows 7 e come Broswer Chrome.
    Oggi non ho potuto applicarmi domani ci provo e ti faccio sapere



  • di trump61 data: 15/02/2015 11:47:52

    Ciao,
    nome_file = "C:ModIf2212015" & Format(Date, "mmmm\d") & ".xlsm" non ci avrei mai pensato, anche perchè non conoscevo la possibilità di scrivere ""mmmm\d"" e sinceramente non capisco il doppio \ però mi adeguo.
    Il codice che mi hai ridotto è giustissimo perchè per pigrizia ho copiato ed incollato la parte con cui mi sono ricavato la data, e non ho tolto le parti che non servivano, per le dichiarazioni delle variabili grazie al tuo suggerimento ho capito che ho uno strumento per farlo correttamente.
    Con Format il mio codice va nella spazzatura anche se funzionante, però mi ha dato soddisfazione scriverlo e mi ha dato modo di imparare qualcosa di nuovo, per non parlare del tuo suggerimento di Usare
    Format(Date, "mmmm\d"). Anche se adesso tutto funziona credo che con Format sostituirò altre parti del codice
    Grazie di nuovo



  • di Vecchio Frac data: 15/02/2015 12:29:44

    cit. " sinceramente non capisco il doppio \ però mi adeguo"
    ---> No, non adeguarti, ma comprendi :o)
    Format è un'istruzione che accetta una "espressione di formato" come dice la Guida, cioè dei codici convenzionali che restituiscono un valore di ritorno che rispetta dei formati standard. Puoi quindi formattare (cioè assegnare un aspetto, un formato) numeri, testo, date e orari perchè vengano rappresentati all'utente nel modo preferito.

    Format("ciao", ">") ---> "CIAO"
    Format(Now, "hh:mm:ss" ) ---> "Sono le 12:20:44"

    Nel formattare le date si usano i segnaposto dd per il giorno (day), mm per il mese (month), yy per l'anno (year).
    Raddoppiare y significa ottenere un anno a quattro cifre, triplicando m restituisce un mese abbreviato ("gen", "feb") e scrivendo quattro m restituisce il mese per esteso.
    Se nell'espressione di formato scrivi qualcosa, quel qualcosa viene restituito uguale.
    Format (Now, "Oggi è dd-mm-yyyy") ----> "Oggi è 15-02-2015"

    Ma se usi un carattere riservato questo viene interpretato:
    Format (Now, "Dimmi che ore sono") ----> "15i02i 15/02/2015 12:24:5912e ore 59o24o"
    La "D", la "mm", la "c", la "h" eccetera sono caratteri riservati.
    Per ottenere nell'output propri i caratteri riservati come se fossero testo è necessario farli precedere dallo slash, uno per uno:
    Format (Now, "Dimmi che ore so o") ----> "Dimmi che ore sono"

    Altri caratteri speciali sono per esempio lo slash stesso. Per ottenere proprio lo slash nel formato, devi raddoppiarlo:
    Format(Date, "mmmm\d") ----> restituiscimi la data corrente visualizzando solo il mese per esteso, quindi uno slash singolo quindi il giorno ----> "febbraio15".

    Come vedi niente di misterioso... la Guida è tua amica :)


    cit. "Con Format il mio codice va nella spazzatura"
    ---> No, hai solo appreso un modo alternativo per raggiungere un risultato. Niente di quello che impari va perso. Ne farai tesoro per snellire, semplificare, ridurre e, in ultima, velocizzare il codice, infatti te ne rendi conto quando mi dici " credo che con Format sostituirò altre parti del codice " : è la strada giusta ^_^







  • di Vecchio Frac data: 15/02/2015 12:32:44

    Due piccole precisazioni:


    Format(Now, "hh:mm:ss" ) ---> "Sono le 12:20:44"
    correggi in
    Format(Now, "Sono le hh:mm:ss" ) ---> "Sono le 12:20:44"


    Raddoppiare y significa ottenere un anno a quattro cifre
    correggi in
    Raddoppiare yy significa ottenere un anno a quattro cifre







  • di trump61 data: 15/02/2015 18:20:03

    Adesso grazie alla tua spiegazione "Format(Date, "mmmm\d") & ".xlsm"" non è più un oggetto sconoscuito.
    altro granello da mettere cassforte



  • di trump61 data: 16/02/2015 21:19:49

    Mi ero scordato la spunta