Я использую код followiwing сделать некоторые копирования и вставки с Excel файлов:Невозможно убить первенствует процессов
Imports Excel = Microsoft.Office.Interop.Excel
Imports System.IO
Imports System.Runtime.InteropServices
Private Sub btnCombine_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCombine.Click
Dim xlAppSource As New Excel.Application
Dim xlAppTarget As New Excel.Application
Dim xlWbSource As Excel.Workbook
Dim xlWbTarget As Excel.Workbook
Dim xlsheetSource As Excel.Worksheet
Dim xlsheetTarget As Excel.Worksheet
Dim xlRangeSource As Excel.Range
Dim xlRangeTarget As Excel.Range
Dim Progress As Integer = 0
pbrProgress.Minimum = 0
pbrProgress.Maximum = amountOfFiles
btnCombine.Enabled = False
btnSelect.Enabled = False
pbrProgress.Visible = True
getSaveLocation()
MakeExcelFile()
'loop through all excel files to get the required data
For i = 0 To amountOfFiles - 1
Dim CurrentFile As String = strFileNames(i)
Dim IntAmountOfRows As Integer = amountOfRows(CurrentFile)
Dim intStartOfEmptyRow As Integer = amountOfRows(SummaryLocation)
xlAppSource.DisplayAlerts = False
xlAppTarget.DisplayAlerts = False
'Set current workbook
xlWbSource = xlAppSource.Workbooks.Open(CurrentFile)
xlWbTarget = xlAppTarget.Workbooks.Open(SummaryLocation)
'set current worksheet
xlsheetSource = xlWbSource.ActiveSheet
xlsheetTarget = xlWbTarget.ActiveSheet
'copy range of data from source to target file
xlRangeSource = xlsheetSource.Range("A2:k" & IntAmountOfRows)
xlRangeSource.Copy()
xlRangeTarget = xlsheetTarget.Range("A" & intStartOfEmptyRow)
xlRangeTarget.PasteSpecial(Excel.XlPasteType.xlPasteValues)
'save summary file before closing
xlsheetTarget.SaveAs(SummaryLocation)
'updating progress bar
Progress = Progress + 1
pbrProgress.Value = Progress
Next
'close excel
xlWbSource.Close(True)
xlWbTarget.Close(True)
xlAppSource.Quit()
xlAppTarget.Quit()
xlAppSource.DisplayAlerts = True
xlAppTarget.DisplayAlerts = True
'Cleanup
Marshal.ReleaseComObject(xlAppSource)
Marshal.ReleaseComObject(xlAppTarget)
Marshal.ReleaseComObject(xlWbSource)
Marshal.ReleaseComObject(xlWbTarget)
Marshal.ReleaseComObject(xlsheetSource)
Marshal.ReleaseComObject(xlsheettarget)
Marshal.ReleaseComObject(xlRangeSource)
Marshal.ReleaseComObject(xlRangeTarget)
xlAppSource = Nothing
xlAppTarget = Nothing
xlWbSource = Nothing
xlWbTarget = Nothing
xlsheetSource = Nothing
xlsheetTarget = Nothing
xlRangeSource = Nothing
xlRangeTarget = Nothing
MsgBox("Samenvoegen compleet")
init()
End Sub
Я попытался каждое решение, приведенная на SO:
- Никогда не использовать 2 очка на линии
- Я попытался с помощью marshall.ReleaseComObject
- Я попытался установить объекты, «Nothing»
Однако каждый раз, когда я запускаю приложение, будет продолжаться 10-20 процессов excel.
Вы забыли tmpSource и tmpTarget. Фактически, они вам не нужны, можно заменить xlWbTarget = tmpTarget.Open (SummaryLocation) с помощью xlWbTarget = xlAppTarget.Workbooks.Open (SummaryLocation). Не уверен относительно точной точки DisplayAlerts после того, как объекты были закрыты. Также вы можете раскомментировать последнюю связку Nothing (по крайней мере, объекты приложения). Если вы все это сделаете, когда вы закроете свое приложение, не будет никакого работающего процесса Excel. – varocarbas
PS: Теперь я понял (после прочтения вашего комментария), что вы создаете/удаляете объекты Excel внутри цикла. Вам не нужно это делать (на самом деле ВЫСОКО НЕРАСПРОСТРАНЕННО, именно из-за проблем, связанных с выпуском объектов Excel); вы можете использовать одни и те же объекты снова и снова и только освобождать их перед закрытием приложения. Если вам нужно открыть разные окна Excel, создайте столько объектов, сколько вам нужно. – varocarbas
Причина, по которой я сделал tmpTarget, состоит в том, что по другому вопросу людям было сказано никогда не использовать более 1 точки (.) С interop – Gutanoth