Custom RibbonX (Excel 2007)

17
Writer by [email protected] Page 1 Custom RibbonX (Excel 2007) . Để tạo hệ thống Ribbon dĩ nhiên là dành cho Office 2007 và Công cụ là bộ Microsoft office 2007 Custom UI Editor, file cài đặt: OfficeCustomUIEditorSetup.msi trong địa chỉ sau: http://openxmldeveloper.org/articles/CustomUIeditor.aspx Trước tiên ta xem hình dưới đây Hệ thống Tab: Home, Insert, Page Layout, Formulas, Data, Review, View, Developer, MyTab. Trong mỗi Tab có các Group, ví dụ hình trên Tab Home gồm các Group: Clipboard, Font, Alignment, Number. File Excel cần tạo Tab, Group, … nên save dạng *.xlsm (Excel Macro – Enabled Workbook ) để sau này ta viết code VBA cho Ribbon khi Save sẽ không bị mất code. Để viết code xml ta chạy Microsoft office 2007 Custom UI Editor, mở file Excel cần tạo thêm Ribbon, viết code, Save, Close. Sau đó chạy Excel, mở file vừa viết code xml. Cửa sổ Microsoft office 2007 Custom UI Editor khi chạy Insert Icons – Chèn các biểu tượng, hình ảnh (*.bmp) Validate – kiểm tra code xml Call back – Sau khi viết code xong dùng để gọi code VBA (Macro) để thực thi cho các control. Ta chỉ việc copy code này và dán vào trong module VBA và chỉnh sửa. Tạo ghi chú trong code xml: <!-- ghi chú --> 1. Chèn 1 Tab sau Tab default của Excel Ví dụ sau sẽ chèn Tab có nhãn là “My Tab” sau Tab Home. Tạo 1 file excel: Insert Tab 2007.xlsm, mở file bằng Microsoft office 2007 Custom UI Editor, copy đoạn code dưới đây, save, close.

Transcript of Custom RibbonX (Excel 2007)

Writer by [email protected] Page 1

Custom RibbonX (Excel 2007).Để tạo hệ thống Ribbon dĩ nhiên là dành cho Office 2007 và Công cụ là bộ

Microsoft office 2007 Custom UI Editor, file cài đặt:OfficeCustomUIEditorSetup.msi có trong địa chỉ sau:http://openxmldeveloper.org/articles/CustomUIeditor.aspx

Trước tiên ta xem hình dưới đây

Hệ thống Tab: Home, Insert, Page Layout, Formulas, Data, Review, View,Developer, MyTab. Trong mỗi Tab có các Group, ví dụ hình trên Tab Home gồm cácGroup: Clipboard, Font, Alignment, Number.

File Excel cần tạo Tab, Group, … nên save dạng *.xlsm (Excel Macro – Enabled Workbook ) để sau này ta viết code VBA cho Ribbon khi Save sẽ không bị mất code.

Để viết code xml ta chạy Microsoft office 2007 Custom UI Editor, mở fileExcel cần tạo thêm Ribbon, viết code, Save, Close. Sau đó chạy Excel, mở file vừaviết code xml.

Cửa sổ Microsoft office 2007 Custom UI Editor khi chạy

Insert Icons – Chèn các biểu tượng, hình ảnh (*.bmp)Validate – kiểm tra code xmlCall back – Sau khi viết code xong dùng để gọi code VBA (Macro) để thực thi cho

các control. Ta chỉ việc copy code này và dán vào trong module VBA và chỉnh sửa.Tạo ghi chú trong code xml: <!-- ghi chú -->1. Chèn 1 Tab sau Tab default của ExcelVí dụ sau sẽ chèn Tab có nhãn là “My Tab” sau Tab Home. Tạo 1 file excel:

Insert Tab 2007.xlsm, mở file bằng Microsoft office 2007 Custom UI Editor, copy đoạn code dưới đây, save, close.

