Excel 在主题行中查找包含特定文本的电子邮件项目-优化
我基本上已经完成了一个项目的VBA代码,但我觉得它需要改进或优化。我可以就要更改/修改/删除/优化的内容寻求帮助吗 我对VBA比较陌生 我的代码如下: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
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)=“发送方”