Excel VBA处理一个参数的64个值

Excel VBA处理一个参数的64个值,excel,vba,outlook,Excel,Vba,Outlook,我正在尝试运行一个VBA脚本,该脚本将收到的电子邮件读取到一个帐户,然后在电子表格中标记相应的单元格。我的测试运行在嵌套的IF语句中寻找了9个作业 像这样: If InStr(itm.subject, "Test Backup") > 0 Then J = 2 ElseIf InStr(itm.subject, "TESTdchq") > 0 Then J = 3 ElseIf InStr(itm.subject, "TESTdynam

我正在尝试运行一个VBA脚本,该脚本将收到的电子邮件读取到一个帐户,然后在电子表格中标记相应的单元格。我的测试运行在嵌套的IF语句中寻找了9个作业

像这样:

  If InStr(itm.subject, "Test Backup") > 0 Then 
    J = 2
    ElseIf InStr(itm.subject, "TESTdchq") > 0 Then 
        J = 3
    ElseIf InStr(itm.subject, "TESTdynamics") > 0 Then 
        J = 4
    ElseIf InStr(itm.subject, "TEST-VSS-HQ") > 0 Then 
        J = 5
    ElseIf InStr(itm.subject, "TESTWSUS01") > 0 Then 
        J = 6
    ElseIf InStr(itm.subject, "TEST-Camera") > 0 Then 
        J = 7
    ElseIf InStr(itm.subject, "TEST-Vcenter") > 0 Then 
        J = 8
    ElseIf InStr(itm.subject, "TEST-View Connection") > 0 Then 
        J = 9
    ElseIf InStr(itm.subject, "TESTktsrv1") > 0 Then 
        J = 10
  End If
然而,我的一个实际应用程序有64个工作岗位。我需要一种更有效的方法,根据电子邮件主题中的关键字为J赋值。我假设我可以用数组做一些事情,然后调用数组并与主题进行比较

这里是整个测试脚本,如果这有帮助的话

次级对账测试(itm作为Outlook.MailItem)
Dim xlApp作为Excel.Application
将ExcelWkBk设置为Excel.工作簿
将文件名设置为字符串
将路径名设置为字符串
作为整数的Dim J
'J=将用于声明正确的作业行
PathName=“C:\Users\Owner\Dropbox\Backups\”
FileName=“testreconciesheet.xlsx”
“宣布J
如果InStr(itm.subject,“测试备份”)>0,则
J=2
ElseIf InStr(itm.subject,“TESTdchq”)>0
J=3
ElseIf InStr(itm.subject,“TESTdynamics”)>0
J=4
ElseIf InStr(itm.subject,“测试-VSS-HQ”)>0
J=5
ElseIf InStr(itm.subject,“TESTWSUS01”)>0然后
J=6
ElseIf InStr(itm.subject,“测试摄像机”)>0
J=7
ElseIf InStr(itm.subject,“测试Vcenter”)>0
J=8
ElseIf InStr(itm.subject,“测试视图连接”)>0
J=9
ElseIf InStr(itm.subject,“TESTktsrv1”)>0
J=10
如果结束
设置xlApp=Application.CreateObject(“Excel.Application”)
使用xlApp
.Visible=True“Visible”用于调试
设置ExcelWkBk=xlApp.Workbooks.Open(路径名和文件名)
使用ExcelWkBk
'在此处更新工作簿的VBA代码
Dim今天作为日期
作为整数的Dim D
模糊主题为字符串
'D=将用于声明正确的日期列
今天=天(现在)
D=今天
“标记纸
如果InStr(itm.subject,“[Success]”)大于0,则
.Sheets(“sheet1”).单元格(J,(D+2)).Value=“S”
.板材(“板材1”).单元(J,(D+2)).内饰.颜色指数=43
ElseIf InStr(itm.subject,“[失败]”)则>0
.Sheets(“sheet1”).单元格(J,(D+2)).Value=“F”
.板材(“板材1”).单元(J,(D+2)).内饰.ColorIndex=3
ElseIf InStr(itm.subject,“[警告]”)>0然后
.Sheets(“sheet1”).单元格(J,(D+2)).Value=“W”
.板材(“板材1”).单元(J,(D+2)).内饰.颜色指数=27
如果结束
拯救
.结束
以
退出
以
端接头

对于这么多的变量,我建议使用字典。如有必要,您可以创建全局字典,但以下示例是在本地完成的:

Dim dict As New Scripting.Dictionary
Set dict = CreateObject("Scripting.Dictionary")

dict.Add "Test Backup", 2
dict.Add "TESTdchq", 3
dict.Add "TESTdynamics", 4
dict.Add "TEST-VSS-HQ", 5
dict.Add "TESTWSUS01", 6
dict.Add "TEST-Camera", 7
dict.Add "TEST-Vcenter", 8
dict.Add "TEST-View Connection", 9
dict.Add "TESTktsrv1", 10

Dim J As Integer
J = dict(itm.Subject)

MsgBox "J = " & J

结果:


1个更好的步骤是使用,这样您只需对
itm.subject
进行一次评估。2个更好的步骤可能是数组,但我认为最好的选择是使用一个数组。使用工作表上的查找表谢谢!对于回答,我现在就试试。谢谢你的这个解决方案,我认为它让我非常接近我需要的地方。但是,脚本当前没有正确地将J变量从主题中拉出。为了澄清电子邮件主题的格式是“测试备份[成功]于2014年4月11日2:30完成”。我不确定字典默认情况下是在查找关键字,还是需要使用Instr()来查找关键字?谢谢你到目前为止的帮助。使用字典会有点困难。字符串是否总是以相同的格式显示,键后面总是跟一个空格和
[
?如果是,请尝试以下操作:
J=dict(Trim(Split(itm.subject,[”)(0))
是的,每个作业的主题格式是:%jobname%[%status%]%timestamp%%date Man,我希望我还有两个代表,这样我就可以投票支持你的答案了!这就成功了。