Writer by [email protected] Page 2

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"><ribbon><tabs><!-- Nếu bỏ insertAfterMso="TabHome" “My Tab” sẽ chèn ở vị trí cuối cùng” --><tab id="YourCustomTabOnTheRibbon" label="My Tab" insertAfterMso="TabHome"></tab></tabs></ribbon></customUI>

Kết quả sau khi chạy Excel và mở file Insert Tab 2007.xlsm được hình sau

2. Chèn 1 Group trước 1 Group default trong Tab default của ExcelVí dụ sau sẽ chèn Group có nhãn là “Example Group” trước Group Font trong Tab

Home. Trong Group sẽ chèn 2 Button có nhãn là "Hello World" và "Goodbye World". Tạo1 file excel: Insert Group 2007.xlsm, mở file bằng Microsoft office 2007 Custom UI Editor, copy đoạn code dưới đây, save, close. <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <ribbon> <tabs> <tab idMso="TabHome" ><!-- Nếu bỏ insertBeforeMso="GroupFont" “Example Group” sẽ ở vị trí cuối cùng” -->

<group id="customGroup1" label="Example Group" insertBeforeMso="GroupFont" >

<button id="Button1" label="Hello World" size="normal" onAction="HelloWorld" imageMso="HappyFace" /> <button id="Button2" label="Goodbye World" size="normal" onAction="GoodbyeWorld" imageMso="DeclineInvitation" /> </group> </tab> </tabs> </ribbon></customUI>

Kết quả sau khi chạy Excel và mở file Insert Group 2007.xlsm được hình sau

Writer by [email protected] Page 3

Ta chú ý: onAction="HelloWorld" và onAction="GoodbyeWorld" là 2 Macro HelloWorldvà GoodbyeWorld được viết code VBA trong Module1 file Insert Group 2007.xlsm.Sub HelloWorld(control As IRibbonControl) MsgBox "Hello World!"End SubSub GoodbyeWorld(control As IRibbonControl) ThisWorkbook.CloseEnd SubimageMso="HappyFace" imageMso="DeclineInvitation" là gán biểu tượng ảnh (giống FaceId) cho 2 button 1 (HappyFace) và button 2 (DeclineInvitation)Để biết tên và ảnh của imageMso trong Excel 2007 ta có thể dùng file mso image browser.xlsm

3. Chèn các Cotrol trong GroupTrong ví dụ trên ta chú ý đoạn code sau:

<group id="customGroup1" label="Example Group" insertBeforeMso="GroupFont" ><button id="Button1"

label="Hello World" size="normal" onAction="HelloWorld" imageMso="HappyFace" /> <button id="Button2" label="Goodbye World" size="normal" onAction="GoodbyeWorld" imageMso="DeclineInvitation" /></group>

Đoạn code trên chèn 2 button vào trong: group id="customGroup1” nhãn “ExampleGroup”

Trong Group ta có thể chèn các loại Basic Cotrols và Container Controls

3.1. Basic Controls

Coltrol Type Miêu tả Hình ảnh

Writer by [email protected] Page 4

<control.../> Từ các Cotrol có sẵn của Excel tạo thành 1 Tab riêng, Group riêng theo lựa chọn của ngườisử dụng.

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"><ribbon><tabs><tab id="YourCustomTabOnTheRibbon" label="My Tab">group id="Group3" label="Built In Stuff"> <control idMso="Copy" label="Copy" /> <control idMso="Paste" label="Paste" enabled="true" /> <control idMso="WindowSwitchWindowsMenuExcel" label="Switch Window" /> <control idMso="Italic" /> <control idMso="Bold" /> <control idMso="FileOpen" /> </group></tab></tabs></ribbon></customUI>

<labelControl.../> Tạo các nhãn: Label

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"><ribbon><tabs><tab id="YourCustomTabOnTheRibbon" label="My Tab"><group id="Group1" label="Stuff"> <labelControl id="Label1" getLabel="getLabel1" /> <labelControl id="Label2" getLabel="getLabel2" /></group></tab></tabs></ribbon></customUI>

