Outlook 2007 CommandBarControl.Execute将无法正常工作

时间:2009-11-13 14:24:00

标签: vba outlook

我最近切换到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

安全性设置为最低级别。

2 个答案:

答案 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来手动处理参考。以这种方式很容易崩溃加载项。