循环设置对选定的 Outlook 文件夹的监视

2023-12-04

我正在 Outlook 中的 VBA 中执行以下操作。将 Outlook 项目拖到指定文件夹后,我将此 Outlook 项目保存到我的计算机(即文件系统)。

Private WithEvents Items As Outlook.Items
Private WithEvents Items2 As Outlook.Items

Private Sub Application_Startup()
  Dim Ns As Outlook.NameSpace
  Set Ns = Application.GetNamespace("MAPI")
  Set Items = Ns.GetDefaultFolder(olFolderInbox).Parent.Folders("Hello").Items
  Set Items2 = Ns.GetDefaultFolder(olFolderInbox).Parent.Folders("Bye").Items
End Sub

Private Sub Items_ItemAdd(ByVal Item As Object)
  If TypeOf Item Is Outlook.MailItem Then

  Dim sPath As String
  Dim dtDate As Date
  Dim sName As String
  Dim enviro As String

  enviro = CStr(Environ("USERPROFILE"))

  sName = Item.Subject
  ReplaceCharsForFileName sName, "_"

  dtDate = Item.ReceivedTime
  sName = Format(dtDate, "yyyymmdd", vbUseSystemDayOfWeek, _
    vbUseSystem) & Format(dtDate, " - hhnn ", _
    vbUseSystemDayOfWeek, vbUseSystem) & "- " & sName & ".msg"

  sPath = "Y:\BM_Clientenmap\D\Hello\emails\"
  Debug.Print sPath & sName
  Item.SaveAs sPath & sName, olMSG

  End If

End Sub

Private Sub Items2_ItemAdd(ByVal Item As Object)
  If TypeOf Item Is Outlook.MailItem Then

  Dim sPath As String
  Dim dtDate As Date
  Dim sName As String
  Dim enviro As String

  enviro = CStr(Environ("USERPROFILE"))

  sName = Item.Subject
  ReplaceCharsForFileName sName, "_"

  dtDate = Item.ReceivedTime
  sName = Format(dtDate, "yyyymmdd", vbUseSystemDayOfWeek, _
    vbUseSystem) & Format(dtDate, " - hhnn ", _
    vbUseSystemDayOfWeek, vbUseSystem) & "- " & sName & ".msg"

  sPath = "Y:\BM_Clientenmap\D\Bye\emails\"
  Debug.Print sPath & sName
  Item.SaveAs sPath & sName, olMSG

  End If

End Sub

