Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    18

    [VB2005] Chiudere un file excel

    Salve a tutti, sto facendo un programmino per la mia azienda che gestisca le timbrature dei dipendenti e l'attribuzione delle loro ore di lavoro alle varie commesse, facendo riferimento a dei dati contenuti in alcuni fogli excel, che vorrei venissero salvati e chiusi. Quanto al salvataggio tutto sembra funzionare, ma dal task manager vedo che i processi EXCEL.exe restano attivi. Sapete darmi un consiglio?!

    codice:
    Public Class Main
        Dim codice
        Dim ulter As Boolean = True
        Dim tick = 0
        Dim tick2 = 0
        Dim tick3 = 0
        Dim XLS_Cartel3 As New Microsoft.Office.Interop.Excel.Application()
        Dim aperto As Boolean = False
        Dim Indice As Integer = 1
        Dim passo As Integer = 0
    
        Private Sub Main_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    
            If aperto = True Then
                XLS_Cartel3.ActiveWorkbook.Save()
                XLS_Cartel3.Workbooks.Close()
    
            End If
        End Sub
    
        Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            XLS_Cartel3.Workbooks.Open("C:\Cartel3")
            XLS_Cartel3.Worksheets(1).Select()
            aperto = True
    
    
            Me.TextBox3.Focus()
            Me.TextBox2.Enabled = False
            Me.TextBoxNome.Enabled = False
            Me.Timer2.Enabled = True
            Me.Timer2.Interval = 1000
            Me.Timer2.Start()
            Me.Timer3.Enabled = True
            Me.Timer3.Interval = 1000
           
        End Sub
        Private Sub Timer2_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer2.Tick
            'gestione orologio del form
            Me.TextBox2.Text = Mid$(My.Computer.Clock.LocalTime, 12, 5)
        End Sub
    
        Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            'gestione temporizzatore del form
            tick += 1
            If tick = 2 Then
                tick = 0
                Me.TextBox3.Text = Nothing
                Me.TextBox1.Text = Nothing
                Me.TextBoxNome.Text = Nothing
                Me.TextBox3.Enabled = True
                Me.TextBox1.Enabled = True
                Me.TextBox3.Focus()
            End If
        End Sub
    
        Private Sub Main_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
            Me.TextBox1.Location = New System.Drawing.Point(Me.Size.Width * 0.758, Me.Size.Height * 0.233)
            Me.TextBox1.Font = New Font(Font.FontFamily, Me.Size.Height * 0.087)
            Me.TextBox1.Size = New Size(Me.Size.Height * 0.173, 47)
            '
            Me.TextBox2.Location = New System.Drawing.Point(Me.Size.Width * 0.758, Me.Size.Height * 0.41)
            Me.TextBox2.Font = New Font(Font.FontFamily, Me.Size.Height * 0.0275)
            Me.TextBox2.Size = New Size(Me.Size.Height * 0.173, 20)
    
            Me.TextBox3.Location = New System.Drawing.Point(Me.Size.Width * 1.5, Me.Size.Height * 0.2)
            Me.TextBox3.Font = New Font(Font.FontFamily, Me.Size.Height * 0.0275)
            Me.TextBox3.Size = New Size(Me.Size.Height * 0.173, 20)
    
            Me.TextBoxNome.Location = New System.Drawing.Point(Me.Size.Width * 0.725, Me.Size.Height * 0.1)
            Me.TextBoxNome.Font = New Font(Font.FontFamily, Me.Size.Height * 0.025)
            Me.TextBoxNome.Size = New Size(Me.Size.Height * 0.42, 21)
    
            Me.Button1.Location = New System.Drawing.Point(Me.Size.Width * 0.84, Me.Size.Height * 0.5)
        End Sub
        Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged
            'routine memorizzazione codice dipendente e gestione timbrature
    
            Dim c As Integer
            Dim esc As Boolean
    
    
    
    
            If Me.TextBox3.Text.Length = 17 Then
                My.Computer.Audio.PlaySystemSound(System.Media.SystemSounds.Beep)
                TextBox1.Text = Mid$(Me.TextBox3.Text, 15, 2)
                codice = TextBox1.Text
                Form1.TextBox6.Text = codice
                c = 1
                esc = False
                Do
                    If CInt(XLS_Cartel3.Cells(c, 6).value) = codice Then
                        TextBoxNome.Text = XLS_Cartel3.Cells(c, 14).value
                        esc = True
                    Else
                        If XLS_Cartel3.Cells(c + 1, 6).value = 0 Then
                            esc = True
                        Else
                            c += 1
                        End If
                    End If
    
                Loop Until esc = True
                Me.TextBox3.Enabled = False
                Me.TextBox1.Enabled = False
                Me.TextBoxNome.Enabled = False
                Me.Timer1.Enabled = True
                Me.Timer1.Interval = 1000
                Me.Timer1.Start()
    
                Timbratura(codice)
    
            End If
        End Sub
        Private Sub Timbratura(ByVal codice As Integer)
            'routine per aggiornamento del numero delle timbrature del dipendente
            Dim Escape = Nothing
            Dim ore As Integer
            Dim min As Integer
            Dim Result As MsgBoxResult
    
    
    
            ore = My.Computer.Clock.LocalTime.Hour
            min = My.Computer.Clock.LocalTime.Minute
    
    
            Do
                Escape = XLS_Cartel3.Cells(Indice + 1, 6).value
                If XLS_Cartel3.Cells(Indice, 6).value = codice Then
    
    
                    'Incremento del numero di timbrature
                    XLS_Cartel3.Cells(Indice, 7).value = XLS_Cartel3.Cells(Indice, 7).value + 1
    
                    If XLS_Cartel3.Cells(Indice, 7).value = 1 Then
                        XLS_Cartel3.Cells(Indice, 8).value = ore & " : " & min
    
    
                    ElseIf XLS_Cartel3.Cells(Indice, 7).value = 3 Then
                        Me.Timer3.Stop()
                        'MsgBox(tick3)
                        tick3 = 0
                        XLS_Cartel3.Cells(Indice, 10).value = ore & " : " & min
                        Me.Timer3.Start()
                        Me.Button1.Visible = False
    
                    ElseIf XLS_Cartel3.Cells(Indice, 7).value = 5 Then
                        Me.Timer3.Stop()
                        'MsgBox(tick3)
                        tick3 = 0
                        XLS_Cartel3.Cells(Indice, 12).value = ore & " : " & min
                        Me.Timer3.Start()
                        Me.Button1.Visible = False
                    ElseIf XLS_Cartel3.Cells(Indice, 7).value = 2 Then
                        Me.Timer3.Stop()
    
                        tick3 = 0
                        XLS_Cartel3.Cells(Indice, 9).value = ore & " : " & min
                        Me.Timer3.Start()
                        Me.Button1.Visible = True
                        passo = 9
                    ElseIf XLS_Cartel3.Cells(Indice, 7).value = 4 Then
                        Me.Timer3.Stop()
    
                        tick3 = 0
                        XLS_Cartel3.Cells(Indice, 11).value = ore & " : " & min
                        'XLS.Cells(Indice, 11).value = "19 : 00"
    
                        Me.Timer3.Start()
                        Me.Button1.Visible = True
                        passo = 11
                 
                    ElseIf XLS_Cartel3.Cells(Indice, 7).value = 6 Then
                        Me.Timer3.Stop()
    
                        tick3 = 0
                        XLS_Cartel3.Cells(Indice, 13).value = ore & " : " & min
                        Me.Timer3.Start()
                        Me.Button1.Visible = True
                        passo = 13
                    
                    End If
                    Exit Do
                ElseIf XLS_Cartel3.Cells(Indice, 6).value <> codice And Escape Is Nothing Then
                    MsgBox("Numero Badge Inesistente", MsgBoxStyle.Critical, "Attenzione")
                End If
                Indice += 1
            Loop Until Escape Is Nothing
    
    
    
        End Sub
    
        Public Function Approx_Difetto(ByVal minuti As Integer)
            'routine per l'approssimazione in difetto(al quarto d'ora precedente)della timbratura
    
            If minuti > 0 And minuti <= 15 Then
                minuti = 0
            ElseIf minuti > 15 And minuti <= 30 Then
                minuti = 15
            ElseIf minuti > 30 And minuti <= 45 Then
                minuti = 30
            ElseIf minuti > 45 And minuti <= 59 Then
                minuti = 45
            End If
    
            Return (minuti)
        End Function
    
        Private Sub Timer3_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            tick3 += 1
        End Sub
        Private Sub calcolo_ore_lavoro(ByVal indice)
            Dim ah, bh, ch, am, bm, cm As Integer
            Dim th, tm As Integer
            Dim zm As Double
            Dim pizm, Approx As Integer
    
    
    
            ah = Mid$(XLS_Cartel3.Cells(indice, 9).value, 1, 2) - Mid$(XLS_Cartel3.Cells(indice, 8).value, 1, 2)
            th = ah
    
            If passo = 11 Then
    
                bh = Mid$(XLS_Cartel3.Cells(indice, 11).value, 1, 2) - Mid$(XLS_Cartel3.Cells(indice, 10).value, 1, 2)
                th = ah + bh
    
            ElseIf passo = 13 Then
    
                ch = Mid$(XLS_Cartel3.Cells(indice, 13).value, 1, 2) - Mid$(XLS_Cartel3.Cells(indice, 12).value, 1, 2)
                th = ah + bh + ch
    
            End If
    
    
    
            If Mid$(XLS_Cartel3.Cells(indice, 9).value, 5, 2) < Mid$(XLS_Cartel3.Cells(indice, 8).value, 5, 2) Then
                am = 60 + Mid$(XLS_Cartel3.Cells(indice, 9).value, 5, 2) - Mid$(XLS_Cartel3.Cells(indice, 8).value, 5, 2)
                th = th - 1
            Else
    
                am = Mid$(XLS_Cartel3.Cells(indice, 9).value, 5, 2) - Mid$(XLS_Cartel3.Cells(indice, 8).value, 5, 2)
            End If
            tm = am
    
            If passo = 11 Then
    
                If Mid$(XLS_Cartel3.Cells(indice, 11).value, 5, 2) < Mid$(XLS_Cartel3.Cells(indice, 10).value, 5, 2) Then
                    bm = 60 + Mid$(XLS_Cartel3.Cells(indice, 11).value, 5, 2) - Mid$(XLS_Cartel3.Cells(indice, 10).value, 5, 2)
                    th = th - 1
                Else
                    bm = Mid$(XLS_Cartel3.Cells(indice, 11).value, 5, 2) - Mid$(XLS_Cartel3.Cells(indice, 10).value, 5, 2)
                End If
                tm = am + bm
    
            ElseIf passo = 13 Then
                If Mid$(XLS_Cartel3.Cells(indice, 13).value, 5, 2) < Mid$(XLS_Cartel3.Cells(indice, 12).value, 5, 2) Then
                    cm = 60 + Mid$(XLS_Cartel3.Cells(indice, 13).value, 5, 2) - Mid$(XLS_Cartel3.Cells(indice, 12).value, 5, 2)
                    th = th - 1
                Else
                    cm = Mid$(XLS_Cartel3.Cells(indice, 13).value, 5, 2) - Mid$(XLS_Cartel3.Cells(indice, 12).value, 5, 2)
                End If
    
                tm = am + bm + cm
    
            End If
    
    
            zm = tm / 60
            pizm = Int(zm)
    
            th = th + pizm
            tm = tm - 60 * pizm
    
            Approx = Approx_Difetto(tm)
            tm = Approx
            Form1.TextBox7.Text = th
            Form1.TextBox8.Text = tm
            Form1.TextBox9.Text = XLS_Cartel3.Cells(indice, 5).value
    
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            Me.Timer1.Stop()
            Me.Timer3.Stop()
            ulter = False
    
            calcolo_ore_lavoro(Indice)
    
            'azzera timbrature 
            For passo = 7 To 13
                XLS_Cartel3.Cells(Indice, passo) = Nothing
            Next
            XLS_Cartel3.ActiveWorkbook.Save()
            XLS_Cartel3.Workbooks.Close()
            aperto = False
    
            Form2.Show()
            Form1.Show()
            Me.Button1.Visible = False
            Me.Hide()
    
    
    
        End Sub
    
    
    End Class

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Teoricamente dovresti aggiungere alla fine:
    codice:
    Sub ElaboraExcel
    
     NAR(wbooks)
                NAR(wbook)
                NAR(wsheet)
                XLS_Cartel3.Workbooks.Close()
                XLS_Cartel3.Quit()
                NAR(XLS_Cartel3)
    
                ' Cleanup:
    
                GC.Collect()                        ' <-- Added
                GC.WaitForPendingFinalizers() ' <-- Added
    End sub
    
     Private Sub NAR(ByVal o As Object)
            Try
                System.Runtime.InteropServices.Marshal.ReleaseComObject(o)
            Catch
            Finally
                o = Nothing
            End Try
        End Sub
    Vedi se funzia....
    Sbagliare è umano, perseverare è diabolico.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    18
    Grazie, la cosa sembra funzionare...ma solo se prima NON è previsto un salvataggio del tipo:

    codice:
    XLS_Cartel3.ActiveWorkbook.Save()
    ElaboraExcel()
    In questo caso infatti nel task manager il processo EXCEL.exe resta attivo. E, purtroppo, io ho assoluto bisogno di salvare il file.

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Guarda facendola sporca potresti anche intercettare il processo e chiuderlo con un Process.kill, il problema nasce se hai già in uso Excel per altre cose, in quel caso verrebbe chiuso anche quellio. Potresti forse intercettare il titolo della finestra di Excel e se corrisponde al tuo (forse il titolo della finestra nel tuo caso sarebbe una stringa vuota) e in quel caso chiudere il processo.
    Prova.
    Sbagliare è umano, perseverare è diabolico.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    18
    Perdonami, non ho ben capito il tuo suggerimento...
    Comunque credo di aver intuito che il problema risieda nel fatto che la variabile a cui associo l'applicazione excel è di tipo globale (sono costretto a fare in questo modo visto che più subroutine richiamano dati presenti in Cartel3.exe)

    codice:
    Public Class Main
        Dim codice
        Dim ulter As Boolean = True
        Dim tick = 0
        Dim tick2 = 0
        Dim tick3 = 0
        Dim XLS_Cartel3 As New Microsoft.Office.Interop.Excel.Application() 
        Dim aperto As Boolean = False
        Dim Indice As Integer = 1
        Dim passo As Integer = 0
    e che per questo non viene disallocata da metodi presenti nelle subroutine stesse. Deve esistere necessariamente una scappatoia che mi permetta di dire al programma che quella variabile globale non mi serve più...ma quale?!

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    e che per questo non viene disallocata da metodi presenti nelle subroutine stesse. Deve esistere necessariamente una scappatoia che mi permetta di dire al programma che quella variabile globale non mi serve più...ma quale?!
    Lo fai già col codice che ti avevo postato mi sembra...
    Sbagliare è umano, perseverare è diabolico.

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    18
    Sì, ma senza la possibilità di salvare...o meglio, di salvare e chiudere il file consecutivamente...per cui la domanda è: si può salvare un file associato ad una variabile globale e poi disallocare la memoria dedicata a quest'ultima?

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    18
    Nessuno sa darmi una mano?! Le sto provando tutte ma con scarsi risultati...vi ringrazio anticipatamente...

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    18
    Riprendo questo mio post un po' vecchiotto perchè mi trovo a dover risolvere lo stesso problema, aggirato in passato con un "kill"...chiudere gli Excel.exe attivati dal programma, una volta terminata la lettura/scrittura...questa volta non posso "killarli" perchè i files excel risiedono su un server e chiuderei ogni processo Excel.exe, anche quelli utilizzati da altri utenti in rete che non interagiscono con il software che sto realizzando...vi allego un esempio di codice che ricalca la linea che sto seguendo:

    codice:
        Public Class Form2
    
        Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            Dim XLS_C3 As New Microsoft.Office.Interop.Excel.Application
        
    
            XLS_C3.Workbooks.Open("C:\Cartel3")
            XLS_C3.Worksheets(1).Select()
    
    
            XLS_C3.Cells(1, 20).value = "Ciao"
    
            XLS_C3.ActiveWorkbook.Save()
            XLS_C3.Workbooks.Close()
            XLS_C3.Quit()
            NAR(XLS_C3)
           
    
    
    
        End Sub
    
        Private Sub NAR(ByVal o As Object)
    
            Try
    
                System.Runtime.InteropServices.Marshal.ReleaseComObject(o)
    
            Catch ex As Exception
    
            Finally
    
                o = Nothing
    
            End Try
    
        End Sub
    
    End Class

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    18
    Nessuno conosce una strada possibile da seguire?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.