即使退出后,Excel 进程仍在运行

NAl*_*exP 5 excel outlook vba

运行 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
Run Code Online (Sandbox Code Playgroud)

这就是Excel的打开和关闭。我还有一个在 LeaveRequests 子项中的收件箱迭代期间调用的子项。

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
Run Code Online (Sandbox Code Playgroud)

And*_*dre 4

您已在模块级别声明了 Excel 对象变量并公开:

Public xlApp As Object
Run Code Online (Sandbox Code Playgroud)

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

Set xlSheet = Nothing
Set xlWB = Nothing
Set xlApp = Nothing
Run Code Online (Sandbox Code Playgroud)

关闭工作簿/Excel 后。

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

例如:

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
Run Code Online (Sandbox Code Playgroud)