<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Excel Do, Dynamic Does : addins, RibbonX</title><link>http://msmvps.com/blogs/xldynamic/archive/tags/addins/RibbonX/default.aspx</link><description>Tags: addins, RibbonX</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Ribbon on the Fly, or the Zip</title><link>http://msmvps.com/blogs/xldynamic/archive/2011/02/22/riibon-on-the-fly-od-the-zip.aspx</link><pubDate>Tue, 22 Feb 2011 16:10:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1788585</guid><dc:creator>Bob Phillips</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/xldynamic/rsscomments.aspx?PostID=1788585</wfw:commentRss><comments>http://msmvps.com/blogs/xldynamic/archive/2011/02/22/riibon-on-the-fly-od-the-zip.aspx#comments</comments><description>
&lt;p&gt;


&lt;/p&gt;
&lt;p&gt;I recently needed to build an Excel addin that supported a variable number of options, with buttons to invoke the options. That in itself is not unusual, but I also wanted the numbers to be driven by the user; which always complicates matters.&lt;/p&gt;
&lt;p&gt;The definition of the buttons is simple, even allowing for the fact that it will be maintained by users. I could use a separate configuration workbook, an INI file, or even XML. As I am looking to make this a user driven facility, within an overall Excel framework, an Excel workbook seems the best option.&lt;/p&gt;
&lt;p&gt;For the addin, in Excel 2003, we have a simple solution, namely read the workbook and build a menu of options dynamically on startup. As seems to be the norm, it is not so simple for Excel 2007 and 2010. I could just build commandbars as for Excel 2003 and let them show in the Addins tab, but this is a very poor solution in my view. I showed in a &lt;a href="http://tinyurl.com/yz5lkh5"&gt;previous post&lt;/a&gt; last year how we can manage addins in both Excel 2003 and later versions, and support menus or the ribbon, and it was my intention to use this technique here. This does not cater for the variable options in the ribbon however.&lt;/p&gt;
&lt;p&gt;There couple of obvious ways to manage the variable options in the ribbon. One would be to use a dynamic menu control, which can be dynamically populated when the menu is invoked. This is a nice option for lists, such as file lists, but I don&amp;rsquo;t like it as the only option in my ribbons, it does not seem to fit the ribbon paradigm. Another way would be to define a fixed number of buttons, make the visibility of the buttons a dynamic setting, and use the values in the configuration workbook to determine which are made not visible. Again, this is not an ideal solution in my view, it is almost guaranteed that not enough will be defined.&lt;/p&gt;
&lt;p&gt;As I mentioned above, I already have a technique for supporting menus and the ribbon in my addins, and this consists of an Excel 2003 addin which is the primary component that checks the version, builds commandbar menus if the Excel version is less than 12 (Excel 2003 or earlier), otherwise it opens a ribbon wrapper addin. All of the grunt work is done in the Excel 2003 addin, and these procedures are called from the ribbon wrapper addin. The key here for Excel 2007 and on is that the ribbon addin is not initially opened. As Excel 2007 is a zip file with various components, including a CustomUI XML component, it is possible to open this zip file and overwrite the CustomUI XML. So, before I need to open the ribbon addin, I can dynamically update the XML, and I have a fully dynamic ribbon.&lt;/p&gt;
&lt;p&gt;Of course, there is still the issue of calling the correct procedure regardless of whether the addin is loaded in Excel 2003 or a ribbon enabled Excel. The issue arise in the ribbon wrapper, the button actions need to call procedures in the Excel 2003 addin, and in my technique I do this using Application.Run calls across projects. Because all of the code in my required addin will perform the same action, just on differing files which are defined in the configuration file, this works fine, but the configuration file could always be extended to provide the name of the project and procedure to be called.&lt;/p&gt;
&lt;p&gt;So much or the theory, just need to get on and create it now.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1788585" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/RibbonX/default.aspx">RibbonX</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/Excel+2007/default.aspx">Excel 2007</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/addins/default.aspx">addins</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/dynamic/default.aspx">dynamic</category></item><item><title>Deploy Me Simple</title><link>http://msmvps.com/blogs/xldynamic/archive/2010/03/27/deploy-me-simple.aspx</link><pubDate>Sat, 27 Mar 2010 12:50:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1762454</guid><dc:creator>Bob Phillips</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/xldynamic/rsscomments.aspx?PostID=1762454</wfw:commentRss><comments>http://msmvps.com/blogs/xldynamic/archive/2010/03/27/deploy-me-simple.aspx#comments</comments><description>&lt;p&gt;
	






