+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Chiudere singolo file aperto in excel

  1. #1
    giunespo non è in linea Novello
    Post
    45

    Chiudere singolo file aperto in excel

    Buonasera a tutti, ho un problema per chiudere un singolo file aperto in Excel.
    Provo a spiegarmi, quello che vorrei ottenere è:
    - verifico se un file di Excel è aperto
    - se si, dopo un tempo limitato in cui non ricevo conferme da parte dell'utilizzatore, lo devo chiudere salvandolo


    Per la verifica del file aperto faccio così (percorsoFile e NomeFile sono 2 variabili):
    codice:
      
      Private Function VerificaFileAperto(percorsoFile As String) As Boolean
            Try
                Using fis As FileStream = File.Open(percorsoFile & NomeFile, FileMode.Open, FileAccess.Read, FileShare.None)
    
                End Using
                VerificaFileAperto = False
    
            Catch ex As Exception
                VerificaFileAperto = True
            End Try
    
        End Function
    Per la chiusura del file invece vorrei fare così (CONTATORE variabile globale che uso come timer e filedacontrollare contiene in nome del file da chiudere):

    codice:
      
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    
            If CONTATORE > 1 Then
                CONTATORE = CONTATORE - 1
                conto.Text = "Termine tra ... " & CONTATORE & " sec."
            Else
                Timer1.Stop()
                Dim proc As System.Diagnostics.Process
                For Each proc In System.Diagnostics.Process.GetProcessesByName("EXCEL")
                   If proc.MainWindowTitle.Contains(fileDaControllare) Then
                        proc.Kill()
                    End If
                    'Next
                Next
                Close()
            End If
        End Sub
    Il tutto funziona ma il killeraggio di Excel viene fatto per tutti i file Excel aperti, io vorrei chiudere (salvandolo) solo il file di mio interesse. Cosa dovrei usare al posto di Kill?
    Grazie mille per qualunque dritta o aiuto.

  2. #2
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,313
    Blogs
    5
    Devi adottare un altro metodo ovvero collegarti all'istanza di excel in esecuzione e controllare l'esistenza e la chiusura del file tramite gli opportuni metodi dell'interfaccia.

    Parti da questo
    https://xldennis.wordpress.com/2007/...f-excel-in-vb/

    per capire cosa intendo. Ovviamente dovrai lavorarci su
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  3. #3
    giunespo non è in linea Novello
    Post
    45
    Grazie, provo e poi ti aggiorno
    Buona domenica

  4. #4
    giunespo non è in linea Novello
    Post
    45
    Ciao Antonio, c'è qualcosa che mi sfugge, ho provato ad utilizzare i suggerimenti contenuti nel tuo link.
    Mi imbatto subito in un problema (per la verità c'era già anche nella mia versione ma me ne sono accorto ora).
    Riposto la funzione che dovrebbe verificare se un file di Excel è aperto:
    codice:
        Private Function VerificaSeAperto(NomeDocumento As String) As Boolean
            Dim xlapp As Excel.Application
            VerificaSeAperto = False
            Try
                Dim numeroistanze As Integer = Process.GetProcessesByName("Excel").Length
                If Process.GetProcessesByName("Excel").Length > 0 Then
                    Dim processiexcel() As Process = Process.GetProcessesByName("Excel")
                    For Each procs As Process In processiexcel
                        xlapp = CType(GetObject(, "Excel.application"), Excel.Application)
                        If xlapp.Caption.Contains(NomeDocumento) Then
                            VerificaSeAperto = True
                        End If
                    Next
                End If
            Catch ex As Exception
            End Try
        End Function
    Ho verificato che effettivamente, a prescindere da quanti file Excel siano aperti, Process.GetProcessesByName("Excel").Length restituisce sempre 1 (sempre l'ultimo file aperto, o meglio il file attivo in quel momento in Excel)
    Dove sbaglio? Dipende dalla versione di Office? Io attualmente utilizzo la 2013, ma i clienti potrebbero avere versioni diverse sui vari PC

    Grazie

  5. #5
    giunespo non è in linea Novello
    Post
    45
    Finalmente ci sono riuscito, di seguito le 2 funzioni per verificare se il file è aperto e per chiuderlo senza killare Excel

    Funzione per verificare se il file è aperto:

    codice:
       Private Function VerificaFileAperto(NomeFileAperto As String) As Boolean
            Try
                VerificaFileAperto = False
                If Process.GetProcessesByName("Excel").GetLength(0) > 0 Then
                    Dim processiexcel As Excel.Application
                    processiexcel = CType(GetObject(, "Excel.application"), Excel.Application)
                    Dim stringa As String
                    For j = 1 To processiexcel.Workbooks.Count
                        stringa = processiexcel.Workbooks(j).Name
                        If stringa = NomeFileAperto Then
                            VerificaFileAperto = True
                        End If
                    Next
                End If
            Catch ex As Exception
                Dim pulsa As Integer
                pulsa = MsgBox("Errore: " & ex.Message, vbCritical, "Errore")
                VerificaFileAperto = False
            End Try
        End Function
    Porzione di codice per chiudere il file senza chiudere tutto Excel (nel mio programma non potevo farlo al momento della verifica, è praticamente identico alla ricerca, salvo chiudere quando lo trova):

    codice:
               Try
                    If Process.GetProcessesByName("Excel").GetLength(0) > 0 Then
                        Dim processiexcel As Excel.Application
                        processiexcel = CType(GetObject(, "Excel.application"), Excel.Application)
                        Dim stringa As String
                        For j = 1 To processiexcel.Workbooks.Count
                            stringa = processiexcel.Workbooks(j).Name
                            If stringa = NomeFileAperto Then
                                processiexcel.Workbooks(j).Save()
                                processiexcel.Workbooks(j).Close()
                            End If
                        Next
                    End If
                Catch ex As Exception
                    Dim pulsa As Integer
                    pulsa = MsgBox("Errore: " & ex.Message, vbCritical, "Errore")
                End Try
                Close()
    Grazie mille Antonio della dritta.

  6. #6
    patel45 non è in linea Scolaretto Ultimo blog: recupero dati da pagina html
    Post
    317
    Blogs
    1
    Grazie a te per aver postato la soluzione

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi