如何用VBA将多个Outlook项目对象数组合并为一个大数组
合并Outlook Items对象集合的VBA实现
问题背景
通过VBA从Outlook两个文件夹筛选符合时间范围的项目,分别存入objArray1和objArray2两个Items对象集合:
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末尾,得到包含所有项目的新集合/数组。
解决方案
objArray1和objArray2是Outlook.Items集合,并非普通VBA数组,无法直接用数组合并逻辑处理,以下两种方法可实现需求:
方法1:使用Collection对象存储合并结果
创建独立的Collection容器,将两个Items集合的项目逐一添加进去:
Dim mergedColl As New Collection Dim olItem As Object ' 加入objArray1的所有项目 For Each olItem In objArray1 mergedColl.Add olItem Next olItem ' 加入objArray2的所有项目 For Each olItem In objArray2 mergedColl.Add olItem Next olItem
后续可通过遍历mergedColl访问所有合并后的项目。
方法2:转换为Variant数组后合并
若需要数组形式的结果,先将Items集合转为Variant数组,再执行合并:
Dim arr1() As Variant, arr2() As Variant, mergedArr() As Variant Dim idx As Long, counter As Long ' 将objArray1转为数组(Outlook Items索引从1开始) ReDim arr1(objArray1.Count - 1) For idx = 0 To objArray1.Count - 1 Set arr1(idx) = objArray1(idx + 1) Next idx ' 将objArray2转为数组 ReDim arr2(objArray2.Count - 1) For idx = 0 To objArray2.Count - 1 Set arr2(idx) = objArray2(idx + 1) Next idx ' 合并两个数组 ReDim mergedArr(UBound(arr1) + UBound(arr2) + 1) counter = 0 ' 加入arr1元素 For idx = 0 To UBound(arr1) Set mergedArr(counter) = arr1(idx) counter = counter + 1 Next idx ' 加入arr2元素 For idx = 0 To UBound(arr2) Set mergedArr(counter) = arr2(idx) counter = counter + 1 Next idx
mergedArr即为包含所有项目的Variant数组,每个元素对应一个Outlook项目对象。
关键说明
- Outlook.Items集合与原文件夹绑定,无法直接向
objArray1中追加objArray2的项目,必须通过中间容器(Collection或数组)实现合并。 - 若需保持项目按
Start时间排序,合并后可对新容器重新排序,或依赖原集合已有的排序(你的代码中已执行Sort "[Start]")。
内容的提问来源于stack exchange,提问作者LSA
相关产品推荐
相关产品推荐

