演练:在excel中建立自定义菜单项
brian a. randell
mcw technologies, llc
september 2003
applies to:
microsoft® visual studio® tools for the microsoft office system
microsoft office excel 2003
microsoft visual studio .net 2003
概述:office commandbar对象提供了增加菜单项和工具条按钮代码的途径。在这篇演练中,你将建立自定义菜单项目下的菜单条,并且增加代码来响应office菜单。
内容:
介绍
建立菜单和工具条项目是微软office的一个核心特点,虽然这次试验是示范在微软office excel 2003中使用这些项目,但是这些操作在office word中是类似的。(不同之处在于在word中菜单名是menu bar,而在excel中叫worksheet menu bar。)你将在excel主菜单中建立菜单项。然后,你增加此菜单项。最后,你增加click事件代码来执行自定义代码。
提示:office菜单和工具条的对象模块定义在office.dll中,当你给微软office system项目建立了一个新的visual studio tools时,微软visual studio® .net自动包含到此模块的引用。
先决条件
要完成此演练,下列软件和组件必须安装:
• microsoft visual studio .net 2003 or microsoft visual basic® .net standard 2003
• microsoft visual studio tools for the microsoft office system
• microsoft office professional edition 2003
提示:假如你是visual basic .net编程者,你需要设置option strict为on(或者你在每一个模块中增加option strict声明)。虽然这不是必须的,但是这可以保证你不会执行不安全的类型转换。在以后的时间里,利用此选项的好处将远远大于增加代码的困难。
开始
你将通过建立一个新的visual studio .net的excel项目来开始。
建立项目
使用微软office system的visual studio tool建立一个新的excel工作簿项目(在visual basic .net或是c#中)。
建立一个excel工作簿项目
1. 开始visual studio .net,在文件菜单上,指向新建,点击项目。
2. 在项目类型面板上,扩展微软office system项目,接着选择visual basic 项目或visual c#项目。
3. 在模板面板中选择excel工作簿。
4. 起名为excelcommandbars,接着存储在当地硬盘。
5. 在微软office项目向导中接受缺省值,点击完成。
visual studio .net为你在代码编辑器中打开thisworkbook.vb或是thisworkboo.cs文件。
建立菜单栏项目
在excel主菜单条上建立一个菜单栏项目需要你使用add方法增加一个commandbarcontrol。
在excel中建立菜单栏项目
1. 在已存变量thisapplication和thisworkbook下面增加下列变量:
' visual basic
private mainmenubar as office.commandbar
private menubaritem as office.commandbarcontrol
private withevents menuitem as office.commandbarbutton // c#
private office.commandbar mainmenubar = null;
private office.commandbarcontrol menubaritem = null; private office.commandbarbutton menuitem = null;
2. 在officecodebehing类中增加下列程序(通过项目模板建立),这段程序初始化了先前声明的mainmenubar和menuitembar对象。
' visual basic private
sub initmenubaritems(byval caption as string)
try mainmenubar = thisapplication.commandbars( _ "worksheet menu bar")
menubaritem = mainmenubar.controls.add( _ office.msocontroltype.msocontrolpopup, temporary:=true) menubaritem.caption = caption catch ex as exception messagebox.show(ex.message, _
ex.source, messageboxbuttons.ok, messageboxicon.error)
end try
end sub
// c#
private void initmenubaritems(string caption)
{ try { mainmenubar = thisapplication.commandbars["worksheet menu bar"]; menubaritem = mainmenubar.controls.add( office.msocontroltype.msocontrolpopup, type.missing, type.missing, type.missing, true); menubaritem.caption = caption; }
catch (exception ex) { messagebox.show(ex.message, ex.source, messageboxbuttons.ok, messageboxicon.error); } }
3. 增加下列代码到已存在的thisworkbook_open程序,这段代码调用你刚才建立的initmenubaritems程序。
' visual basic
initmenubaritems("&custom code")
// c#
initmenubaritems("&custom code");
4. 选择文件菜单上的保存所有文件来保存整个方案。
5. 按f5运行项目,装入excel和你的工作簿。
6. 在excel中,查看菜单栏项目标签写着custom code的菜单显示在帮助菜单右边。如图一所示:
图一:有着自定义菜单栏项目的excel
建立菜单项目
有了合适的自定义菜单栏,你就可以加入新的菜单中了。菜单项目表示为commandbarcontrol对象,你将使用先前建立的菜单栏项目controls集合的add方法来建立一个新的commandbarcontrol实例。
建立菜单项目
1. 增加下列程序到officecodebehind类中,这段程序建立了commandbarcontrol并且设置其标题:
' visual basic
private function createbutton( _
byval parent as office.commandbarpopup, _
byval caption as string) as office.commandbarbutton
try
dim cbc as office.commandbarcontrol
cbc = parent.controls.add( _ office.msocontroltype.msocontrolbutton, temporary:=true)
cbc.caption = caption
cbc.visible = true
return directcast(cbc, office.commandbarbutton)
catch ex as exception
messagebox.show(ex.message, _
ex.source, messageboxbuttons.ok, messageboxicon.error) end try
end function
// c#
private office.commandbarbutton createbutton( office.commandbarpopup parent, string caption)
{ office.commandbarcontrol cbc = null;
try { cbc = parent.controls.add( office.msocontroltype.msocontrolbutton, type.missing, type.missing, type.missing, true); cbc.caption = caption; cbc.visible = true; }
catch (exception ex)
{ messagebox.show(ex.message, ex.source, messageboxbuttons.ok, messageboxicon.error); }
return (office.commandbarbutton) cbc; }
2. 增加下列代码到thisworkbook_open程序中,下列代码调用了initmenubaritems程序:
' visual basic
menuitem = createbutton( _
directcast(menubaritem, office.commandbarpopup), _ "run demo code")
// c#
menuitem = createbutton( (office.commandbarpopup)menubaritem, "run demo code");
3. 选择文件菜单上的保存所有文件来保存整个方案。
4. 按f5运行此项目,装入excel和你的工作簿。
5. 在excel中点击自定义的顶级菜单,查看run demo code菜单项。如下图二所示:
图二:增加了一个菜单项之后
拦截菜单项的点击事件
为了完成本次演练,你需要增加一个事件来处理自定义菜单项被点击之后的响应。
(只用在visual basic)
拦截菜单项点击事件
在visual basic .net中完成下列步骤增加菜单项被点击的事件处理程序。
为自定义菜单项增加事件处理(visual basic)
1. 在代码编辑器的左上角的class name下拉列表中选择menuitem。
2. 在代码编辑器的右上角的method name下拉列表中选择click。
3. 修改menuitem_click程序,增加下列代码:
' visual basic
messagebox.show(string.format( _
"you just clicked the button labeled '{0}'.{1}" & _
"the name of your workbook is '{2}'.", _
ctrl.caption, environment.newline, thisworkbook.name), _ "menuitem_click", messageboxbuttons.ok, _ messageboxicon.information)
4. 选择文件菜单中的保存所有文件来保存整个解决方案。
5. 按f5运行这个项目,装入excel和你的工作簿。
6. 在excel中,点击custom code菜单,接着选择run demo code。
一个警告框出现,显示当前工作簿。
(c#)拦截点击菜单项目事件
在visual c#中完成下列步骤来增加点击自定义菜单栏项目的事件处理。
为自定义菜单项目增加事件处理(c#)
1. 增加下列程序到officecodebehind类中:
// c# private
void menuitem_click( office.commandbarbutton ctrl, ref boolean canceldefault) { messagebox.show(string.format( "you just clicked the button labeled '{0}'./n" + "the name of your workbook is '{1}'.", ctrl.caption, thisworkbook.name), "menuitem_click", messageboxbuttons.ok, messageboxicon.information); }
2. 修改thisworkbook_open程序,增加下列代码:
// c#
menuitem.click += new microsoft.office.core. _
commandbarbuttonevents_clickeventhandler(menuitem_click);
提示:如果你输入完代码的第一行(直到+=),visual studio .net将提示你按tab键。代码编辑器将为你插入此行的剩余代码。这个自动完成的新特点使你更容易的完成事件处理程序。
测试本应用
现在你可以测试自己建立的自定义菜单项了。
测试本应用
1. 选择文件菜单的保存所有文件来保存整个项目。
2. 按f5运行这个项目,装入excel和你的工作簿。
3. 在警告框中出现对你当前工作簿的描述。
结论
微软office应用的一个核心特点是建立菜单和工具栏的能力。office commandbar对象提供了一种方法来自定义菜单和工具栏。虽然本次演练示范了你怎样增加代码来响应excel菜单的点击,你将会发现在word中的行为与此类似。