根据Excel中的数据集,使用VBA将Outlook文件夹中的电子邮件移动到子文件夹

根据Excel中的数据集,使用VBA将Outlook文件夹中的电子邮件移动到子文件夹,excel,vba,outlook,Excel,Vba,Outlook,我在这里发现了一个与我的问题类似的问题 第一个模块- 此代码的第一部分-我已成功地将所有电子邮件数据导出到电子表格 第二模块- 我想指示Excel VBA根据我在电子表格中键入的数据集,将主文件夹中的电子邮件移动到子文件夹中(它不会基于电子邮件本身的过滤器/标准,只是其唯一的主题标题) 在第(c)列中,是电子邮件的主题(所有主题标题都是特定的/唯一的),在第(h)列中,我详细说明了我希望将其移动到的子文件夹的名称。不幸的是,我在执行我创建的代码时出错 我是一个Excel VBA的初学者,并没有

我在这里发现了一个与我的问题类似的问题

第一个模块- 此代码的第一部分-我已成功地将所有电子邮件数据导出到电子表格

第二模块- 我想指示Excel VBA根据我在电子表格中键入的数据集,将主文件夹中的电子邮件移动到子文件夹中(它不会基于电子邮件本身的过滤器/标准,只是其唯一的主题标题)

在第(c)列中,是电子邮件的主题(所有主题标题都是特定的/唯一的),在第(h)列中,我详细说明了我希望将其移动到的子文件夹的名称。不幸的是,我在执行我创建的代码时出错

我是一个Excel VBA的初学者,并没有最好的理解。我对我的代码有一个基于不同来源的想法,如果它不正确,请告诉我,我将不胜感激

多谢各位

  • 我尝试执行我在用户询问的问题中发现的代码,与我的代码类似,但它不起作用

分动发票()
'声明您的变量
将项目设置为Outlook.items
将子文件夹设置为Outlook。文件夹“这将是您要将邮件移动到的文件夹
'设置Outlook收件箱引用
Set OP=New Outlook.Application
设置NS=OP.GetNamespace(“MAPI”)
设置Mail=OP.CreateItem(olMailItem)
'循环浏览子文件夹及其文件夹
设置rootfol=NS.Folders(“SYNTHES-JNJCZ-GBS.DE.AT。CH@ITS.JNJ.com")
Set Folder=rootfol.Folders(“奥地利”)
'发票编号的列表应该是动态的
Dim arraysearch(1到1000)作为字符串
我想我会坚持多久
i=UBound(arraysearch)
arraysearch(i)=范围(“C2”).偏移量(i,0).值
如果i=0,那么
MsgBox“错误”
出口接头
如果结束
'文件夹类型的列表应该是动态的
Dim arraymove(1到1000)作为字符串
i=UBound(arraymove)
arraymove(i)=范围(“H2”).偏移量(i,0).值
如果i=0,那么
MsgBox“错误”
出口接头
如果结束
'要移动到的邮件的特定文件夹
Set subfolder=rootfol.Folders(arraymove(i))
对于文件夹.items.Restrict中的每个邮件(“[Subject]>=arraysearch(i)”)
如果arraysearch(i)=ArraySmove(i),则
项目。移动子文件夹
如果结束
下一封邮件
端接头

无需尝试查找该项目

它已经用
Set item=items.item(lngCount)
标识

您可以检查主题,看看它是否是您想要的项目

'Find Email using Subject found on Column C
'Set item = items.Find(FilterText)

'If the object is an Email
If item.Class = olMail Then

    If item.Subject = FilterText Then 

        'Find item under the main Folder subfolders
        Set subfolder = Folder.Folders(FolderMove)

        'Mark Item as Read
        item.UnRead = False

        'Move Item to folder type in Outlook
        item.Move subfolder
    End If

End If

在代码中,您将迭代文件夹中的所有项目:

  'Loop through the Items in the folder backwards
     'Setting Mail to counting backwards
    For lngCount = items.Count To 1 Step -1
    'setting object as Email item
        Set item = items.item(lngCount)
这真的不是一个好主意。尤其是以后使用
Find
方法时

如果您需要查找与您的条件相对应的项目,我建议使用items类的
find
/
FindNext
Restrict
方法。请在以下文章中阅读有关这些方法的更多信息:

此外,您可能会发现
应用程序
类的方法很有用。在Outlook中使用
AdvancedSearch
方法的主要好处是:

  • 搜索在另一个线程中执行。您不需要手动运行另一个线程,因为
    AdvancedSearch
    方法会在后台自动运行它
  • 可以在任何位置搜索任何项目类型:邮件、约会、日历、备注等,即超出特定文件夹的范围。
    Restrict
    Find
    /
    FindNext
    方法可应用于特定的项目集合(请参阅Outlook中
    文件夹
    类的
    项目
    属性)
  • 完全支持DASL查询(自定义属性也可用于搜索)。您可以在MSDN中的文章中阅读更多有关这方面的内容。为了提高搜索性能,如果为存储启用了即时搜索,则可以使用即时搜索关键字(请参见
    存储
    类的
    IsInstantSearchEnabled
    属性)
  • 您可以使用
    search
    类的
    stop
    方法随时停止搜索过程

光标位于代码中时,按F8键,直到出现错误。编辑问题以识别该行。哦,对了,它停在;设置项目=项目。查找(FilterText)相关信息应编辑到问题中。好的,谢谢!您今天添加的新代码没有任何意义。创建一个具有1000个维度的数组,然后只在1000个维度中的一个维度上赋值。很难说你期望它做什么。我认为您的迭代器“I”缺少了一个循环。您好,非常感谢您的建议,我确实研究了这两个选项,restrict,甚至DASL-quiries,但对于我的代码,我使用了restrict方法。我现在重写了我的代码,我使用数组作为额外的步骤,使其更加简洁。我的难题是将电子邮件的“主题”与iy需要移动的文件夹类型相匹配。可能的话,你能帮我一下吗。我的新代码也有一个错误,调试向我展示了这段代码
set subfolder=rootfol.folders(arraymove(i))
Hi niton!感谢您的评论,现在我认为整个find方法可能不是执行此功能的最佳方式。所以我重写了它并决定使用数组。不幸的是,我的新代码在中仍然有一个错误
Set subfolder=rootfol.Folders(arraymove(i))
如果您有任何建议,请改进,我将不胜感激谢谢!