‘Code VBA'Callback for Label1 getLabelSub getLabel1(control As IRibbonControl, ByRef returnedVal) returnedVal = "Hello " & Application.UserName

Writer by [email protected] Page 5

End Sub

'Callback for Label2 getLabelSub getLabel2(control As IRibbonControl, ByRef returnedVal) returnedVal = "Today is " & DateEnd Sub

<button.../> Tạo các nút lệnh khi click chuột sẽ chạy 1 lệnh nào đó.

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"><ribbon><tabs><tab id="YourCustomTabOnTheRibbon" label="My Tab"><group id="customGroup1" label="Example Group" insertBeforeMso="GroupFont" >

<button id="Button1" label="Hello World" size="normal" onAction="HelloWorld" imageMso="HappyFace" /> <button id="Button2" label="Goodbye World" size="normal" onAction="GoodbyeWorld" imageMso="DeclineInvitation" /></group></tab></tabs></ribbon></customUI>‘Code VBASub HelloWorld(control As IRibbonControl) MsgBox "Hello World!"End SubSub GoodbyeWorld(control As IRibbonControl) ThisWorkbook.CloseEnd Sub

<toggleButton.../> Tạo các nút lệnh khi clickchuột sẽ nhận giá trị True(false) và chạy 1 lệnh và bản thân nó cũng thể hiện 1 thuộc tính nào đó (change). Ví dụ trong Group Font, B – Bold, …

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"><ribbon><tabs><tab id="YourCustomTabOnTheRibbon" label="My Tab"><group id="Group2" label="More Stuff">

Writer by [email protected] Page 6

<toggleButton id="ToggleButton1" size="large" imageMso="FileManageMenu" label="Toggle Me" onAction="ToggleButton1_Click" /></group></tab></tabs></ribbon></customUI>‘Code VBA'Callback for ToggleButton1 getPressedSub ToggleButton1_Click(control As IRibbonControl, ByRef returnedVal) MsgBox "Toggle value: " & returnedValEnd Sub

<checkbox.../> Tạo hộp kiểm tra khi click chuột sẽ nhận giá trị True (false) và chạy 1 lệnh. Ví dụ Tab View, checkbox Gridlines khi True sẽ nhìn thấy lưới giữa các cells trong bảng tính và ngược lại.

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"><ribbon><tabs><tab id="YourCustomTabOnTheRibbon" label="My Tab"><group id="Group2" label="Stuff"> <checkBox id="Checkbox1" label="Checkbox" onAction="Checkbox1_Change"/> </group></tab></tabs></ribbon></customUI>‘Code VBA'Callback for Checkbox1 onActionSub Checkbox1_Change(control As IRibbonControl, pressed As Boolean) MsgBox "Checkbox value: " & pressedEnd Sub

<editBox.../> Tạo hộp mà bạn có thể nhập các giá trị vào đó

Writer by [email protected] Page 7

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"><ribbon><tabs><tab id="YourCustomTabOnTheRibbon" label="My Tab"><group id="Group2" label="Stuff"> <editBox id="EditBox1" showLabel="true" label="Number:" onChange="EditBox1_Change"/></group></tab></tabs></ribbon></customUI>‘Code VBA'Callback for EditBox1 onChangeSub EditBox1_Change(control As IRibbonControl, text As String) Dim squareRoot As Double On Error Resume Next squareRoot = Sqr(text) If Err.Number = 0 Then MsgBox "The square root of " & text & " is: " & squareRoot Else MsgBox "Enter a positive number.", vbCritical End IfEnd Sub

<gallery.../> Khi click vào sẽ hiện ra hệ thống giống như menu được bố trí theo hàng, cột . Mỗi một hệ thống khi chọn sẽ thực thi 1 lệnh nào đó.Trong Gallery ta cũng có thể chèn Button(hình bên: button có nhãn là Today…)

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"><ribbon><tabs><tab id="YourCustomTabOnTheRibbon" label="My Tab"><group id="Group4" label="Galleries"> <gallery id="Gallery1" imageMso="ViewAppointmentInCalendar" label="Pick a Month:" columns="2" rows="6" onAction="MonthSelected" >

