Vba Outlook 2007+;当项目类型=Outlook.mailItem时,将Application.ActiveExplorer.Selection.Item强制转换为Outlook.mailItem

Vba Outlook 2007+;当项目类型=Outlook.mailItem时,将Application.ActiveExplorer.Selection.Item强制转换为Outlook.mailItem,vba,outlook,Vba,Outlook,以以下outlook vba为例: 子文件电子邮件() 将myOlExp设置为Outlook.Explorer 将myOlSel设置为Outlook。选择 设置myOlExp=Application.ActiveExplorer 设置myOlSel=myOlExp.Selection 如果myOlSel.Count=0,则 MsgBox“未选择任何对象。” 其他的 对于myOlSel中的每个SelectedItem 如果(SelectedItem的类型为Outlook.mailItem),则 将

以以下outlook vba为例:

子文件电子邮件()
将myOlExp设置为Outlook.Explorer
将myOlSel设置为Outlook。选择
设置myOlExp=Application.ActiveExplorer
设置myOlSel=myOlExp.Selection
如果myOlSel.Count=0,则
MsgBox“未选择任何对象。”
其他的
对于myOlSel中的每个SelectedItem
如果(SelectedItem的类型为Outlook.mailItem),则
将mailItem设置为Outlook.mailItem
设置mailItem=SelectedItem
itemMessage=“该项目是一封电子邮件。主题为“&mailItem.subject&”
mailItem.Display(False)
ElseIf(SelectedItem的类型为Outlook.contactItem),然后
将contactItem设置为Outlook.contactItem
设置contactItem=SelectedItem
itemMessage=“该项目是一个联系人。全名为“&contactItem.Subject&”
contactItem.Display(假)
ElseIf(SelectedItem的类型为Outlook.AppointmentItem),然后
将应用程序设置为Outlook.AppointmentItem
设置apptItem=SelectedItem
itemMessage=“该项目是一个约会。”&apptItem.Subject&”
ElseIf(SelectedItem的类型为Outlook.taskItem),然后
将taskItem设置为Outlook.taskItem
Set taskItem=SelectedItem
itemMessage=“项目是任务。正文是”&taskItem.body&”
ElseIf(SelectedItem的类型为Outlook.meetingItem)则
将会议项目设置为Outlook.meetingItem
Set meetingItem=SelectedItem
itemMessage=“项目是会议项目。主题是“&meetingItem.subject&”
如果结束
下一个SelectedItem
expMessage=expMessage&itemMessage
MsgBox(expMessage)
如果结束
端接头
如果我在收件箱中选择了一些项目并运行此代码,它将成功识别SelectedItem是Outlook.mailItem,但在尝试将SelectedItem强制转换为Outlook.mailItem时,我会出现以下错误(即使typeof参数返回true):

我怎样才能演这个角色?我将此代码基于以下.net示例(使用TryCast):


我没有测试您的代码,但这里有几点可能会有所帮助

Outlook VBA与VB.NET不同。VB.NET是较新的一代,有许多改进

其中一个改进是可以在块级别声明变量。对于VBA,只能在模块或例程级别声明变量。我不知道如果在循环中重新声明变量会发生什么,所以将所有Dim语句移到顶部


VB.NET不使用SET。VBA需要设置对象,所以请尝试设置mailItem=SelectedItem。

我还没有测试您的代码,但这里有几点可能会有所帮助

Outlook VBA与VB.NET不同。VB.NET是较新的一代,有许多改进

其中一个改进是可以在块级别声明变量。对于VBA,只能在模块或例程级别声明变量。我不知道如果在循环中重新声明变量会发生什么,所以将所有Dim语句移到顶部


VB.NET不使用SET。VBA需要设置对象,所以请尝试设置mailItem=SelectedItem。

我还没有测试您的代码,但这里有几点可能会有所帮助。Outlook VBA与VB.NET不同。VB.NET是较新的一代,有许多改进。其中一个改进是可以在块级别声明变量。对于VBA,只能在模块或例程级别声明变量。我不知道如果在循环中重新声明变量会发生什么,所以将所有
Dim
语句移到顶部。VB.NET不使用
SET
。VBA需要为对象设置
SET
,所以请尝试设置
SET mailItem=SelectedItem
。嗨,Tony,内联Dims很好(尽管我还是会将它们移到顶部),是缺少
SET
导致了问题(Doh!)-我不介意,但我已经写了多年的.net和经典asp应用程序-惊讶的是我自己没有注意到这一点(还有点尴尬!)-无论如何-将其作为答案发布&我会将其标记为解决方案。干杯。我还没有测试你的代码,但这里有几点可能会有所帮助。Outlook VBA与VB.NET不同。VB.NET是较新的一代,有许多改进。其中一个改进是可以在块级别声明变量。对于VBA,只能在模块或例程级别声明变量。我不知道如果在循环中重新声明变量会发生什么,所以将所有
Dim
语句移到顶部。VB.NET不使用
SET
。VBA需要为对象设置
SET
,所以请尝试设置
SET mailItem=SelectedItem
。嗨,Tony,内联Dims很好(尽管我还是会将它们移到顶部),是缺少
SET
导致了问题(Doh!)-我不介意,但我已经写了多年的.net和经典asp应用程序-惊讶的是我自己没有注意到这一点(还有点尴尬!)-无论如何-将其作为答案发布&我会将其标记为解决方案。干杯
Object variable or with block variable not set