Buongiorno a tutti,
Sto sviluppando una applicazione WindosForm tramite VisulaSudio 2022 (VB).
Il programma deve aprire in background un file di excel, scrivere dei dati all'interno di alcune celle, salvare il file di excel così aggiornato e chiudere tutto. Sono riuscito ad aprire, scrive e salvare il file di excel, ma non riesco a rilasciare il processo che, dopo la chiusura del file excel, continua a rimanermi appeso (verificato da gestione attività).
Riesco solo a chiudere tutti i processi di excel eventualmente attivi sulla macchina, ma io vorrei chiudere solo quello che ho fatto aprire dal mio programma.
Un aiuto? Posto il codice che ho scritto. Grazie in anticipo.
Public Sub LogCrcCRTT(mtr1() As Single, mtr2() As Single, mtr3() As Single, mtr4() As Single, mtr5() As String, mtr6() As String, mtr7() As String, ByVal qlDIR As String, ByVal opnXLS As Boolean, ByVal clsXLS As Boolean)
' mtr1 ==> Carico
' mtr2 ==> brLNG
' mtr3 ==> brTRS
' mtr4 ==> brVER
' mtr5 ==> Descrizione
' mtr6 ==> Cetegoria
' mtr7 ==> Tipo
Dim oXL As Excel.Application
Dim oWB As Excel.Workbook
Dim oSheet As Excel.Worksheet
Dim cXLS As Integer
Dim rXLS As Integer
' Apertura file excel e posizionamento nella sheet desiderata
oXL = CType(CreateObject("Excel.Application"), Excel.Application)
oWB = oXL.Workbooks.Open(My.Application.Info.DirectoryPath & "\ModelloCARICHI1.xlsx")
oSheet = CType(oWB.Sheets("ValoriCARATTERISTICI"), Excel.Worksheet)
For i = 0 To UBound(mtr1)
' Impostazione delle coordinate della cella di riferimento
If mtr7(i) = "PERM" Or mtr7(i) = "PERM_NS" Then
cXLS = 2
rXLS = oSheet.Range("B" & oSheet.Rows.Count).End(Excel.XlDirection.xlUp).Row + 1
ElseIf mtr7(i) = "VAR" Then
cXLS = 10
rXLS = oSheet.Range("J" & oSheet.Rows.Count).End(Excel.XlDirection.xlUp).Row + 1
Else
cXLS = 18
rXLS = oSheet.Range("R" & oSheet.Rows.Count).End(Excel.XlDirection.xlUp).Row + 1
End If
' Scrittura nelle celle a partire da quella di riferimento
oSheet.Cells(rXLS, cXLS) = mtr1(i)
oSheet.Cells(rXLS, cXLS + 1) = mtr2(i)
oSheet.Cells(rXLS, cXLS + 2) = mtr3(i)
oSheet.Cells(rXLS, cXLS + 3) = mtr4(i)
oSheet.Cells(rXLS, cXLS + 4) = mtr5(i)
oSheet.Cells(rXLS, cXLS + 5) = mtr6(i)
oSheet.Cells(rXLS, cXLS + 6) = qlDIR
Next
' salvo e chiudo il file excel
oWB.Save()
oWB.Close()
oXL.Quit()
' chiudo tutti i processi excel aperti.
' funziona ma non è quello che voglio.
' vorrei chiudere solo il processo excel associato a oXL
Dim myProcesses() As Process
Dim myProcess As Process
' Restituisce un'array con tutti i processi
myProcesses = Process.GetProcessesByName("excel")
'chiude ogni processo
For Each myProcess In myProcesses
myProcess.CloseMainWindow()
End If
Next
' rilascio le variabili associate ad excel
oSheet = Nothing
oWB = Nothing
oXL = Nothing
End Sub