Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 在主题行中查找包含特定文本的电子邮件项目-优化_Excel_Vba_Outlook - Fatal编程技术网

Excel 在主题行中查找包含特定文本的电子邮件项目-优化

Excel 在主题行中查找包含特定文本的电子邮件项目-优化,excel,vba,outlook,Excel,Vba,Outlook,我基本上已经完成了一个项目的VBA代码,但我觉得它需要改进或优化。我可以就要更改/修改/删除/优化的内容寻求帮助吗 我对VBA比较陌生 我的代码如下: Function WorksheetExists(sheet_name As String, Optional wb As Workbook) As Boolean Dim ws As Worksheet If wb Is Nothing Then Set wb = ThisWorkbook On Error Resum

我基本上已经完成了一个项目的VBA代码,但我觉得它需要改进或优化。我可以就要更改/修改/删除/优化的内容寻求帮助吗

我对VBA比较陌生

我的代码如下:

Function WorksheetExists(sheet_name As String, Optional wb As Workbook) As Boolean
    Dim ws As Worksheet
    If wb Is Nothing Then Set wb = ThisWorkbook

    On Error Resume Next
        Set ws = wb.Sheets(sheet_name)
    On Error GoTo 0

    WorksheetExists = Not ws Is Nothing
End Function

Sub GetEmailDetailsInWorksheets()
    Dim outlook_app As Outlook.Application
    Dim namespace As Outlook.namespace

    Dim folders_collection As New Collection
    Dim folder As Outlook.MAPIFolder
    Dim sub_folder As Outlook.MAPIFolder
    Dim obj_mail As Outlook.MailItem
    Dim obj_item
    Dim row_number As Long
    Dim msgs_found_counter As Long
    Dim working_ws As Worksheet
    Dim active_cell_value As String

    Set outlook_app = New Outlook.Application
    Set namespace = outlook_app.GetNamespace("MAPI")
    Set working_ws = Sheets("Working")
    active_cell_value = ActiveCell.Value

    For Each folder In namespace.Folders
        For Each sub_folder In folder.Folders
            folders_collection.Add sub_folder
        Next sub_folder
    Next

    row_number = 4
    msgs_found_counter = 0

    If ActiveSheet.Name = "Working" Then
        If active_cell_value <> "" Then
            If WorksheetExists(active_cell_value) = False Then
                Sheets.Add(After:=Sheets("Working")).Name = active_cell_value
                Cells(row_number - 1, 1) = "Entry ID"
                Cells(row_number - 1, 2) = "Folder Path"
                Cells(row_number - 1, 3) = "Received Time"
                Cells(row_number - 1, 4) = "Sender"
                Cells(row_number - 1, 5) = "Recipients"
                Cells(row_number - 1, 6) = "Email Subject"
                MsgBox "PRESS OK TO CONTINUE."

                Do While folders_collection.Count > 0
                    Set folder = folders_collection(1) 'Get next folder to process
                    folders_collection.Remove 1        'Remove that folder from the collection

                    Application.StatusBar = folder.FolderPath

                    For Each obj_item In folder.Items
                        If obj_item.Class = olMail And InStr(1, obj_item.Subject, active_cell_value, vbTextCompare) > 0 Then
                            Set obj_mail = obj_item
                            Application.StatusBar = row_number & " - " & folder.FolderPath

                            On Error Resume Next
                            Cells(row_number, 1) = obj_mail.EntryID
                            Cells(row_number, 2) = folder.FolderPath
                            Cells(row_number, 3) = obj_mail.ReceivedTime
                            Cells(row_number, 4) = obj_mail.Sender
                            Cells(row_number, 5) = obj_mail.To
                            Cells(row_number, 6) = obj_mail.Subject
                            On Error GoTo 0

                            row_number = row_number + 1
                            msgs_found_counter = msgs_found_counter + 1
                        End If
                    Next obj_item

                    'Check for subfolders
                    For Each sub_folder In folder.Folders
                        folders_collection.Add sub_folder, before:=1
                    Next
                Loop
                MsgBox msgs_found_counter & " message/s found for """ & active_cell_value & """"
                Range("A4").Select
            Else
                MsgBox "A sheet matching the selected cell already exists. Redirecting you now..."
                Worksheets(active_cell_value).Activate
            End If
        Else
            MsgBox "Active cell is blank."
        End If
    Else
        MsgBox "You are in the wrong worksheet. Try again."
    End If

    Application.StatusBar = False
End Sub
函数工作表列表(工作表名称为字符串,可选wb为工作簿)为布尔值
将ws设置为工作表
如果wb为空,则设置wb=ThisWorkbook
出错时继续下一步
设置ws=wb.Sheets(工作表名称)
错误转到0
WorksheetExists=Not ws Is Nothing
端函数
子GetEmailDetailsInWorksheets()
将outlook\u应用程序设置为outlook.Application
将命名空间设置为Outlook.namespace
将您的集合设置为新集合
将文件夹设置为Outlook.MAPIFolder
将子文件夹设置为Outlook.MAPIFolder
Dim obj_邮件作为Outlook.MailItem
Dim obj_项目
将行号变暗,如长所示
Dim msgs_发现_计数器一样长
将工作表设置为工作表
将活动单元格值变暗为字符串
设置outlook\u应用程序=新建outlook.Application
Set namespace=outlook\u app.GetNamespace(“MAPI”)
设置工作\u ws=工作表(“工作”)
活动单元格\u值=活动单元格.value
对于命名空间中的每个文件夹。文件夹
对于文件夹.文件夹中的每个子文件夹
文件夹\u集合。添加子\u文件夹
下一个子文件夹
下一个
行数=4
msgs\u已找到\u计数器=0
如果ActiveSheet.Name=“正在工作”,则
如果活动单元格的值为“”,则
如果工作表列表(活动单元格值)=False,则
工作表。添加(在:=工作表之后)。名称=活动单元格值
单元格(行号-1,1)=“条目ID”
单元格(行号-1,2)=“文件夹路径”
单元格(行号-1,3)=“接收时间”
单元格(行号-1,4)=“发送方”
单元格(行号-1,5)=“收件人”
单元格(第1行,第6行)=“电子邮件主题”
MsgBox“按OK继续。”
当文件夹\u collection.Count>0时执行此操作
设置文件夹=文件夹\u集合(1)'获取下一个要处理的文件夹
文件夹\u collection.Remove 1'从集合中删除该文件夹
Application.StatusBar=folder.FolderPath
对于文件夹中的每个obj_项。项
如果obj_item.Class=olMail和InStr(1,obj_item.Subject,active_cell_value,vbTextCompare)>0,则
设置obj_邮件=obj_项目
Application.StatusBar=行号&“-”&文件夹.FolderPath
出错时继续下一步
单元格(行号,1)=obj\u mail.EntryID
单元格(行号,2)=folder.FolderPath
单元格(行号,3)=对象邮件接收时间
单元格(行号,4)=obj_mail.Sender
单元格(行号,5)=对象邮箱地址
单元格(第6行)=obj_mail.Subject
错误转到0
行数=行数+1
msgs\u found\u计数器=msgs\u found\u计数器+1
如果结束
下一个obj_项目
'检查子文件夹
对于文件夹.文件夹中的每个子文件夹
文件夹\u集合。添加子\u文件夹,在:=1之前
下一个
环
MsgBox msgs_found_计数器&“为”“和活动单元格_值&”“找到消息”
范围(“A4”)。选择
其他的
MsgBox“与所选单元格匹配的工作表已存在。正在重定向您…”
工作表(活动单元格值)。激活
如果结束
其他的
MsgBox“活动单元格为空。”
如果结束
其他的
MsgBox“您在错误的工作表中。请重试。”
如果结束
Application.StatusBar=False
端接头

任何指导都将不胜感激。我需要有关嵌套ifs或简化任何代码行的帮助。谢谢。

限制要处理的项目数量

这种类型的过滤器可以模拟仪表:

strFilter = "@SQL=" & Chr(34) & "urn:schemas:httpmail:subject" & Chr(34) & _
  " LIKE '%" & active_cell_value & "%'"

选项显式
函数工作表列表(工作表名称为字符串,可选wb为工作簿)为布尔值
将ws设置为工作表
如果wb为空,则设置wb=ThisWorkbook
出错时继续下一步
设置ws=wb.Sheets(工作表名称)
错误转到0
WorksheetExists=Not ws Is Nothing
端函数
子GetEmailDetailsInWorksheets()
将outlook\u应用程序设置为outlook.Application
将命名空间设置为Outlook.namespace
将您的集合设置为新集合
将文件夹设置为Outlook.MAPIFolder
将子文件夹设置为Outlook.MAPIFolder
Dim obj_邮件作为Outlook.MailItem
Dim obj_项目
将行号变暗,如长所示
Dim msgs_发现_计数器一样长
将工作表设置为工作表
将活动单元格值变暗为字符串
作为字符串的Dim strFilter
将项目定义为项目
设置outlook\u应用程序=新建outlook.Application
Set namespace=outlook\u app.GetNamespace(“MAPI”)
设置工作\u ws=工作表(“工作”)
活动单元格\u值=活动单元格.value
对于命名空间中的每个文件夹。文件夹
对于文件夹.文件夹中的每个子文件夹
'Debug.Print子文件夹
文件夹\u集合。添加子\u文件夹
下一个子文件夹
下一个
行数=4
msgs\u已找到\u计数器=0
如果ActiveSheet.Name=“正在工作”,则
如果活动单元格的值为“”,则
如果工作表列表(活动单元格值)=False,则
工作表。添加(在:=工作表之后)。名称=活动单元格值
单元格(行号-1,1)=“条目ID”
单元格(行号-1,2)=“文件夹路径”
单元格(行号-1,3)=“接收时间”
单元格(行号-1,4)=“发送方”