&lt;/p&gt;
&lt;h2&gt;Excel 2003 Addins In Excel 2007&lt;/h2&gt;
&lt;p&gt;Excel 2007 and 2010 is so different in concept to Excel 2003 and before that there are many new challenges in providing solutions that can be deployed in either version.&lt;/p&gt;
&lt;p&gt;One challenge that I have been faced with is creating addins that may be used in Excel 2007 or earlier versions. My addins would usually have a menu and/or a toolbar to provide access to the functionality within the addin. In previous versions of Excel, this has been an elegant solution as most people are familiar with the menus and are easily able to find the new functions in the Excel 2003 UI.&lt;/p&gt;
&lt;p&gt;As with many things, Excel 2007 changed all of that. Excel 2007 supports the old commandbar model, but in a particularly inelegant way. The menus and toolbars that an addin might create are dropped onto the &lt;b&gt;&lt;i&gt;Add-Ins&lt;/i&gt;&lt;/b&gt;
tab. Figure 1 shows my Excel 2007, with two addins installed, NameManager&lt;a href="#_ftn1" name="_ftnref1"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; and Snagit&lt;a href="#_ftn2" name="_ftnref2"&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="MsoCaption" style="text-align:center;" align="center"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/xldynamic/6283.Vanilla-Addins.png"&gt;&lt;img src="http://msmvps.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/xldynamic/6283.Vanilla-Addins.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="center"&gt;&lt;b&gt;Figure 1 - Addins Tab&lt;/b&gt;&lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/xldynamic/0508.NameManager-Menu.png"&gt;&lt;img src="http://msmvps.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/xldynamic/0508.NameManager-Menu.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="MsoCaption" style="text-align:center;" align="center"&gt;&lt;b&gt;Figure 2 - NameManager Menu&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;As I said, this is not an elegant solution, far better to adopt the Ribbon paradigm and either add a ribbon tab, or add a group to an existing tab.&lt;/p&gt;
&lt;p&gt;The problem here is that whilst Excel 2007 can handle commandbars, Excel 2003 doesn&amp;rsquo;t understand the ribbon. The obvious solution is to have two versions of your addin, one that is Excel 203 compliant, one for Excel 2007.&amp;nbsp; This is far from ideal, having to maintain two versions where 90+% of the code will be the same is a maintenance nightmare. Another alternative is to put all of the common code into a DLL, which would still be multiple files and might entail a large amount of work re-writing the code to manage an Excel instance.&lt;/p&gt;
&lt;p&gt;The solution that I am proposing here is to have two addins, but two very different addins.&lt;/p&gt;
&lt;h2&gt;Overall Design&lt;/h2&gt;
&lt;p&gt;I will be using one of my addins in the discussion that follows. This addin, called &amp;lsquo;&lt;b&gt;&lt;i&gt;SP Builder&lt;/i&gt;&lt;/b&gt;&amp;rsquo;&lt;a href="#_ftn3" name="_ftnref3"&gt;&lt;sup&gt;3&lt;/sup&gt;&lt;/a&gt;, is a small addin with a simple menu that will usefully demonstrate this technique without confusing the matter with too much detail.&lt;span&gt;&amp;nbsp; &lt;/span&gt;The 2003 menu for &amp;lsquo;&lt;b&gt;&lt;i&gt;SP Builder&lt;/i&gt;&lt;/b&gt;&amp;rsquo; is shown in &lt;span&gt;Figure &lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align:center;" align="center"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/xldynamic/8831.SP-Builder-Menu.png"&gt;&lt;img src="http://msmvps.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/xldynamic/8831.SP-Builder-Menu.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoCaption" style="text-align:center;" align="center"&gt;&lt;b&gt;Figure 3 &amp;ndash; SP Builder Menu&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Figure 4 shows the ribbon version of &amp;lsquo;&lt;b&gt;&lt;i&gt;SP Builder&lt;/i&gt;&lt;/b&gt;&amp;rsquo;. As you can see, I have added a three button group to the Developer tab in the ribbon.&lt;/p&gt;
&lt;p style="text-align:center;" align="center"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/xldynamic/8424.SP-Builder-Ribbon.png"&gt;&lt;img src="http://msmvps.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/xldynamic/8424.SP-Builder-Ribbon.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="MsoCaption" style="text-align:center;" align="center"&gt;&lt;b&gt;Figure 4 - SP Builder Ribbon&lt;/b&gt;&lt;/p&gt;
&lt;p style="page-break-after:avoid;"&gt;The functionality of each addin is as follows:-&lt;/p&gt;
&lt;ul style="margin-top:0cm;"&gt;
&lt;li class="MsoNormal"&gt;Excel 2003 &amp;ndash; functionally unchanged, apart from modifying the workbook open code to test the Excel version, if it is 2003 or lower the commandbars are loaded, if not the Excel 2007 workbook is opened. The workbook close code deletes the commandbars or closes the Excel 2007 addin&lt;/li&gt;
&lt;li class="MsoNormal"&gt;Excel 2007 &amp;ndash; a basic addin that has ribbon XML. The callback code invokes the actual procedures in the Excel 2003 addin. When this addin loads, the ribbon is automatically built, and, because the Excel 2003 addin checks the version, the coomandbars are not loaded so we have nothing in the &lt;b&gt;&lt;i&gt;Add-Ins&lt;/i&gt;&lt;/b&gt; tab.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Excel 2003 Addin&lt;/h2&gt;
&lt;p&gt;As mentioned above, the only changes to the Excel 2003 addin are the open and close routines.&lt;/p&gt;
&lt;p&gt;The workbook open checks the current Excel version and either creates the commandbars, or loads the Excel 2007 workbook, depending upon the version, as shown in Figure 5.&lt;/p&gt;
&lt;div style="border:1pt solid windowtext;padding:1pt 4pt;font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If &lt;/span&gt;Val(Application.Version) &amp;lt; 12 &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;
	       &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If Not&lt;/span&gt; mhCommandBars.CreateMenu(False) &lt;span style="color:blue;"&gt;Then&lt;/span&gt; Err.Raise appErrorGeneric&lt;br /&gt;
	       &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Else&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;
	       &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Workbooks.Open ThisWorkbook.Path &amp;amp; Application.PathSeparator &amp;amp; WB_RIBBON&lt;br /&gt;
	       &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End If&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="text-align:center;" align="center"&gt;&lt;b&gt;&lt;span style="font-size:10pt;"&gt;Figure 5 &amp;ndash; Addin Initialisation&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Similarly, the workbook close changes are shown in Figure 6.&lt;/p&gt;