Private Sub ReplaceCharsForFileName(sName As String, _
  sChr As String)
  sName = Replace(sName, "/", sChr)
  sName = Replace(sName, "\", sChr)
  sName = Replace(sName, ":", sChr)
  sName = Replace(sName, "?", sChr)
  sName = Replace(sName, Chr(34), sChr)
  sName = Replace(sName, "<", sChr)
  sName = Replace(sName, ">", sChr)
  sName = Replace(sName, "|", sChr)
End Sub

如果用户将文件添加到顶部声明的变量 Items/Items2 中指定的目录,则此代码会将 Outlook 项目保存到计算机的目录 sPath (Sub Items/Items2_AddItem) 中。

问题是它需要我在 VBA 中手动添加添加项目时 VBA 应“监视”哪些文件夹,以及保存这些文件的位置。因此,它要求我为我拥有的每个文件夹编写一个新的 Items 变量和新的 Items_ItemAdd 子项。

我想做以下事情:

  • 通过 Outlook 中的用户界面而不是 VBA 选择应“监视”添加项目的文件夹以及应将其保存到的文件夹。用户应该选择多个文件夹(我不在乎他们是否必须一次选择一个),并且计算机上有多个保存文件夹。
  • 我希望 Outlook 记住用户在关闭 Outlook 时所做的选择。

为了使其更加用户友好,我考虑了以下内容。

  • 用户在 Outlook 中选择文件夹。我发现执行此操作的代码:

    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set myOlApp = Outlook.Application
    Set iNameSpace = myOlApp.GetNamespace("MAPI")
    Set ChosenFolder = iNameSpace.PickFolder
    If ChosenFolder Is Nothing Then
    GoTo ExitSub:
    End If
    
  • 然后,用户选择该项目应保存到计算机上的文件夹。我发现的代码允许您将变量设置为输入文件路径:

    Function BrowseForFolder(StrSavePath As String, Optional OpenAt As String) As String
    Dim objShell As Object
    Dim objFolder '  As Folder
    
    Dim enviro
    enviro = CStr(Environ("USERPROFILE"))
    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.BrowseForFolder(0, "Please choose a folder", 0, 
    enviro & "\Computer\")
    StrSavePath = objFolder.self.Path
    
    On Error Resume Next
    On Error GoTo 0
    
    ExitFunction:
    Set objShell = Nothing
    
    End Sub
    

我希望当用户按下功能区中要设置宏的按钮时运行上述代码。

我希望 Outlook 监视用户选择的这些文件夹(即 Sub Items_ItemAdd 的作用)。这就是我陷入困境的地方。我希望在 Outlook 关闭后记住用户的选择(即用户不必每次打开 Outlook 时都选择其文件夹)。

现在我的问题如下:

  • 我想象完成这项工作的一种方法是创建一个新变量Items(i)和一个新的子项目(i)_ItemAdd每次用户选择文件夹和保存文件夹时直接在VBA代码中。然而,我读到这在 Outlook 中是不可能做到的,与 Excel 不同。这是真的?如果不是:如何在 Outlook 中使用 VBA 创建 VBA 代码?

  • 我可以想象的另一种方式如下。我将用户输入的内容保存到文本文件中,然后从文本文件中读取并将其保存到数组中。但是,我不知道如何在代码的其余部分中使用该数组。我认为不可能创建具有变量名称的 Sub,或者运行包含在 for 循环中的“ItemAdd”“watcher”的子,该循环遍历数组并根据数组中的索引或其他内容创建 Sub 函数像那样。

希望任何人都可以帮助我。或者知道如何使我的想法发挥作用的任何其他想法。


这并不涉及如何收集或存储各种文件夹,而是展示如何使用单独的“保存到”路径管理“监视”文件夹的集合。

首先,创建一个类来管理每个文件夹:

Option Explicit

Private OlFldr As Folder
Private SavePath As String
Public WithEvents Items As Outlook.Items

'called to set up the object
Public Sub Init(f As Folder, sPath As String)
    Set OlFldr = f
    Set Items = f.Items
    SavePath = sPath
End Sub

Private Sub Items_ItemAdd(ByVal Item As Object)
  If TypeOf Item Is Outlook.MailItem Then
       'Just a simple message to show what's going on.
       'You can add code here to save the item, or you can pass
       '  arguments to a common sub defined in a regular module
       MsgBox "Mail '" & Item.Subject & "' was added to Folder '" & OlFldr.Name & _
              "' and will be saved to '" & SavePath & "'"
  End If
End Sub

以下是如何使用该类来设置监视文件夹:

Option Explicit

Dim colFolders As Collection '<< holds the clsFolder objects

Private Sub SetupFolderWatches()

    'This could be called on application startup, or from the code which collects
    '  user selections for folders/paths

    Dim Ns As Outlook.NameSpace, inboxParent, arrFolders, f, arr
    Set Ns = Application.GetNamespace("MAPI")

    Set colFolders = New Collection
    Set inboxParent = Ns.GetDefaultFolder(olFolderInbox).Parent

    'you'd be reading this info from a file or some other storage...
    arrFolders = Array("Test1|C:\Test1_Files\", "Test2|C:\Test2_Files\")

    For Each f In arrFolders
        arr = Split(f, "|")
        colFolders.Add GetFolderObject(inboxParent.Folders(arr(0)), CStr(arr(1)))
    Next f

End Sub


'"factory" function to create folder objects
Function GetFolderObject(foldr As Folder, sPath As String)
    Dim rv As New clsFolder
    rv.Init foldr, sPath
    Set GetFolderObject = rv
End Function
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

循环设置对选定的 Outlook 文件夹的监视 的相关文章

  • 在工作表中合并行和求和值

    我有一个 Excel 工作表 其中包含以下数据 管道 来分隔列 A B C X 50 60 D E F X 40 30 A B C X 10 20 A B C Y 20 20 A B C X 20 70 D E F X 10 50 A B
  • 使用图表时避免使用“激活”和“选择”(Excel)

    我知道使用Activate and Select在 Excel 中 VBA 不是最佳实践 我看过有关如何在处理范围时避免它们的参考资料 例如 LINK https stackoverflow com questions 10714251 e
  • 使用 Python Win32Com.Client 发送电子邮件发送错误

    我有我的脚本通过 Python win32com client 在 Outlook 上发送消息 我可以创建电子邮件并格式化我的正文 但是当我尝试这样做时newmail Send 我收到一个我无法弄清楚的错误 下面是我的代码以及错误 obj
  • 调试VBA、定位问题及排查方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有哪些方法调试VBA代码 具体来说 单步执行代码 断点和停止命令 TheDebug command 当地人和观察窗 调用栈 调试 VB
  • VB6/VBA 中对象清除/数组释放真的有必要吗(优点/缺点?)[重复]

    这个问题在这里已经有答案了 我从使用静态代码分析 特别是 Aivosto 的项目分析器 中学到了很多关于 VB 的知识 它检查的一件事是您是否清除了所有对象和数组 我以前只是盲目地这样做 因为PA这么说 但现在我对 VB 释放资源的方式有了
  • 如何在VBA中指定当前目录作为路径?

    我有一个启用宏的工作簿 我需要指定启用宏的文件所在的当前文件夹作为路径 我尝试设置 path ActiveWorkbook Path and path CurDir 但这些都不适合我 对此有什么想法吗 如果您想要的路径是运行宏的工作簿的路径
  • 如何将动态范围字符串文本传递给 EXCEL VBA 中的 SQL 查询 IN 子句

    我有动态范围字符串数据 需要通过修剪单元格和单引号和逗号分隔到 SQL 查询 A 123ABC345 234CDE678 ZSE123MTR POR123456 Result select from table name where col
  • DAO.DBEngine 类不再在使用 Windows 10 的 MS Access 2016 中注册

    客户端最近从 Windows 7 升级到 10 并从 Access 2013 迁移到 2016 包含在 Office 365 中 Excel 中的 VBA 宏现在会生成以下错误 运行时错误 2147221164 80040154 类未注册
  • 宏在第二张幻灯片上不起作用的 Powerpoint 进度

    我正在尝试创建一个宏 它将在 powerpoint 演示文稿中的幻灯片中运行 我本来可以工作 但现在停止工作了 我不知道为什么 运行幻灯片和动画的 vbscript 是 Private Sub PPTEvent SlideShowNextB
  • VBA:使用 Windows 身份验证登录

    我有一个 Access 应用程序 要求用户输入其 Windows 域用户和密码才能进入 我使用以下 VBA 代码来完成此任务 Function WindowsLogin ByVal strUserName As String ByVal s
  • Excel 宏 - 复制并粘贴筛选的行

    因此基于工作表中的下拉选择 B 我们想要滚动浏览工作表中的一堆行 A 删除所有没有的Cell 4 dropDownValue 然后复制该范围并将其粘贴到工作表中 B 下面的代码运行但不执行任何操作 我可以调试并看到dropDownValue
  • 在 VBA 中加速嵌套循环宏所需的指针

    我需要帮助来加速我的简单的 8 变量嵌套循环宏 每个循环仍然需要大约 1 秒 并且有几十万个循环需要完成 因此需要 3 到 4 天才能完成 从我在这里的阅读和实验中 我确实已经尽可能地简化了流程 但现在遇到了困难 我的宏基本上有 3 个部分
  • 复制两个 Excel 实例之间的范围

    我正在运行两个单独的 Excel 实例 并且尝试将数据从一个工作簿中的范围复制到另一个工作簿中 我有这个代码 Sub CopyValues Dim xlApp As Excel Application Set xlApp GetObject
  • 用于替换格式但保留单元格值的 VBA:部分解决

    我正在尝试组合 VBA 来搜索特定的单元格格式 然后更改该单元格格式 我从这篇文章中得到了灵感 Excel VBA 值替换后仍保持字符串格式 https stackoverflow com questions 25825136 excel
  • 如何使用 VBA 在 Excel 2010 工作表中添加选项按钮以进行分组?

    I want to add many option button to an excel worksheet not to a VBA form and want to group them by row The result should
  • 点击后如何等待页面加载

    下面是简单的 IE 自动化代码 只需输入订单号 例如1413105088和邮政编码始终是78759并单击 提交 按钮 然后从结果页面中获取跟踪号码 例如017136295201034并将它们放入 C 列 它按预期工作 但由于 IE 不太可靠
  • 在 VBA 中调用批处理文件无法正常工作

    我正在尝试创建一个可供其他人使用的程序 目前 我的文件位于目录中C Documents and Settings jpmccros Desktop test 该目录包含我的macro xlsm names bat 还有另一个子目录名为Dat
  • Excel HTTP 获取超时

    我们有这个小子 它只是将数据泵入远程服务器 一切都按预期进行 前几天 网络服务器发生了一次持续大约一个小时的事件 我仍然可以 PING 服务器 但 IIS 没有响应 结果 宏只是挂起等待响应 关于快速通过 失败测试或超时有什么想法吗 Sub
  • VBA半正矢公式

    我正在尝试将半正矢公式应用到Excel函数中 它看起来像这样 Public Function Haversine Lat1 As Variant Lon1 As Variant Lat2 As Variant Lon2 As Variant
  • 有没有办法破解 Excel VBA 项目的密码?

    我被要求更新一些 Excel 2003 宏 但 VBA 项目受密码保护 而且似乎缺少文档 没有人知道密码 有没有办法删除或破解 VBA 项目上的密码 你可以直接尝试这个VBA不需要十六进制编辑的方法 它适用于任何文件 xls xlsm xl

随机推荐