运行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
答案 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