&lt;div style="border:1pt solid windowtext;padding:1pt 4pt;font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;If &lt;/span&gt;Val(Application.Version)&amp;lt; 12 &lt;span style="color:blue;"&gt;Then&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;
	   	   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Call mhCommandBars.DeleteMenu&lt;br /&gt;
	   	   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;Else&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;
 	   	   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Workbooks(WB_RIBBON).Close SaveChanges:=False &lt;br /&gt;
	  	   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;End If&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p style="text-align:center;" align="center"&gt;&lt;b&gt;Figure 6 &amp;ndash; Addin Removal&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;That is all that is required in the Excel 2003 addin, as you can see this adds no maintenance overhead.&lt;/p&gt;
&lt;h2&gt;Excel 2007 Addin&lt;/h2&gt;
&lt;p&gt;The Excel 2007 addin is completely new, but again there is nothing difficult or overly complex in this code. It is basically a wrapper to present the ribbon to the user, it has no real functional purpose in itself.&lt;/p&gt;
&lt;p&gt;First we will look at the XML required to define the ribbon changes. Figure 7 shows the XML.&lt;/p&gt;
&lt;p&gt;The XML here is very straight-forward, a single group with three buttons. It is likely that your addin will have a richer interface which will require more XML but that is not the objective of this article. As you can see, the group is added to the&lt;b&gt; &lt;i&gt;Developer&lt;/i&gt;&lt;/b&gt; tab. This is because I see the &lt;b&gt;&lt;i&gt;SP Builder&lt;/i&gt;&lt;/b&gt; addin as a development tool, but your addin could be in any tab, or even add another tab to the ribbon. One other thing to note is that all of the buttons call the same callback routine, this is explained later.&lt;/p&gt;
&lt;div style="border:1pt solid windowtext;padding:1pt 4pt;font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;
&lt;p style="border:medium none;padding:0cm;margin-bottom:0.0001pt;page-break-after:avoid;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;customUI &lt;/span&gt;&lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;a href="http://schemas.microsoft.com/office/2006/01/customui"&gt;http://schemas.microsoft.com/office/2006/01/customui&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;onLoad&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;rxspRibbonOnLoad&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="border:medium none;padding:0cm;margin-bottom:0.0001pt;"&gt;&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;ribbon &lt;/span&gt;&lt;span style="color:red;"&gt;startFromScratch&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;false&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="border:medium none;padding:0cm;margin-bottom:0.0001pt;"&gt;&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;tabs&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="border:medium none;padding:0cm;margin-bottom:0.0001pt;"&gt;&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;tab &lt;/span&gt;&lt;span style="color:red;"&gt;idMso&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;TabDeveloper&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="border:medium none;padding:0cm;margin-bottom:0.0001pt;"&gt;&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;group &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;grpSPBuilder&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;label&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;SP Builder&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;button &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;btnSPBuilder&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;label&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;Build SPs&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;imageMso&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;ControlsGallery&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;size&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;large&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;onAction&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;rxspOnAction&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;button &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;btnSPList&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;label&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;List SPs&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;imageMso&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;ConditionalFormattingHighlightDuplicateValues&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;size&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;large&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;onAction&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;rxspOnAction&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:maroon;"&gt;button &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;btnSPAbout&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;label&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;About...&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;imageMso&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;&amp;quot;&lt;span style="color:blue;"&gt;Info&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:red;"&gt;size=&amp;quot;large&amp;quot;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:red;"&gt;onAction&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;&lt;span style="color:blue;"&gt;rxspOnAction&lt;/span&gt;&amp;quot;&lt;span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;group&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;tab&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;tabs&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;ribbon&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;

		&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:maroon;"&gt;customUI&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;
		&lt;br /&gt;&lt;/div&gt;