Writer by [email protected] Page 8

<item id="January" label="January" imageMso="QuerySelectQueryType"/> <item id="February" label="February" imageMso="QuerySelectQueryType"/> <item id="March" label="March" imageMso="QuerySelectQueryType"/> <item id="April" label="April" imageMso="QuerySelectQueryType"/> <item id="May" label="May" imageMso="QuerySelectQueryType"/> <item id="June" label="June" imageMso="QuerySelectQueryType"/> <item id="July" label="July" imageMso="QuerySelectQueryType"/> <item id="August" label="August" imageMso="QuerySelectQueryType"/> <item id="September" label="September" imageMso="QuerySelectQueryType"/> <item id="October" label="October" imageMso="QuerySelectQueryType"/> <item id="November" label="November" imageMso="QuerySelectQueryType"/> <item id="December" label="December" imageMso="QuerySelectQueryType"/> <button id="Today" label="Today..." imageMso="ViewAppointmentInCalendar" onAction="ShowToday"/> </gallery></group></tab></tabs></ribbon></customUI>‘Code VBA'Callback for Gallery1 onActionSub MonthSelected(control As IRibbonControl, id As String, index As Integer) MsgBox "You selected " & idEnd Sub'Callback for Today onActionSub ShowToday(control As IRibbonControl) MsgBox "Today is " & DateEnd Sub‘ Mỗi 1 id ta có thể gán 1 Macro. Ví dụ

Sub MonthSelected(control As IRibbonControl, id As String, index As Integer)Select case id Case is “January”: Call Macro1

Case is "February": Call Macro2 … Case is “December”: Call Macro12End selectEnd Sub

Writer by [email protected] Page 9

Ngoài ra ta cũng có thể đưa hệ thống ảnh vào thay cho Label <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"><ribbon><tabs><tab id="YourCustomTabOnTheRibbon" label="My Tab"><group id="Group4" label="Galleries"><gallery id="Gallery2" label="Banjo Players" size="large" columns="4" itemWidth="100" itemHeight="125" imageMso= "Camera" onAction="OnAction"> <item id="bp01" image="bp01" /> <item id="bp02" image="bp02" /> <item id="bp03" image="bp03" /> <item id="bp04" image="bp04" /> <item id="bp05" image="bp05" /> <item id="bp06" image="bp06" /> <item id="bp07" image="bp07" /> <item id="bp08" image="bp08" /> <item id="bp09" image="bp09" /> <item id="bp10" image="bp10" /> <item id="bp11" image="bp11" /> <item id="bp12" image="bp12" /> <item id="bp13" image="bp13" /> <item id="bp14" image="bp14" /> <item id="bp15" image="bp15" /> </gallery>

</group></tab></tabs></ribbon></customUI>‘Code VBA'Callback for gallery2 onActionSub OnAction(control As IRibbonControl, id As String, index As Integer) MsgBox "You clicked Banjo Photo #" & index + 1End Sub‘ hệ thống: index + 1 tính theo thứ tự: hàng – cột, hình trên hàng 1 có 4 ảnh, index+1 lần lượt là 1, 2, 3, 4Hàng 2, sẽ là 5, 6, 7, 8.Để đưa ảnh ta dùng Insert Icons, chọn file *.*, chọn thư mục chứa ảnh, chọn ảnh, OK.

Writer by [email protected] Page 10

