ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 206|回复: 2

[求助] Outlook创建Excel后内存释放不完全

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-7-23 15:51 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
代码功能如下:
Outlook中为某些邮件创建了一个文件夹,选中这个文件夹后运行vba,来导出文件夹里的邮件信息。到桌面上创建:邮件列表.xlsx,如果已经存在就删除原来的再创建一个同名的,填好表后关闭Excel清理对象内存,但是好像清不干净。



代码第一次运行没有问题,第二次运行报错424要求对象。发现第一次运行后任务管理器中还有Excel在运行,但是关闭这个没有用。需要设置 Excel 应用程序为可见,运行第二次报错时终止运行,关闭运行中打开的Excel应用,那么运行第三次就没有问题。



求教:Outlook创建excel对象后应如何正确释放内存呢?

  1. Option Explicit
  2. Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal Milliseconds As Long)
  3. Sub TestFolder()
  4. Dim mobjOutlook As Outlook.NameSpace
  5. Dim objOutlook As New Outlook.Application
  6. Dim objFolder As Outlook.folder
  7. Dim i As Integer
  8. Dim selItems            As Selection    ' A collection of Outlook item objects in a folder.
  9. Dim itemFolder As Outlook.folder
  10. Dim obj As Object
  11. Dim F As Outlook.MAPIFolder
  12. Dim xlApp As Object
  13. Dim wb As Object
  14. Dim desktopPath As String
  15. Dim xlSheet As Object
  16. Dim wbk As Workbook

  17. Set obj = Application.ActiveWindow
  18.   If TypeOf obj Is Outlook.Inspector Then
  19.     Set obj = obj.CurrentItem
  20.   Else
  21.    Set obj = obj.Selection(1)
  22.   End If
  23.   Set F = obj.Parent
  24.      Debug.Print F.FolderPath
  25.      Debug.Print F.Name
  26.      
  27. If F.Name = "收件箱" Or F.Name = "联系人" Then
  28.     MsgBox "请选择文件夹!"
  29.     Exit Sub
  30.   Else
  31.    
  32.    ' 获取桌面路径
  33.     desktopPath = Environ("USERPROFILE") & "\Desktop\邮件列表.xlsx"
  34.    
  35. Set mobjOutlook = objOutlook.GetNamespace("MAPI")
  36. Set objFolder = mobjOutlook.GetDefaultFolder(olFolderInbox).folders(F.Name)

  37. Dim objMail As Outlook.MailItem

  38. On Error Resume Next      '如有错误则跳过
  39. Kill desktopPath
  40. DoEvents
  41. 'Sleep 3000 ' 等待1000毫秒
  42. 'Err.Clear
  43. On Error GoTo 0

  44. ' 创建 Excel 应用程序对象
  45.     Set xlApp = CreateObject("Excel.Application")
  46. ' 设置 Excel 应用程序为可见
  47.     xlApp.Visible = True
  48. ' 新建一个 Excel 工作簿
  49.     Set wb = xlApp.Workbooks.Add
  50.    
  51.    
  52.    '保存新建的工作簿到桌面
  53.     wb.SaveAs FileName:=desktopPath

  54. wb.Sheets(1).Cells(1, 1) = "邮箱"
  55. wb.Sheets(1).Cells(1, 2) = "发件人"
  56. wb.Sheets(1).Cells(1, 3) = "收件时间"
  57. wb.Sheets(1).Cells(1, 4) = "主题"
  58. wb.Sheets(1).Cells(1, 5) = "正文"
  59. wb.Sheets(1).Cells(1, 6) = "附件"
  60. wb.Sheets(1).Cells(1, 7) = "部门"

  61. wb.Activate
  62. wb.Sheets("Sheet1").Select
  63. ' 选择工作表
  64.     Set xlSheet = wb.Sheets("Sheet1")

  65. ' 冻结首行
  66.     xlApp.ActiveWindow.SplitRow = 1
  67.     xlApp.ActiveWindow.SplitColumn = 0
  68.     xlApp.ActiveWindow.FreezePanes = True


  69. i = 1
  70. For Each objMail In objFolder.Items

  71.     xlSheet.Range("A" & i + 1) = objMail.SenderEmailAddress
  72.     xlSheet.Range("B" & i + 1) = objMail.SenderName
  73.     xlSheet.Range("C" & i + 1) = objMail.ReceivedTime
  74.     xlSheet.Range("D" & i + 1) = objMail.Subject
  75.     xlSheet.Range("E" & i + 1) = objMail.Body
  76.     xlSheet.Range("F" & i + 1) = objMail.Attachments.Count
  77. '    xlSheet.Range("G" & i + 1) = objMail.PidTagDepartmentName

  78.     i = i + 1
  79. Next


  80.     xlSheet.Columns("A:D").EntireColumn.AutoFit
  81.     wb.Save

  82.     xlSheet.UsedRange.Select

  83.     xlSheet.Range("A1:G" & [a65536].End(xlUp).Row).Select
  84. '    xlSheet.Range("A1:G" & [a65536].End(xlUp).Row).WrapText = False

  85. With Selection
  86.     .WrapText = False
  87.     .AutoFilter
  88. End With

  89.     xlSheet.Range("A1").Select

  90.     wb.Save
  91.     wb.Close
  92.    
  93.     For Each wbk In xlApp.Workbooks
  94.         wbk.Close SaveChanges:=False
  95.     Next wbk
  96.    
  97.     xlApp.Quit
  98.      
  99.      '清理
  100.     Set xlSheet = Nothing
  101.     Set wb = Nothing
  102.     Set xlApp = Nothing
  103. '    Sleep 3000 ' 等待1000毫秒

  104.     Shell "excel.exe " & desktopPath, vbMaximizedFocus
  105.    
  106. End If
  107. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2024-8-27 10:36 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-3 09:24 | 显示全部楼层

115行写了,用这个关,窗口是没了,但是任务管理器中还有。如果是手动关就没问题。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-9-8 09:31 , Processed in 0.027672 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表