Kill su file aperto

di il
14 risposte

Kill su file aperto

E possibile chiudere un file excel in uso che devo eliminare, prima di rigenerarlo di nuovo mediante lettura di una tabella.

Ovviamente il file e contenuto in una directory di rete.

14 Risposte

  • Re: Kill su file aperto

    Si, devi cercarlo nella Collection Application.Workbooks, ammesso di avere una singola istanza di Application.

    Ma la domanda è: perché non lo aggiorni da aperto invece di chiuderlo, eliminarlo, ricrearlo (e probabilmente riaprirlo)?

    Ma soprattutto: perché siamo in questa sezione e non in quella dedicata ad Excel?

  • Re: Kill su file aperto

    Che c'entrano i database??

  • Re: Kill su file aperto

    Ho scritto in questa sezione, perché  io popolo un foglio Excel leggendo una tabella di access per cui mi sembrava la più appropriata.

    Ho qualche difficoltà, dovuta alla mie lacune, ad aggiornarlo da aperto  per cui pensavo di eliminarlo e poi rigenerarlo. Ma anche in quest'ultimo caso non so come se possa fare, ed in caso affermativo quale strada seguire.

  • Re: Kill su file aperto

    06/11/2023 - Scolaretto ha scritto:


    mi sembrava la più appropriata.

    No, assolutamente. 

    Allora, dato che il PC è collegato alla presa elettrica, potevi scrivere nella sezione hardware.

    06/11/2023 - Scolaretto ha scritto:


    dovuta alla mie lacune, ad aggiornarlo da aperto

    Dovresti colmare queste lacune e non scegliere metodi che hanno poco senso.

  • Re: Kill su file aperto

    06/11/2023 - Scolaretto ha scritto:


    anche in quest'ultimo caso non so come se possa fare, ed in caso affermativo quale strada seguire.

    Una traccia te l'ho lasciata. Hai voglia di provare e farci sapere le difficoltà specifiche che incontri? Diversamente, il tema è vasto e non ti si riesce ad aiutare di più.

    Comincia a prendere spunto da qui

  • Re: Kill su file aperto

    06/11/2023 - Scolaretto ha scritto:


    E possibile chiudere un file excel in uso che devo eliminare, prima di rigenerarlo di nuovo mediante lettura di una tabella.

    Ovviamente il file e contenuto in una directory di rete.

    Ciao,

    non mi è chiaro il flusso che hai rappresentato…

    E possibile chiudere un file excel in uso 

    Si è possibile, ma da chi è usato ? 

     devo eliminare, prima di rigenerarlo di nuovo 

    Si, puoi eliminarlo e ricrearlo. Conosci il percorso e nome del file ? 

    mediante lettura di una tabella.

    Cioè, che vuol dire ? … hai il fullpath del file in una tabella ?  …  il file excel verrà popolato dai records di una tabella ? 

    Ovviamente il file e contenuto in una directory di rete.

    Non ci sono problemi se si trova in locale o in rete … basta avere le autorizzazioni di accesso 

  • Re: Kill su file aperto

    Io devo popolare il file un file excel dai records presenti in una tabella e precedentemente selezionanti ed salvati in un set.

    Per generare un nuovo file excel faccio questo

      FileName = "C:\archivio\File Excel\RiepilogoColtureAnni.xlsx"
      On Error Resume Next
      Set exc = GetObject(, "Excel.application")
      If Err.Number <> 0 Then
           If Dir(FileName, vbDirectory) <> "" Then
               Kill (FileName)
           End If
           Set exc = CreateObject("Excel.application")
       End If
       Err.Clear
       On Error GoTo 0
       exc.Visible = False ' se setto vero mi apre il file excel in questione
       Set xlw = exc.Workbooks.Add
       Set xls = xlw.Worksheets(1)

    Ovviamente la kill funziona solo il file non è utilizzato da nessuno , quindi o incremento il tipo di errore ed abortisco la procedura,  oppure trovi il sistema di eliminare il file prima di rigenerarlo. Il  filename  è la path per trovare il file e nel mio esempio contiene un percorso  locale ma lo stessa variabile  può contenere un repository di rete.

  • Re: Kill su file aperto

    Ciao,

    … devi chiudere il file excel dopo il Set exc
    utilizzerai .Close ed eventualmente .Quit dell'oggetto workbook e dell'app excel
    in fase di close devi controllare se salvare o no i cambiamenti in corso sul file excel
    e controllare che effettivamente sia il file da chiudere perchè nella collection possono esserci altri file excel aperti dall'utete

  • Re: Kill su file aperto

    Grazie

  • Re: Kill su file aperto

    06/11/2023 - Scolaretto ha scritto:


    Il  filename  è la path per trovare il file e nel mio esempio contiene un percorso  locale ma lo stessa variabile  può contenere un repository di rete.

    Questa considerazione che hai sottolineato apre uno scenario diverso e richiede un approccio diverso.

    Se il file excel è in locale (nel tuo computer dove apri il file excel) basterebbe eseguire una semplice funzione:

    • si controlla se l'applicazione excel è aperta
    • si controlla se il file è aperto
    • si chiude il file 
    • e se è necessario si può implementare per chiudere l'applicazione excel e/o cancellare il file excel, etc etc etc…

    Esempio… si può creare una piccola funzione di questo tipo dove, passando il parametro fullpath del file excel da chiudere, si possono eseguire i passi di cui sopra: impostata come function puoi fare in modo che ritorni un stringa con l'eventuale errore o esito dell'operazione, oppure un valore booleano per indicare se il file è stato chiuso oppure no, etc etc etc…. pertanto implementare per gestire eventuali errori da ritornare e da monitore…

    ' CLOSE EXCEL FILE
    Function MyCloseExcelFile(strFullPath As String)
    Dim xlApp As Object
    Dim xlWorkbook As Object
    
    On Error Resume Next
    ' set obj excel application
    Set xlApp = GetObject(, "Excel.Application")
    ' check excel application is open
    If Not xlApp Is Nothing Then
        ' search excel file open
        For Each xlWorkbook In xlApp.Workbooks
            If xlWorkbook.FullName = strFullPath Then
                ' excel close
                xlWorkbook.Close SaveChanges:=False
                Exit For
            End If
        ' next workbook
        Next xlWorkbook
    End If
    
    ' obj clear
    Set xlWorkbook = Nothing
    Set xlApp = Nothing
    On Error GoTo 0
    End Function

    Se il file excel è condiviso in un percorso di rete e un altro utente lo apre dal proprio computer, l'approccio deve cambiare perchè la function di cui sopra ovviamente non funzionerà

    In questo caso è necessario, e si può mandare in esecuzione il comando sempre da Vba, creare per esempio uno script PowerShell o un semplice Batch oppure una script in VbScript esterno che forzerà la chiusura del file excel (del processo che lo tiene aperto)

    A questo punto ci si deve preoccupare di cosa accade nel computer dove l'utente tiene aperto il file excel. Questa operazione in background che chiude il processo excel, può essere implementato per gestire un mesaggio di notifica all'utente oppure no, insomma… come meglio preferisci.

  • Re: Kill su file aperto

    Ho cambiato sezione alla discussione 

  • Re: Kill su file aperto

    Prima di tutto ti ringrazio per la soluzione, che ovviamente funziona, sarebbe bello che arrivasse un Messaggio all'utente e poi chiudere il file lasciando aperto excel, nel caso l'utente avesse in elaborazione altri file. Tutto bello però io non sono in grado di sviluppare tale procedura. 

  • Re: Kill su file aperto

    07/11/2023 - Scolaretto ha scritto:


    Prima di tutto ti ringrazio per la soluzione, che ovviamente funziona, sarebbe bello che arrivasse un Messaggio all'utente e poi chiudere il file lasciando aperto excel, nel caso l'utente avesse in elaborazione altri file. Tutto bello però io non sono in grado di sviluppare tale procedura. 

    In Vba puoi utilizzare delle API per rintracciare il processo e terminarlo. 
    Se non vuoi usare le Api, personalmente te lo sconsiglio, con degli scripot da richiamare in Vba per eseguirli, puoi rintracciare e terminare il processo. 
    Esempio: (strFileTerminate sarà la fullpath, completo di nome del file excel, per il quale terminare il processo, da passare come parametro per esempio ad un VbScript da richiamare nel codice del VBA)

    ' check if excel file exists
    If objFSO.FileExists(strFileTerminate) Then
       ' set list excel processes
       Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
       Set listProcess = objService.ExecQuery("Select * from Win32_Process Where Name = 'EXCEL.EXE'")
       ' enumerate the processes excel and kill the process if it exists
       For Each objProcess in listProcess 
           If InStr(objProcess.CommandLine, strFileTerminate) > 0 Then
               objProcess.Terminate
           End If
       Next
    End If

    Implementando con tale approccio è possibile individuare il nome del computer che sta utilizzando quel processo di excel che è stato specificato di terminare, ed inviare al coputer della rete, se predisposto, per esempio un messaggio di popup per indicare che il processo è stato terminato per un certo motivo che vuoi comunicare.

    Per esempio una cosa di questo tipo… dove per 10 secondi apparirà un messaggio con l'icona di Information

    ' send message
    objShell.Popup "Message...", 10, "Title...", 48

    Insomma… si possono fare tante cose, bisogna studiare i metodi, avere le autorizzazione di accesso ai file e ai computer remoti, etc etc … anche con altri metodi e approcci si possono fare le stesse cose. (questi sopra riportati sono solo delle tracce in vbscript)

  • Re: Kill su file aperto

    Grazie mille mi metto a provare e capire il tutto.

Devi accedere o registrarti per scrivere nel forum
14 risposte