<dynamicMenu.../> Tạo menu động sử dụng cho từng đối tượng riêng rẽ. Ví dụ khi chọn Sheet1 có menu loại 1. Chọn Sheet2 có menu loại 2, …

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="ribbonLoaded"> <ribbon> <tabs> <tab id="CustomTab" label="Dynamic"> <group id="group1" label="Dynamic Menu Demo"> <dynamicMenu id="DynamicMenu" getContent="dynamicMenuContent" imageMso="RegionLayoutMenu" size = "large" label="Sheet-Specific Menu"/> </group> </tab> </tabs> </ribbon></customUI>‘Code VBAOption ExplicitPublic MyRibbon As IRibbonUI'Callback for customUI.onLoadSub ribbonLoaded(ribbon As IRibbonUI): Set MyRibbon = ribbon: End Sub'Callback for DynamicMenu getContentSub dynamicMenuContent(control As IRibbonControl, ByRef returnedVal)' This procedure is executed whenever a sheet is activated' (See the Worksheet_Activate procedure in ThisWorkbook) Dim r As Long Dim XMLcode As String ' Read the XML markup from the active sheet For r = 1 To Application.CountA(Range("A:A")) XMLcode = XMLcode & ActiveSheet.Cells(r, 1) & " " Next r returnedVal = XMLcode 'Debug.Print xml

Writer by [email protected] Page 11

End SubSub UpdateDynamicRibbon()' Invalidate the ribbon to force a call to dynamicMenuContent On Error Resume Next: MyRibbon.Invalidate If Err.Number <> 0 Then MsgBox "Lost the Ribbon object. Save and reload." End IfEnd SubSub Macro1(control As IRibbonControl)' Executed when Sheet1 is active MsgBox "Greetings from the Sheet1 Macro", vbInformationEnd SubSub Macro2(control As IRibbonControl)' Executed when Sheet2 is active MsgBox "Hello from the Sheet2 Macro", vbCriticalEnd SubSub Macro3(control As IRibbonControl)' Executed when Sheet3 is active MsgBox "Aloha from the Sheet3 Macro", vbQuestionEnd Sub

Code xml trên Sheet1, Sheet2, Sheet3 Menu tương ứng

Writer by [email protected] Page 12

<separator.../> Tạo ra thanh đứng ngăn cách giữa cáccotrol trong 1 Group

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"><ribbon><tabs><tab id="YourCustomTabOnTheRibbon" label="My Tab"><group id="customGroup1" label="Example Group" insertBeforeMso="GroupFont" >

<button id="Button1" label="Hello World" size="normal"

Writer by [email protected] Page 13

onAction="HelloWorld" imageMso="HappyFace" /><separator id="sep1" /> <button id="Button2" label="Goodbye World" size="normal" onAction="GoodbyeWorld" imageMso="DeclineInvitation" /></group> </tab> </tabs> </ribbon></customUI>

<menuSeparator.../> Tạo ra thanh ngang ngăn cáchgiữa menu lệnh trong hệ thống menuVí dụ hình bên menuSeparator ngăn cách giữa Paste Link và Paste Special…

<item.../> Tạo ra danh sách khi ta click sẽ hiện ra (list) các lựa chọn như ComboBox hoặc DropDown

Xem mục 3.2 Container Controls

<dialogBoxLauncher.../> Thêm button thực thi lệnh vào Góc dưới bên phải group

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"><ribbon><tabs><tab id="customTab" label="Contoso" insertAfterMso="TabHome">

<group id="SampleGroup" label="Sample Group"><button id="Button1" label="Normal Button" size="normal" />

<dialogBoxLauncher> <button id="Launcher1" onAction="msg" />

</dialogBoxLauncher>

Writer by [email protected] Page 14

</group ></tab></tabs></ribbon></customUI>

3.2. Container Controls

<dropDown...>Contents</dropDown>

Có thể chứa <item> hoặc <button>

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <ribbon> <tabs> <tab id="customTab" label="Example separator" insertAfterMso="TabHome">

<group id="customGroup1" label="Example Group" insertBeforeMso="GroupFont"><dropDown id="Drop1" imageMso="_3DStyle" label="Dropdown" onAction="OnAction"

> <item id="b1" label="Month1" />

<item id="b2" label="Month2" /> </dropDown>

</group> </tab>

</tabs> </ribbon></customUI>

