我最近切换到Outlook 2007并注意到我的VBA宏不起作用。我使用以下代码打开一个新的约会项目(并自动填写)。它在Outlook 2003中运行良好,但现在objCB.Execute什么也没做。我尝试了不同的控制ID,它只适用于某些人,但我无法弄清楚为什么或为什么不适用于所有人。
Dim ex As Explorer
Set ex = Application.ActiveExplorer
If ex.CurrentFolder.DefaultItemType <> olAppointmentItem Then
Set ex = Nothing
Exit Sub
End If
Dim objCB As CommandBarButton
Dim objAppt As AppointmentItem
Set objCB = ex.CommandBars.FindControl(, 1106)
If objCB Is Nothing Then Exit Sub
objCB.Execute
安全性设置为最低级别。
答案 0 :(得分:0)
在Office 2007中,您会发现并非每个Control ID都将通过CommandBar.ExecuteMSO运行,尽管它们包含在已发布的列表中。我发现像Shape Galleries这样的复杂控件永远不会起作用,但即使是一些更简单的控件也没有明显的原因被遗漏。
我使用SendKey(在VBA内部)或AutoIT(当SendKey不够时)成功解决了这个问题,并通过击键选择控制,有时还需要鼠标点击。
答案 1 :(得分:0)
这个回答不是关于VBA,在我最近对这个问题的调查中,我没有理由怀疑它不会起作用。我将此答案作为参考。请随身携带或离开。这是outlookcode.com的topic on the issue。
这在这里工作正常(我使用的是C#3 / NET35 / NET4 / Outlook2007)
在对此问题立即指责OOM之前,我首先要确保问题确实与Execute调用,而不是FindControl或其他程序流。还要记住,这些CommandBars可能会受到使用和/或其他加载项的影响:手动查看树(OutlookSpy或代码)以消除任何疑问。另外,我不确定VB如何处理隐式转换,就像赋值一样。确保它没有默默地吞下错误状态。
// working C# as "proof"
int NEW_APPOINTMENT_ID = 1106;
var _button = commandBars.FindControl(Office.MsoControlType.msoControlButton,
NEW_APPOINTMENT_ID, null, false);
try {
// button is of type Office.Core.CommandBarControl or null
if (_button != null) {
_button.Execute();
};
} finally {
Util.ComRelease(ref _button); // My util, but you get the point
}
确保Com-Release按钮 - 就像项目一样,不要依赖RCW来手动处理参考。以这种方式很容易崩溃加载项。