即使在.Quit之后,Excel进程仍然运行

时间:2017-08-22 07:48:07

标签: vba excel-vba outlook-vba excel

运行Outlook VBA宏后,Excel进程不会停止运行。我怀疑它是由一些Excel对象函数引起的,但我真的不确定是哪一个。 问题还体现在我的Excel工作簿所在的文件夹中创建了多个.tmp文件。(我想?) 我将发布用于打开和关闭Excel的代码,以及使用Excel对象的所有方法。

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

这是Excel的开启和关闭。 我还有一个在leaverequests sub中的收件箱迭代期间调用的子。

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

2 个答案:

答案 0 :(得分:4)

您在模块级别和public上声明了Excel对象变量:

Public xlApp As Object

这意味着:他们将无限期地保留对Excel的引用,从而阻止Excel关闭,除非您明确将它们设置为Nothing

Set xlSheet = Nothing
Set xlWB = Nothing
Set xlApp = Nothing
关闭工作簿/ Excel后

使用局部变量被认为是更好的编程习惯,并根据需要将它们传递给被调用的函数(例如从LeaveRequests()FillIn())。

E.g:

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

答案 1 :(得分:0)

你能尝试下面的代码,这是一个矫枉过正,但它对我有用,我把它用作函数,但是这段代码可以用作On Error GoTo或Sub rou

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