excel 如何将多个项目数组(Outlook)合并为一个大数组

6bc51xsx  于 2023-02-17  发布在  其他
关注(0)|答案(2)|浏览(161)

我用VBA从特定的Outlook文件夹中提取项目来收集Outlook项目。在下面的代码中,我将两个不同文件夹中的项目收集到两个不同的数组中。(代码是用Excel编写的)

Set olGetArchMeetings = olNS.Folders(2).Folders(4).Items
olGetArchMeetings.IncludeRecurrences = True
    olGetArchMeetings.Sort "[Start]"
    strRestrictionArch = "[Start] >= '" & mStart & "' AND [End] <= '" & mEnd & "'"
    Set objArray1 = olGetArchMeetings.restrict(strRestrictionArch)
    
Set olGetMeetings = olNS.GetDefaultFolder(9).Items 
olGetMeetings.IncludeRecurrences = True
    olGetMeetings.Sort "[Start]"
    strRestriction = "[Start] >= '" & mStart & "' AND [End] <= '" & mEnd & "'"
    Set objArray2 = olGetMeetings.restrict(strRestriction)

问题是:有没有办法把两个对象数组合并成一个?比如把objArray2中的所有元素都加到objArray1的末尾,然后创建一个包含两个数组中的元素的新数组?
我试着通过基本的数组连接来合并,就像合并字符串数组一样,但没有帮助。
我希望得到一个大型的元素数组,其中包含来自不同数组的元素

yv5phkfx

yv5phkfx1#

我不知道如何为outlook编写代码,但基本的数组合并应该是这样的,这只是一维数组的代码:

Sub ArrayMerge()

Dim obA, obB, obC, obD As Object
Dim arrA, arrB, arrAll As Variant
Dim m, n, first, last As Integer

'setting objects
Set obA = Cells(1)
Set obB = Cells(2)
Set obC = Cells(3)
Set obD = Cells(4)

'dimensioning arrays
ReDim arrA(1 To 2)
ReDim arrB(1 To 2)

'filling both arrays
Set arrA(1) = obA
Set arrA(2) = obB

Set arrB(1) = obC
Set arrB(2) = obD

first = UBound(arrA) + 1             ' = 3 
last = UBound(arrA) + UBound(arrB)   ' = 4

'Enlarge the first array to join the second one
ReDim Preserve arrA(1 To last)
 
   For m = first To last
       n = n + 1
       Set arrA(m) = arrB(n)
   Next m

End Sub
nlejzf6q

nlejzf6q2#

首先,Items类的Restrict方法对Items集合应用一个筛选器,返回一个新集合,其中包含原始集合中与筛选器匹配的所有项,但不包含数组。
问题是:有没有办法把两个对象数组合并成一个?比如把objArray2中的所有元素都加到objArray1的末尾,然后创建一个包含两个数组中的元素的新数组?
不,从不同的Restrict调用中获取单个Items集合的方法并不简单。您可以考虑构建一个从找到的项目中提取的数据数组。但更好的方法是使用单个搜索,该搜索可以在Outlook的后台运行。
Application.AdvancedSearch方法允许基于指定的DAV搜索和定位(DASL)搜索字符串在多个文件夹中执行搜索。若要指定多个文件夹路径,请将每个文件夹路径用单引号括起来,并用逗号分隔用单引号括起来的文件夹路径。
在Outlook中使用AdvancedSearch方法的主要优点是:

  • 搜索是在另一个线程中执行的,您不需要手动运行另一个线程,因为AdvancedSearch方法会在后台自动运行它。
  • 可以搜索任何项目类型:电子邮件、约会、日历、笔记等。RestrictFind/FindNext方法可应用于特定的Items集合(请参阅Outlook中Folder类的Items属性)。
  • 完全支持DASL查询(自定义属性也可用于搜索)。若要提高搜索性能,如果为存储启用了即时搜索,则可以使用即时搜索关键字(请参阅Store类的IsInstantSearchEnabled属性)。
  • 您可以使用Search类的Stop方法随时停止搜索过程。

在我为技术博客撰写的文章中可以阅读更多相关内容:Advanced search in Outlook programmatically: C#, VB.NET.

相关问题