Salvare file in una cartella diversa quando aperto



  • Salvare file in una cartella diversa quando aperto
    di Lisa B. data: 23/03/2015 09:32:29

    Ciao ragazzi... Mi chedevo se tramite VBA c'e' la possibilità di fare una copia di sicurezza di un file specifico denominato servizi.xls al momento dell'apertura nella cartella documenti di windows dandogli come nominativo la data e l'ora.
    Il file che è in più copie, viene lanciato da chiavette usb diverse...

    Il vba sarà da mettere in excel e non nel progetto... È possibile??? La versione di excel è 2003 e 2010

    Grazie



  • di lepat (utente non iscritto) data: 23/03/2015 09:48:16

    qualcosa del genere
     
    Private Sub Workbook_Open()
      fname = ............
      ThisWorkbook.SaveCopyAs (fname)
    End Sub



  • di Lisa B. data: 23/03/2015 09:51:20

    E come faccio a metterlo in Excel e non nel progetto? C'è modo???



  • di Vecchio Frac data: 23/03/2015 10:41:38

    Vedo due alternative:
    1) creare su ogni client un file batch (bat, vbs o altro) magari da mettere sul desktop che punti al file Excel e prima di aprirlo effettui la copia (soluzione più semplice)
    2) creare nella cartella XLSTART di ogni client un piccolo foglio Excel con gestione dell'evento Workbook_Open che esegua la copia del foglio con nome tal dei tali una volta che questo viene aperto (soluzione non consigliata perchè appesantisce l'avvio di Excel)





  • di Lisa B. data: 23/03/2015 10:47:01

    V.Frac... Chiedo sempre cose difficili e incomprensibili.... Ha ha ha è un dono il mio o sono di natura una rompi b.....

    I pc dove dovrà effettuare questa "copia" sono 2 e sempre gli stessi... Uno ha il 2003 e l'altro il 2010.

    Mi chiedevo... Come per il famoso EUROTOOL nin c'è modo di creare un vba sempre presente li in excel che si attivi solo se viene aperto il file servizi.xls????



  • di Vecchio Frac data: 23/03/2015 11:01:15

    La mia soluzione n° 2 risponde alla tua ultima domanda ^_^
    Tutto quello che viene messo in XLSTART viene aperto automaticamente ad ogni avvio di Excel e quindi se contiene una macro, viene eseguita. Io preferirei la prima soluzione, ma puoi provarle tutte e due e vedere quale ti soddisfa di più.





  • di Lisa B. data: 23/03/2015 11:11:08

    Grazie... Ora provo la soluzione 2... Poi nel caso chiedo lumi x la soluzione 1

    Ora provo a formulare il codice seguendo i consigli di Lepat



  • di Vecchio Frac data: 23/03/2015 11:29:45

    Abbi cura di copiare il file solo se il nome del file è quello da ricopiare... ricordati che il codice verrà eseguita all'apertura di qualsiasi file.





  • di Lisa B. data: 23/03/2015 11:33:41

    Non riesco a dare il percorso di salvataggio.... E.rinominarlo con data e ora di apertura



  • di Vecchio Frac data: 23/03/2015 11:40:04

    Descrivi "Non riesco"...
    Non conosci la sintassi del comando? ottieni un errore (quale)?
    Mostraci il codice prodotto.





  • di Lisa B. data: 23/03/2015 12:14:33

    Eh... Non conosco la sintassi...

    Mi sono limitata a,copiare il codice sotto descritto... In un File chiamato salvataggio automatico

    Mah... Non so come dirgli di copiare il file in C:Documenti e dirgli di chiamarlo data e ora es. 23-03-2015_12.00.xls
     
    Private Sub Workbook_Open()
    
    fname = servizi.xls
    
    ThisWorkbook.SaveCopyAs filename: c:Documenti.copia.xls
    
    Msgbox "Copia di sicurezza effettuata"
    
    End Sub



  • di Vecchio Frac data: 23/03/2015 13:53:14

    Quando siete in dubbio sulla sintassi, la strada più semplice è aprire la finestra immediata nell'editor del codice (Ctrl-G), scrivere la parola chiave e premere F1.
    La sintassi di FileCopyAs è semplice:
    ThisWorkbook.FileCopyAs filename
    dove filename è una stringa che rappresenta il nuovo nome di file, completo di percorso.
    Essendo una stringa, la puoi costruire come vuoi, quindi con eventuali altre funzioni di data e ora, separatori di testo, ecc.
    Alla luce di queste informazioni, ti invito a rivedere il codice postato, sapendo che sei sulla buona strada; ricordati la dichiarazione delle variabili e i corretti dim, attenta a fname (è una stringa! cosa gli stai assegnando?!), attenta all'uso del parametro passato per nome (hai specificato "filename:" ma ricordati che gli argomenti, quando vengo ospecificati per nome, vogliono l'assegnazione mediante ":=" e non mediante i semplici due punti).
    Riprovaci, e vinci un nuovo giro sulla giostra :)





  • di Lisa B. data: 23/03/2015 15:36:20

    Grazie V.Frac... Ciò che ho scritto xo' a pate che non salva il file con il nome che voglio darci, è giusto??

    Nel senso... Ogni volta che apro il file servizi.xls mi dovrebbe creare la copia in c:documenti/copia.xls giusto? E mandare il msgbox....

    A me invece non fa assolutamente nulla....



  • di Vecchio Frac data: 23/03/2015 16:09:31

    Con quel codice scritto in quel modo lì non funzionerà di certo ^_^
    - ho creato un foglio nuovo
    - ho inserito il codice in Thisworkbook
    - NB devi cambiare la cartella di salvataggio che attualmente è in J:
    - ho salvato con nome di file "servizi" e tipo di file "aggiunta di excel (.xla)"
    - ho chiuso

    Quindi:
    - ho creato un foglio nuovo
    - l'ho salvato con nome "servizi.xls" e tipo di file normale
    - l'ho chiuso

    Ho riaperto il file servizi.xls, all'avvio mi chiede di attivare le macro, e fa la sua brava copia di sicurezza (in J:) aggiungendo nome e data/ora attuale.
    L'unico inconveniente che non riesco a risolvere è che la copia viene sì salvata ma senza estensione :o) per cui il file non si apre, aggiungendola a mano viene normalmente riconosciuto come file Excel e tutto fila liscio.
     
    Option Explicit
    
    Private Sub Workbook_Open()
        If ThisWorkbook.Name = "servizi.xls" Then
            SaveCopyAs "j:copia di servizi_" & Format(Now, "dd-mm-yyyy-hh-nn") & ".xls"
            MsgBox "Copia di sicurezza effettuata"
        End If
    End Sub






  • di Lisa B. (utente non iscritto) data: 23/03/2015 16:31:20

    Ho modificato il codice cosi... con il "C"

    inserito in Thisworkbook

    L'ho salvato con nome SERV.XLS (con il 2003 come salvo in XLA???) nella cartella XLSTART

    Creo il file SERVIZI.XLS.... lo apro... e... niente
     
    Option Explicit
    
    Private Sub Workbook_Open()
        If ThisWorkbook.Name = "servizi.xls" Then
            SaveCopyAs "C:copia di servizi_" & Format(Now, "dd-mm-yyyy-hh-nn") & ".xls"
            MsgBox "Copia di sicurezza effettuata"
        End If
    End Sub



  • di Vecchio Frac data: 23/03/2015 16:41:32

    cit. "L'ho salvato con nome SERV.XLS (con il 2003 come salvo in XLA???) nella cartella XLSTART "
    ---> Quando salvi SERV.XLS scegli il tipo di file "Aggiunta di Excel" (la dicitura esatta non la ricordo, comunque ha estensione *.xla), dalla finestra "Salva con nome".
    Aprendo Servizi.XLS dovrebbe caricare l'aggiunta, eseguire la macro che si accorge di servizi.xls e fare quindi il suo dovere.





  • di Lisa B. data: 23/03/2015 16:58:37

    Salvato in xla ma non va ugualmente



  • di Lisa B. data: 23/03/2015 18:15:50

    Non capisco perché non mi vada... Ho seguito tutto alla letteta....

    Tu il file xla dove lo hai salvato???

    L'inconveniente che devo mettete amano l'estensione non è un problema...



  • di Vecchio Frac data: 23/03/2015 20:29:21

    Creato il file xla, l'ho messo nella cartella XLSTART.
    E' un file completamente vuoto, tranne per la macro di Open del Workbook.
    Chiamalo pippo, come vuoi, basta che abbia un nome diverso da quello di cui farai il backup.
    Il suo codice testerà l'apertura e se il nome di file sarà quello del file da copiare, lo salverà nella cartella specificata aggiungendo data e ora.





  • di Lisa B. data: 23/03/2015 20:49:17

    Non capisco xche' non vada.... Sto facendo tutto giusto...



  • di Lisa B. data: 24/03/2015 05:38:21

    Ho provato il tutto anche sul pc del lavoro e... Niente... Non mi fa nulla...come sul mio pc vedo che apre il file xla mah... Non fa nulla



  • di Vecchio Frac data: 24/03/2015 10:29:32

    :(
    Non ci riesco più neppure io a dire il vero...
    Allora ti propongo la prima soluzione, un file vbs da mettere sul desktop e fa da lanciatore del file xls dopo aver fatto la copia di sicurezza.
    Lo script preleva data e ora corrente, copia il file dalla posizione originale nella cartella di backup aggiungendo al nome data e ora corrente, visualizza una finestra di messaggio che si autochiude dopo 3 secondi quindi fa partire il file originale.
    Al solito devi aggiustare i nomi di file e di cartella (lo script è un semplice file di testo con estensione vbs).
     
    'crea una copia di sicurezza del file servizi con data e ora corrente,
    'quindi esegue il file servizi originale.
    
    dim fso, wsh, sha
    set fso = CreateObject("Scripting.FileSystemObject")
    set wsh = CreateObject("WScript.Shell")
    set sha = CreateObject("Shell.Application")
    
    'formata data e ora correnti
    s = formatdatetime(now)
    s = replace(s, "/", "-")
    s = replace(s, ".", "-")
    s = replace(s, " ", "-")
    
    'crea un file di backup con data e ora corrente
    fso.CopyFile "c:users5314495desktopservizi.xls", "j:copia di servizi_" & s & ".xls"
    
    'visualizza un popup che si chiude dopo 5 secondi
    wsh.Popup "Copia di sicurezza effettuata, avvio ""servizi.xls""", 5, "Avviso", 64
    
    'apre il file per lavorarci
    sha.ShellExecute "excel", "c:users5314495desktopservizi.xls", "", "open", 1
    






  • di Lisa B. data: 24/03/2015 10:50:29

    Non riesco a capire come funzioni... Dove salvarlo... Come salvarlo...




  • di Vecchio Frac data: 24/03/2015 10:58:02

    Questo come ti dicevo è un semplice file di testo.
    Crea un file di testo con notepad sul desktop (tasto destro, Nuovo, Documento di testo), aprilo e incollaci il contenuto. Fai la modifica alle cartelle di origine e di destinazione.
    Chiudi, salvalo con nome "lancia_servizi.vbs".
    Doppio clic per eseguirlo.





  • di Lisa B. data: 24/03/2015 11:31:59

    Cosi facrndo xo' se mi varia la cartella del file "originale" dei servizi devo variarr il codice...

    Questa soluzione non fa al caso mio

    Il file che deve essere copiato sul pc come backup, spesso è lanciato da chiavette e il percorso non è sempre lo stesso...



  • di scossa data: 24/03/2015 14:19:14

    Dimmi se ho capito bene:
    - c'è un file Servizi.xls memorizzato su più chiavette usb
    - queste chiavette vengono inserite in uno dei due pc predisposti
    - il file Servizi.xls sulla chiavetta viene aperto
    - contemporaneamente deve essere salvata una copia sulla cartella j:Documenti
    che sarà quindi salvata come j:DocumentiServizi_yyyymmdd_hhmmss.xls

    E' giusto?

    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)




  • di Lisa B. data: 24/03/2015 15:24:01

    Esatto Scossa....



  • di Vecchio Frac data: 24/03/2015 15:29:09

    Lisa ha specificato che non vuole codice eseguibile nel file "servizi .xls":
    "Il vba sarà da mettere in excel e non nel progetto..."
    Quindi vuole una soluzione che sia disponibile come fosse una libreria di Excel (un Add In? io non ho Visual Studio per creare un Add In). Pensavo fosse sufficiente XLSTART ma mi sbagliavo.





  • di scossa data: 24/03/2015 15:37:04

    cit. V.F.: "Pensavo fosse sufficiente XLSTART ma mi sbagliavo"

    No, no ti sbagliavi, basta creare un file .xla (non serve Visual Studio) con una classe ad hoc per intercettare l'evento Open, e metterlo in XLSTART.

    Copiare il file allegato (OpenFile_Event.xla) nella cartella XLSTART dei due pc.

    Questo il codice presente nel file:
    Nel modulo di classe cAppEvents:

    'in un nuovo modulo di classe che rinominerai (Name) cAppEvents

    Public WithEvents App As Application

    Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
    If LCase(Wb.Name) = "servizi.xls" Then
    Dim sName As String
    sName = "j:Documentiservizi_" & Format(Now, "yyyymmdd_hhmmss") & ".xls"
    Wb.SaveCopyAs sName
    MsgBox "ho salvato una copia con nome " & sName
    End If
    End Sub

    Private Sub Class_Terminate()
    Set App = Nothing
    End Sub


    Nel modulo di classe ThisWorkbook:

    'nel modulo di classe di ThisWorkbook
    Dim moAppEventHandler As cAppEvents

    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Set moAppEventHandler.App = Nothing
    Set moAppEventHandler = Nothing
    End Sub

    Private Sub Workbook_Open()
    Set moAppEventHandler = New cAppEvents
    With moAppEventHandler
    Set .App = Application
    End With

    End Sub




    N.B.: se davi apportare modifiche al codice basta che, dopo aver messo il file nella cartella XLSTART:
    1) apri Excel
    2) nell'editor del VBA selezioni il progetto OpenFile_Event.xla;
    3) selezioni il modulo di classe ThisWorkbook (ovvero Questa_cartella_di_lavoro);
    4) nella finestra delle proprietà (che puoi vedere premendo F4) imposta la proprietà IsAddin a False e poi a True;
    5) fai le modifiche che devi fare;
    6) chiudi l'editor;
    7) chiudi Excel: ti verrà chiesto se salvare il file OpenFile_Event.xla, rispondi di sì.

    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)




  • di scossa data: 24/03/2015 15:41:38

    cit. X: "1).... 4) nella finestra delle proprietà (che puoi vedere premendo F4) imposta la proprietà IsAddin a False e poi a True; ...."

    So che sembra un po' bizzarra ma, per esperienza pratica, trovo la procedura proposta più pratica e sicura.


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Lisa B. data: 24/03/2015 15:46:21

    Funzionaaaaaaaaa........grazie mille ad entrambi AMICI!!!

    Grazie di cuiore x l'aiuto datomi!!!!!



  • di Vecchio Frac data: 24/03/2015 16:31:02

    Stamattina ho avuto bensì un lampo sul dichiarare una variabile con eventi, ma ho desistito perchè non ci ho creduto abbastanza.
    Mi spiace Lisa ma io non ti ho aiutato affatto... per fortuna è intervenuto scossa :)






  • di Lisa B. data: 24/03/2015 17:56:59

    Hai messo le basi del codice... E ciò che più conta... C'eri anche questa volta!!!!

    I vostri aiuti sono insostituibili... La vostra gentilezza nel farlo è UNICA!!!!

    GRAZIE



  • di Lisa B. (utente non iscritto) data: 25/03/2015 11:34:08

    Ciao SCOSSA...

    una domanda... ho modificato il tuo VBA per provare a dirgli di salvare non solo il file "servizi" ma anche il file "serviziA" ma cosi facendo non funziona...

    E' possibile adattarlo o è da riscrivere tutto il codice?

    Pensavo che aggiungendo un "or" fosse sufficente ma non è cosi
     
    Public WithEvents App As Application
    
    Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
        If LCase(Wb.Name) = "servizi.xls" or "serviziA.xls" Then
          Dim sName As String
          sName = "j:Documentiservizi_" & Format(Now, "yyyymmdd_hhmmss") & ".xls"
          Wb.SaveCopyAs sName
          MsgBox "ho salvato una copia con nome " & sName
        End If
    End Sub
    
    Private Sub Class_Terminate()
        Set App = Nothing
    End Sub



  • di Vecchio Frac data: 25/03/2015 11:40:25

    Hai sbagliato l'utilizzo dell'operatore Or, devi essere esplicita a chiarire quali termini vanno messi in "or" tra loro.
    Vedi correzione.
     
    If LCase(Wb.Name) = "servizi.xls" or LCase(Wb.Name) = "serviziA.xls" Then






  • di Vecchio Frac data: 25/03/2015 11:41:24

    Scusa Lisa, mi è scappato il solito errore...
    ...naturalmente se parli di LCase tutta la stringa da confrontare va scritta in *minuscolo*
     
    If LCase(Wb.Name) = "servizi.xls" or LCase(Wb.Name) = "servizia.xls" Then
    






  • di Lisa B. data: 25/03/2015 14:48:21

    Grazie mille

    Prima o poi imparerò anche io



  • di Vecchio Frac data: 25/03/2015 16:45:00

    Lisa ti aspetto qui
    www.excelvba.it/Forum/thread.php?f=1&t=8408






  • di Lisa B. data: 27/03/2015 05:11:57

    Scusa V.Frac... Solo ora mi collego dopo il mio ultimo messaggio... Ho avuto giornate piene

    Ritornando al VBA in oggetto... Se invece del file chiamato Servizi.xls o ServiziA.xlsx volessi che creasse una copia di tutti i file che nel nome contengono la parola "servizi" e qualsiasi estensioni essi abbiano, è possibile???

    Es

    Imp. Servizi A.xls
    Servizi prova.xlsx
    Prova servizi.xla
    Ecc........



  • di Lisa B. data: 29/03/2015 14:22:30

    Giusto x far chiarezza... Mi chiedevo se è possibile salvare qualsiasi file xlsx o xls che nel nome contenga la parola "servizi"

    Non mi interessa come li salva... Nel senso che mi va bene il nome gia assegnato e l'estensione xls

    Volevo solo capire come intervenire / modificare la stringa
     
    If LCase(Wb.Name) = "servizi.xls" or LCase(Wb.Name) = "servizia.xls" Then



  • di lepat (utente non iscritto) data: 29/03/2015 14:38:04

    If LCase(Wb.Name) Like "*servizi*" Then



  • di Lisa B. data: 30/03/2015 09:54:41

    Grazie



  • di Lisa B. data: 07/04/2015 09:28:47

    Ciao ragazzi... Sta insorgenza un nuovo problema...

    Mi chiedevo... Oltre che salvare all'apertura del file nella cartella richiesta come fa attualmente (che è perfetto)... È possibile farlo salvare sempre nella stessa cartella al momento del salvataggio del file principale??

    Ipotesi apro il file dalla mia chiavetta e mircea la copia su pc... Ci lavoro... Lo modifico, lo salvo sulla mia.chiavetta e automaticamente me lo salva ancora su PC.

    È possibile?



  • di Lisa B. data: 08/04/2015 13:25:03

    Nessuno mi sa aiutare??