‘code VBA'Callback for gallery2 onActionSub OnAction(control As IRibbonControl, id As String, index As Integer) MsgBox index + 1End Sub

<comboBox...>contents</comboBox>

Chứa các hệ thống <item>

Writer by [email protected] Page 15

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <ribbon> <tabs> <tab id="customTab" label="Tab Custom"<group id="Group2" label="More Stuff"> <comboBox id="Combo1" label="Month" onChange="Combo1_Change"> <item id="Month1" label="January" /> <item id="Month2" label="February"/> <item id="Month3" label="March"/> <item id="Month4" label="April"/> <item id="Month5" label="May"/> <item id="Month6" label="June"/> <item id="Month7" label="July"/> <item id="Month8" label="August"/> <item id="Month9" label="September"/> <item id="Month10" label="October"/> <item id="Month11" label="November"/> <item id="Month12" label="December"/> </comboBox> </group>

</tab> </tabs> </ribbon></customUI>

'Code VBA Callback for Combo1 onChangeSub Combo1_Change(control As IRibbonControl, text As String) MsgBox textEnd Sub

<menu...>contents</menu>

Có thể chứa các <control>, <button>, <toggleButton>, <checkbox>, <gallery>, <dynamicMenu>, <menuSeparator>, <menu> và(hoặc)<splitButton>

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"><ribbon><tabs><tab id="rxExcelVBA" label="Construction"><group id="rxDemo" label="Utilities"><menu id="rxMenu" label="CutBarsSteel"><button id="rxImport" label="Import Bars Section" imageMso="ChartSaveTemplates"

Writer by [email protected] Page 16

onAction="test"/><button id="rxExport" label="Export to AutoCad 2007" imageMso="DrawingObjectFormatDialog" onAction="test"/><button id="rxCaculate" label="Caculate Bars Combination"imageMso="CalculateFull" onAction="test"/><button id="rxSolver" label="Solver Bars Combination"imageMso="Chart3DBarChart" onAction="test"/><button id="rxSortCombination" label="Sort Bars Combination"imageMso="SortDown" onAction="test"/><button id="rxSortL1170" label="Sort Bars L1170"imageMso="SortUp" onAction="test"/><button id="rxClearCombination" label="Clear Bars Combination not Use"imageMso="SortClear" onAction="test"/><button id="rxClearTable" label="Clear Table"imageMso="TableStyleClear" onAction="test"/><button id="rxExit" label="Exit"imageMso="FileExit" onAction="test"/></menu></group></tab></tabs></ribbon></customUI><splitButton...><button.../><menu...>menu contents</menu></splitButton>

Kết hợp giữa Button hoặc toggle-button vàmenu

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"><ribbon><tabs><tab id="rxExcelVBA" label="Construction"><group id="rxDemo" label="Utilities"><splitButton id="rxSplit" size="large"><button id="rxButton" label="CutBarsSteel"

Writer by [email protected] Page 17

imageMso="CalculateFull" onAction="test"/><menu id="rxMenu"><button id="rxImport" label="Import Bars Section" imageMso="ChartSaveTemplates" onAction="test"/><button id="rxExport" label="Export to AutoCad 2007" imageMso="DrawingObjectFormatDialog" onAction="test"/><button id="rxCaculate" label="Caculate Bars Combination"imageMso="CalculateFull" onAction="test"/><button id="rxSolver" label="Solver Bars Combination"imageMso="Chart3DBarChart" onAction="test"/><button id="rxSortCombination" label="Sort Bars Combination"imageMso="SortDown" onAction="test"/><button id="rxSortL1170" label="Sort Bars L1170"imageMso="SortUp" onAction="test"/><button id="rxClearCombination" label="Clear Bars Combination not Use"imageMso="SortClear" onAction="test"/><button id="rxClearTable" label="Clear Table"imageMso="TableStyleClear" onAction="test"/><button id="rxExit" label="Exit"imageMso="FileExit" onAction="test"/></menu></splitButton></group></tab></tabs></ribbon></customUI>