&lt;p style="text-align:center;" align="center"&gt;&lt;b&gt;Figure 7 &amp;ndash; Ribbon XML&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;In my Excel 2007 ribbon handling code, I always create a set of constants for the ids of each of the controls, as shown in Figure 8, which are then used in the callback code.&lt;/p&gt;
&lt;div style="border:1pt solid windowtext;padding:1pt 4pt;font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;
&lt;p style="text-align:left;" align="left"&gt;&lt;span style="color:blue;"&gt;Option Explicit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;

			&lt;span style="color:blue;"&gt;Global Const &lt;/span&gt;CONTROL_ID_BUILD&lt;span style="color:blue;"&gt; As String &lt;/span&gt;= &amp;quot;btnSPBuilder&amp;quot;&lt;br /&gt;
	
			&lt;span style="color:blue;"&gt;Global Const &lt;/span&gt;CONTROL_ID_LIST&lt;span style="color:blue;"&gt; As String &lt;/span&gt;= &amp;quot;btnSPList&amp;quot;&lt;br /&gt;

			&lt;span style="color:blue;"&gt;Global Const &lt;/span&gt;CONTROL_ID_ABOUT&lt;span style="color:blue;"&gt; As String &lt;/span&gt;= &amp;quot;btnSPAbout&amp;quot;&lt;/p&gt;
&lt;/div&gt;
&lt;p style="text-align:center;" align="center"&gt;&lt;b&gt;Figure  8 &amp;ndash; Ribbon Constants&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The final piece of this jigsaw is the ribbon callback code, Figure 9. As said earlier, I use a single callback and test the control id to determine the action to take. The key aspect of this code is that the action for each of the buttons is to run the &amp;lsquo;real&amp;rsquo; procedure in the Excel 2003 addin, which is achieved with &lt;b&gt;&lt;i&gt;Application.Run&lt;/i&gt;&lt;/b&gt;&lt;a href="#_ftn4" name="_ftnref4"&gt;&lt;sup&gt;4&lt;/sup&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div style="border:1pt solid windowtext;padding:1pt 4pt;font-size:10pt;font-family:&amp;#39;Courier New&amp;#39;;"&gt;
&lt;p style="text-align:left;" align="left"&gt;&lt;span style="color:blue;"&gt;Option Explicit&lt;/span&gt;

			&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align:left;" align="left"&gt;&lt;span style="color:blue;"&gt;Global&lt;/span&gt; rxspIRibbon &lt;span style="color:blue;"&gt;As&lt;/span&gt; IRibbonUI&lt;br /&gt;&lt;br /&gt;

			&lt;span style="color:blue;"&gt;Public Sub&lt;/span&gt; rxspOnAction(control &lt;span style="color:blue;"&gt;As&lt;/span&gt; IRibbonControl)&lt;br /&gt;

			&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Select Case&lt;/span&gt; control.ID&lt;br /&gt;&lt;br /&gt;

			&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case&lt;/span&gt; CONTROL_ID_BUILD:&amp;nbsp; Application.Run &amp;quot;&amp;#39;SP Builder.xla&amp;#39;!SPBuild&amp;quot;&lt;br /&gt;&lt;br /&gt;

			&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case&lt;/span&gt; CONTROL_ID_LIST:&amp;nbsp;&amp;nbsp; Application.Run &amp;quot;&amp;#39;SP Builder.xla&amp;#39;!SPList&amp;quot;&lt;br /&gt;&lt;br /&gt;

			&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case&lt;/span&gt; CONTROL_ID_ABOUT:&amp;nbsp; Application.Run &amp;quot;&amp;#39;SP Builder.xla&amp;#39;!AboutSPBuilder&amp;quot;&lt;a href="#_ftn5" name="_ftnref5"&gt;&lt;sup&gt;5&lt;/sup&gt;&lt;/a&gt;&lt;br /&gt;

			&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End Select&lt;/span&gt;&lt;br /&gt;

			&lt;span style="color:blue;"&gt;End Sub&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;

			&lt;span style="color:blue;"&gt;Public Sub&lt;/span&gt; rxspRibbonOnLoad(ribbon As IRibbonUI)&lt;br /&gt;

			&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set&lt;/span&gt; rxspIRibbon = ribbon&lt;br /&gt;
	
			&lt;span style="color:blue;"&gt;End Sub&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p style="text-align:center;" align="center"&gt;&lt;b&gt;Figure 9 - Ribbon Callback Code&lt;/b&gt;&lt;/p&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;This provides a simple, and elegant, way to manage addins that are required to be deployed in Excel 2007 or earlier versions.&lt;/p&gt;
