演練:在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事件代碼來執(zhí)行自定義代碼。
提示: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聲明)。雖然這不是必須的,但是這可以保證你不會執(zhí)行不安全的類型轉換。在以后的時間里,利用此選項的好處將遠遠大于增加代碼的困難。
開始
你將通過建立一個新的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,接著存儲在當?shù)赜脖P。
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。
一個警告框出現(xiàn),顯示當前工作簿。
(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鍵。代碼編輯器將為你插入此行的剩余代碼。這個自動完成的新特點使你更容易的完成事件處理程序。
測試本應用
現(xiàn)在你可以測試自己建立的自定義菜單項了。
測試本應用
1. 選擇文件菜單的保存所有文件來保存整個項目。
2. 按f5運行這個項目,裝入excel和你的工作簿。
3. 在警告框中出現(xiàn)對你當前工作簿的描述。
結論
微軟office應用的一個核心特點是建立菜單和工具欄的能力。office commandbar對象提供了一種方法來自定義菜單和工具欄。雖然本次演練示范了你怎樣增加代碼來響應excel菜單的點擊,你將會發(fā)現(xiàn)在word中的行為與此類似。