我有一个非常好的VBA预约宏,我发现在很久以前在网上发布了用于在日历中用户选择时间和日期创建预设参数的新约会。
它在Office 2007中运行良好,但随后我们最近转移到Office 2013,以便将机构转变为使用Office 365企业版(教育版)。它完全崩溃了。权限很好所以它实际上正在运行(最后:通过调试器踩到它进行测试)但是它仍然没有做任何事情......甚至没有抛出错误。
这里是宏的代码:
Private Sub CreateAppt(strSubject, strCategories, strLocation, strBody, bolRemindMe, intRemindMe)
Dim objExpl As Outlook.Explorer
Dim objFolder As Outlook.MAPIFolder
Dim objCB As Office.CommandBarButton
Dim objAppt As Outlook.AppointmentItem
Dim objApptCustom As Outlook.AppointmentItem
On Error Resume Next
Set objExpl = Outlook.Application.ActiveExplorer
If Not objExpl Is Nothing Then
Set objFolder = objExpl.CurrentFolder
If objFolder.DefaultItemType = olAppointmentItem Then
Set objCB = objExpl.CommandBars.FindControl(, 1106)
If Not objCB Is Nothing Then
objCB.Execute
Set objAppt = Outlook.Application.ActiveInspector.CurrentItem
Set objApptCustom = objFolder.Items.Add(olAppointmentItem)
With objApptCustom
.Start = objAppt.Start
.End = objAppt.End
.Subject = strSubject
.Location = strLocation
.Categories = strCategories
.ReminderSet = bolRemindMe
.Body = strBody
If bolRemindMe = True Then
.ReminderMinutesBeforeStart = intRemindMe
End If
.Save
End With
objAppt.Delete
End If
End If
End If
Set objCB = Nothing
Set objAppt = Nothing
Set objApptCustom = Nothing
Set objFolder = Nothing
Set objExpl = Nothing
End Sub
这是由暴露的宏调用的,它们恰当地填充了函数的参数,例如:
Sub NewSupport()
Call CreateAppt("CMS Open Support", "Support", "Roberts 109", "", True, 20)
End Sub
我已尝试显式引用ActiveInspector的Outlook.Application,我尝试使用全局提供的常量(olAppointmentItem
)作为Item类型而不是字符串"IPM.Appointment"
我还尝试使用一些代码来迭代可用的命令和命令栏,以防Commandbars.FindControl(, 1106)
的ID在不同版本之间发生变化,而我所有的回复都是"任务窗格"在监察员的任命下,身份证号为5746.
我觉得我的想法已经不多了:即使是一些指向正确方向的东西,也可以尝试新的东西。
定期约会不会起作用,因为那些需要某种形式的常规结构才能重现,但事实并非如此。
自定义表单可能是一个解决方案,但我真的更喜欢能够单击一个按钮来安排特定约会的时间跨度"键入"而且从来没有直接打开任命。
答案 0 :(得分:0)
This Office DevCenter article介绍了如何更新以前依赖CommandBars
的代码,而不是使用功能区扩展性。是的,弃用!
但是等等!在我们开始重构这条路之前,让我们重新审视宏为什么首先使用CommandBars
:在Office 2007和之前的版本中,无法从用户选择本身获取足够的信息< / em> - 您只能对选择中的项目进行操作,这不适用于查找在日历中选择的空白时间段的开始和停止时间。
因此宏依赖于从菜单中激活一个新的约会(使用CommandBars
调用),这将自动填充用户选择的开始和停止时间,因为这是来自Outlook的新约会命令的方式菜单有效。
Office 2010显然改变了这一点。
我们需要做的就是从.SelectedStartTime
获取.SelectedEndTime
和CalendarView
并将其应用到我们的新约会中。 Office开发人员中心的CalendarView.SelectedStartTime Property (Outlook)文章不仅明确地阐述了这一点,而且还附带了示例代码。
对该代码进行一些轻微的修改会产生一个私有子,我们可以将其用作前一个宏的插入,由公开的特定宏调用。
以下代码对该页面中最初详细说明的代码进行了细微更改,其中包括:添加参数,添加With
段以应用它们,以及将新约会直接保存到日历而不是仅打开日历用于查看/编辑。格式稍微好一点。
Private Sub CreateAppointmentUsingSelectedTime(strSubject, strCategories, strLocation, strBody, bolRemindMe, intRemindMe)
Dim datStart As Date
Dim datEnd As Date
Dim oView As Outlook.View
Dim oCalView As Outlook.CalendarView
Dim oExpl As Outlook.Explorer
Dim oFolder As Outlook.Folder
Dim oAppt As Outlook.AppointmentItem
Const datNull As Date = #1/1/4501#
' Obtain the calendar view using
' Application.ActiveExplorer.CurrentFolder.CurrentView.
' If you use oExpl.CurrentFolder.CurrentView,
' this code will not operate as expected.
Set oExpl = Application.ActiveExplorer
Set oFolder = Application.ActiveExplorer.CurrentFolder
Set oView = oExpl.CurrentView
' Check whether the active explorer is displaying a calendar view.
If oView.ViewType = olCalendarView Then
Set oCalView = oExpl.CurrentView
' Create the appointment using the values in
' the SelectedStartTime and SelectedEndTime properties as
' appointment start and end times.
datStart = oCalView.SelectedStartTime
datEnd = oCalView.SelectedEndTime
Set oAppt = oFolder.Items.Add("IPM.Appointment")
With oAppt
.Subject = strSubject
.Location = strLocation
.Categories = strCategories
.ReminderSet = bolRemindMe
.Body = strBody
If bolRemindMe = True Then
.ReminderMinutesBeforeStart = intRemindMe
End If
End With
If datStart <> datNull And datEnd <> datNull Then
oAppt.Start = datStart
oAppt.End = datEnd
End If
oAppt.Save
' oAppt.Display
End If
End Sub
希望这对其他人有所帮助,因为我花了更长的时间(大多数是futiley搜索,因此即将发布这个问题只是一个问题,然后才最终将问题和解决方案隔离开来),而不是我预期的,甚至可能会永远拯救我,创造新的预设约会!