&lt;p&gt;By using a ribbon wrapper to deliver the ribbon changes, we are keeping the code to a minimum, and it is not introducing a maintenance overhead.&lt;/p&gt;
&lt;div&gt;

		
&lt;hr align="left" /&gt;
&lt;div id="ftn1"&gt;
&lt;p class="MsoFootnoteText"&gt;
			&lt;span class="MsoFootnoteReference"&gt;
			&lt;span style="font-size:10pt;font-family:Arial;"&gt;&lt;a href="#_ftnref1" name="_ftn1"&gt;1&lt;/a&gt;There is a 2007 version of NameManager which I believe has a ribbon, but I have not installed it&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id="ftn2"&gt;
&lt;p class="MsoFootnoteText"&gt;
			&lt;span class="MsoFootnoteReference"&gt;
			&lt;span style="font-size:10pt;font-family:Arial;"&gt;&lt;a href="#_ftnref2" name="_ftn2"&gt;2&lt;/a&gt; Interestingly, Snagit has not added to the ribbon although the product has adopted the Ribbon UI!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id="ftn3"&gt;
&lt;p class="MsoFootnoteText"&gt;
			&lt;span class="MsoFootnoteReference"&gt;
			&lt;span style="font-size:10pt;font-family:Arial;"&gt;&lt;a href="#_ftnref3" name="_ftn3"&gt;3&lt;/a&gt; Although t is not material to this discussion, &amp;lsquo;&lt;b&gt;&lt;i&gt;SP Builder&lt;/i&gt;&lt;/b&gt;&amp;rsquo; is a small addin that simplifies building stored procedures and loading them into a database&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id="ftn4"&gt;
&lt;p class="MsoFootnoteText"&gt;
			&lt;span class="MsoFootnoteReference"&gt;
			&lt;span style="font-size:10pt;font-family:Arial;"&gt;&lt;a href="#_ftnref4" name="_ftn4"&gt;4&lt;/a&gt; Although you cannot pass parameters directly in a callback, this technique also allows passing a paremeter to the 2003 procedure. This could be useful to let the &amp;#39;worker&amp;#39; addin know that you are running from Excel 2007 if it wanted to do something differently in that instance&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id="ftn5"&gt;
&lt;p class="MsoFootnoteText"&gt;
			&lt;span class="MsoFootnoteReference"&gt;
			&lt;span style="font-size:10pt;font-family:Arial;"&gt;&lt;a href="#_ftnref5" name="_ftn5"&gt;5&lt;/a&gt; It would be a far better practice to create global constants with the called addin and procedure details rather that repeating this in hardcoded form, similar to how I manage the control Ids&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1762454" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/RibbonX/default.aspx">RibbonX</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/2007/default.aspx">2007</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/Excel/default.aspx">Excel</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/Ribbon/default.aspx">Ribbon</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/VBA/default.aspx">VBA</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/2003/default.aspx">2003</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/addins/default.aspx">addins</category></item></channel></rss>