2017-08-22 2 views
2

Der Excel-Prozess hört nicht auf zu laufen, nachdem ich mein Outlook VBA-Makro ausgeführt habe. Ich vermute, dass es durch einige Excel-Objektfunktionen verursacht wird, aber ich bin mir nicht sicher, welche. Das Problem manifestiert sich auch durch Erstellen mehrerer. Tmp-Dateien in dem Ordner, in dem sich meine Excel-Arbeitsmappe befindet. (Ich denke?) Ich werde den Code, den ich zum Öffnen und Schließen von Excel und alle Methoden, die ein Excel verwenden, veröffentlichen Objekt.Excel-Prozess läuft auch nach .Quit

Option Explicit 
Public xlApp As Object 
Public xlWB As Object 
Public xlSheet As Object 

Sub LeaveRequests() 
    Dim enviro As String 
    Dim strPath As String 
    Dim filePath As String 
    Dim bXStarted As Boolean 
    Dim i As Long 
    Dim j As Long 
    'Get Excel set up 
enviro = CStr(Environ("USERPROFILE")) 
'the path of the workbook 
filePath = enviro & "\AppData\Roaming\Microsoft\Outlook\path.txt" 
Open filePath For Input As #1 
Do Until EOF(1) 
    Line Input #1, strPath 
Loop 
Close #1 
    On Error Resume Next 
    Set xlApp = GetObject(, "Excel.Application") 
    If Err <> 0 Then 
     Application.StatusBar = "Please wait while Excel source is opened ... " 
     Set xlApp = CreateObject("Excel.Application") 
     bXStarted = True 
    End If 
    On Error GoTo 0 
    'Open the workbook to input the data 
    Set xlWB = xlApp.Workbooks.Open(enviro & strPath) 
    Set xlSheet = xlWB.Sheets("Sheet1") 
    ' Process the message record 
    On Error Resume Next 
    xlWB.Worksheets("Sheet1").Columns("A:NB").entirecolumn.AutoFit 
    For j = 2 To 367 
     If xlSheet.cells(1, j).Value <> Date And xlSheet.cells(1, j).Interior.ColorIndex = 4 Then 
      xlSheet.Columns(j).Interior.ColorIndex = 0 
     End If 
     If xlSheet.cells(1, j).Value = Date Then 
      xlSheet.Columns(j).Interior.ColorIndex = 4 
      xlSheet.Columns(j).Select 
      If xlSheet.cells(2, j).Value = "Monday" Then 
       For i = 2 To j - 1 
       xlSheet.Columns(i).Hidden = True 
       Next i 
      End If 
    xlWB.Close SaveChanges:=True 
    If bXStarted Then 
     xlApp.Quit 
    End If 
End Sub 

Das ist das Öffnen und Schließen von Excel. Ich habe auch eine Sub, die während einer Posteingang-Iteration in den leaferequests Sub aufgerufen wird.

Sub FillIn(ByVal x As String, ByVal y As Date, ByVal z As Date, ByVal id As String) 
    Dim currentRow As Long 
    Dim i As Long 
    Dim j As Long 
    Dim date1Pos As Integer 
    Dim date2Pos As Integer 
    Dim datePos As Integer 
    Dim lastRow As Integer 
     lastRow = xlSheet.Range("A" & xlSheet.Rows.Count).End(-4162).Row 
     date1Pos = 0 
     date2Pos = 0 
     For i = 3 To lastRow 
      If xlSheet.cells(i, 1).Value = id Then 
       currentRow = i 
       Exit For 
      End If 
     Next i 
      For j = 2 To 367 
       If xlSheet.cells(1, j).Value = y Then 
        date1Pos = j 
       End If 
       If xlSheet.cells(1, j).Value = z Then 
        date2Pos = j 
        Exit For 
       End If 
      Next j 
      If date1Pos <> 0 And date2Pos <> 0 Then 
       datePos = date1Pos 
       For j = 1 To date2Pos + 1 - date1Pos 
        xlSheet.cells(currentRow, datePos).Value = x 
        xlSheet.cells(currentRow, datePos).HorizontalAlignment = xlCenter 
        datePos = datePos + 1 
       Next j 
      End If 
End Sub 
+0

'Für j = 2 bis 367' scheint nicht eine passende haben' Next' –

+0

Es tut, es ist direkt über 'Wenn date1Pos <> 0 und date2Pos <> 0 Then' Ich werde versuchen, den Code einzumessen. – NAlexP

+0

Tut mir leid, ich sehe immer noch nicht das 'Next J' in LeaveRequests –

Antwort

4

Sie haben Ihre Excel-Objektvariablen auf Modulebene und öffentlich erklärt:

Public xlApp As Object 

Das bedeutet: sie ihren Bezug auf Excel halten wird auf unbestimmte Zeit und damit Excel zu verhindern, zu schließen, wenn Sie sie nicht explizit auf Nothing:

Set xlSheet = Nothing 
Set xlWB = Nothing 
Set xlApp = Nothing 

nach dem Schließen der Arbeitsmappe/Excel.

Es wird als bessere Programmierpraxis angesehen, lokale Variablen zu verwenden und diese bei Bedarf an aufgerufene Funktionen zu übergeben (z. B. von LeaveRequests() zu FillIn()).

ZB:

Sub LeaveRequests() 

    Dim xlApp As Object 
    Dim xlWB As Object 
    Dim xlSheet As Object 

    ' stuff, loops, ... 
    Call FillIn(xlSheet, x, y, z, id) 

End Sub 

Sub FillIn(xlSheet As Object, ByVal x As String, ByVal y As Date, ByVal z As Date, ByVal id As String) 
    ' as is 
End Sub 
+0

Das ist großartig! Der Prozess wird mit diesen Befehlen beendet. Wie empfehlen Sie, Objekte als Variablen in Funktionen zu übergeben? Ich musste sie öffentlich deklarieren, da es in 'LeaveRequests()' 'lokal wäre, es unmöglich zu machen, mit' FillIn() 'zu schreiben, und es machte auch das' For i = 3 to lastRow' seltsam Ich bin eine Konstante 3, und obwohl es die richtige Anzahl von Malen wiederholt hat. – NAlexP

0

Können Sie den Code unten versuchen, Dies ist ein Overkill, aber es funktionierte für mich, hatte ich dies als eine Funktion verwendet, aber dieser Code kann als On Error GoTo oder Sub rou verwendet werden

Dim objWMIService 
Dim colProcessList 
Dim objProcess 
Dim strComputer 

strComputer = "." 
Set objWMIService = GetObject("winmgmts://./root/cimv2") ' Task mgr 
Set colProcessList = objWMIService.ExecQuery ("Select * from Win32_Process Where Name in ('EXCEL.EXE') ") '''''','Chrome.exe','iexplore.exe' 

For Each objProcess in colProcessList 
    objProcess.Terminate() 
Next 
+0

Wo genau schlagen Sie vor, dass ich diesen Code hinzufüge? Nach dem xlWB.Close? – NAlexP

+0

Sie können den obigen Code anstelle von 'xlApp.Quit' verwenden. Zum Beispiel können Sie eine Funktion erstellen und diesen Code schreiben und dann diese Funktion anstelle von 'xlApp.Quit' aufrufen. –

+0

Ich bekomme einen Syntaxfehler auf' objProcess.Terminate() ', ich entfernte die Klammern, aber das Endergebnis ist immer noch die Der Prozess endet nicht. – NAlexP

Verwandte Themen