运行 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)
您已在模块级别声明了 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)
| 归档时间: |
|
| 查看次数: |
2285 次 |
| 最近记录: |