Vba 应用程序启动变量在子完成后消失

Vba 应用程序启动变量在子完成后消失,vba,outlook,Vba,Outlook,这是我问过的一个问题的后续。感谢社区在这方面的帮助 我第一次尝试创建WithEvents代码来检查文件夹中的新项目。最终的计划是使用ItemsAdd事件来触发一系列其他处理,但现在,只是尝试将其保存到文件夹中,而不是走那么远 当我运行下面的应用程序启动代码时,立即窗口显示我找到了正确的CLNTFLDRITM。问题是,如果我随后将一个项目拖到有问题的文件夹中,ItemAdd宏不会启动。当我尝试为clntFldrItms添加一个watch时,该变量没有设置为任何值。看起来只要应用程序启动子完成,分配

这是我问过的一个问题的后续。感谢社区在这方面的帮助

我第一次尝试创建WithEvents代码来检查文件夹中的新项目。最终的计划是使用ItemsAdd事件来触发一系列其他处理,但现在,只是尝试将其保存到文件夹中,而不是走那么远

当我运行下面的应用程序启动代码时,立即窗口显示我找到了正确的CLNTFLDRITM。问题是,如果我随后将一个项目拖到有问题的文件夹中,ItemAdd宏不会启动。当我尝试为clntFldrItms添加一个watch时,该变量没有设置为任何值。看起来只要应用程序启动子完成,分配就会停止

所有代码都在ThisOutlookSession对象中

这可能是因为我使用的是SMTP电子邮件地址(例如,不是Exchange)

再次感谢你的帮助

编辑添加我对尤金评论的回应。我注意到,当我打开编辑器并进入应用程序启动子项时,clntFldrItms被正确分配,甚至在我进入Set clntFldrItms=clntFldr.Items行之前。我一走完,它就又消失了。我不能单步执行ItemAdd子项,但当我单步执行其他代码时,clntFldrItms什么都不是

最终编辑对不起,我意识到我忘了关闭这个。我无法解决问题本身,但我意识到这是由于我的SMTP帐户。当我在Exchange上尝试它时,它起了作用。看来,除非我在交换工作,否则活动不会启动

Option Explicit

Public WithEvents clntFldrItms As Outlook.Items

Private Sub Application_Startup()
    Dim clntFldr As MAPIFolder
    Set clntFldr = Application.Session.GetDefaultFolder(olFolderSentMail).Folders("Client Emails")
    Set clntFldrItms = clntFldr.Items
    Set clntFldr = Nothing
    Debug.Print clntFldrItms.item(1).Subject
End Sub

Private Sub clntFldrItms_ItemAdd(ByVal item As Object)
    Dim bChar As String
    bChar = "\/:*?™""® <>|.&@#_+`©~;-+=^$!,'" & Chr(34)
    Dim saveName As String
    If item.Class = olMail Then
        saveName = item.Subject
        For x = 1 To Len(bChar)
            saveName = Replace(saveName, Mid(bChar, x, 1), "-")
        Next x
        item.SaveAs "C:\Users\User\Google Drive\8 - VBA work\Preparation for Assisted Responder\Sent Messages Folder\" & _
        saveName & ".msg", olMSG
    End If
End Sub
选项显式
将事件clntFldrItms作为Outlook.Items公开
私有子应用程序_启动()
将clntFldr设置为MAPI文件夹
设置clntFldr=Application.Session.GetDefaultFolder(olFolderSentMail).Folders(“客户端电子邮件”)
设置clntFldrItms=clntFldr.Items
设置clntFldr=Nothing
调试.打印clntFldrItms.item(1).主题
端接头
私有子clntFldrItms_ItemAdd(ByVal项作为对象)
Dim bChar As字符串
bChar=“\/:*?”?™""® |.&@#_+`©~;-+=^$!,'" & 人权专员(34)
将saveName设置为字符串
如果item.Class=olMail,则
saveName=item.Subject
对于x=1到Len(bChar)
saveName=Replace(saveName,Mid(bChar,x,1),“-”)
下一个x
item.SaveAs“C:\Users\User\Google Drive\8-VBA工作\辅助响应者准备\发送消息文件夹\”&_
saveName&“.msg”,olMSG
如果结束
端接头

尝试在ItemAdd事件处理程序中设置断点,并在遇到断点时检查
clntFldrItms
对象

请注意,当同时添加多个项目时,
ItemAdd
事件不会触发(超过16个-这是Outlook中的一个众所周知的问题)

你会发现这篇文章很有价值


EDIT之所以设置
clntFldrItms
,是因为启动Outlook时会运行启动事件处理程序。因此,在后台启动时会初始化对象。

是否允许VBA宏在Outlook中运行?您是否有机会查看信任中心设置?谢谢Eugene,我已经在我的outlooks会话。没有骰子…我已经使用了代码,并且它似乎在Outlook 2010和Microsoft Exchange上工作,因此就我而言,问题已经解决。我不知道问题是Outlook 2016还是SMTP电子邮件地址,但我怀疑是后者。很高兴有想法,但如果没有人有,谢谢尝试。干杯谢谢很多Eugene。我已经这样做了,而且从我所看到的情况来看,它设置正确。不过,我注意到了一件有趣的事情。当我打开编辑器并进入应用程序启动子节点时,
clntFldrItms
被正确分配,甚至在我进入
set clntFldrItms=clntFldr.Items
行之前。我一完成单步操作,它就是g再一次。我无法进入ItemAdd子项,但当我进入其他代码时,
clntFldrItms
什么都没有。请尝试删除以下语句:
Set clntFldr=Nothing
谢谢尤金。不幸的是,删除
Set clntFldr=Nothing
没有做到这一点。我觉得奇怪的是
clntFldrItms
>变量一直设置到
应用程序启动
子系统完成(直到
结束子系统
),但不是之后。我还知道,子系统在Outlook启动时运行,因为我使用了
停止
,它会中断代码的执行(使用
clntFldrItms
集)。