Custom Ribbon with VBA in Visio Stencil

Started by Thomas Winkel, March 28, 2016, 03:34:22 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Thomas Winkel

Hi,

please find attached a stencil that will draw a custom Ribbon "Visio-Tools" on load.
The XML code that defines the Ribbon is stored in the stencils document ShapeSheet "User.Ribbon".
You can export, modify and import the XML code with a mouse click.
The Ribbon will refresh automatically, no restart required.

User settings (XMLPath and reloadOnImport) are stored in the Windows Registry.
There is a button to remove this Registry settings.

The code has been derived from here:
http://blog.bvisual.net/2011/03/14/how-to-run-vba-macros-from-a-ribbon-button-in-visio-2010/
But it is much more comfortable to create the XML in your favorite editor (in my case Notepad++) than with code.

Feel free to use this stencil as start-up for your own projects.
Please give feedback if there is something to improve.

Regards,
Thomas

phillip_141

How can I view the shapsheet of the stencil? I figured it would be the same as  viewing it for a document, but the entire shape  design section of the developer ribbon is greyed out when I open just the stencil. The reason I ask is because I wanted to add this code to an existing stencil I use, but kept getting xml import errors. I can get the original "Visio tools" file to accept the xml file I have edited, but my stencil hits an error at this line:

ThisDocument.DocumentSheet.Cells("User.Ribbon").FormulaU = Chr(34) & XML & Chr(34)

which is from the "importXML()" sub.

Any help you could provide would be awesome.

Thomas Winkel

Hi,

the problem is, that the code tries to access an user cell "User.Ribbon" that does not exist in your stencil.
So you have to create it by hand:
* Right click on stencil: Edit Stencil
* Right click on stencil: Drawing Explorer Window
* Right click on root in Drawing Explorer Window: Show ShapeSheet
* Right click in ShapeSheet: Insert Section -> User defined cells

Here is a video:
https://youtu.be/hzWDNw9dz8k

Regards,
Thomas

phillip_141

Ah I see. Thank you! I'm sure I can make use of this in the future! Nice ribbon code by the way. Managed to make lots of changes and expand the ribbon to suit my needs. I appreciate your assistance!

kedas

#4
Hi,

is it possible to call macros inside the open document from the vss ribbon button?
I like to update the ribbon by opening a vss after opening a document but I can't seem to call subs from that document.

Thanks

kedas

#5
I have this file attached, the macros don't fire (macros are just msgbox now to see if it works)
When pressing Ctrl+Shift+C it will change the Ribbon, only my 2 buttons.
When pressing Ctrl+Shift+R it will reset the Ribbon with my 2 extra butons

Do you know why they don't work??
I basically used the code of the stencil example but put it in a .vsd file (I don't use set CustomUI close reopen)

edit, found it i thought you could choose the name 'Button_OnAction'

DJHarris71

#6
Hello,
I know this is post is a bit old, but this is the solution I have been looking for!  Thanks very much!
I did make mine a bit simpler and chose to create a string in VBA for the XML, and got rid of all the subs that move the string in and out of the shape data.  It works very well.


    ribbonXML = "<customUI onLoad=""OnRibbonLoad"" xmlns=""http://schemas.microsoft.com/office/2009/07/customui"">"
    ribbonXML = ribbonXML + "   <ribbon>"
    ribbonXML = ribbonXML + "       <tabs>"
    ribbonXML = ribbonXML + "           <tab id=""Tab1"" label=""Tab1"">"
    ribbonXML = ribbonXML + "               <group id=""Group1"" label=""Group1"" >"
    ribbonXML = ribbonXML + "                   <button id=""Button1"" label=""Button1"" supertip=""Button1"" size=""large"" imageMso=""MailMergeGoToNextRecord"" onAction=""Button_OnAction""/>"
    ribbonXML = ribbonXML + "                   <button id=""Button2"" label=""Button2"" supertip=""Button2"" size=""large"" imageMso=""SignaturesLoading"" onAction=""Button_OnAction""/>"
    ribbonXML = ribbonXML + "               </group>"
    ribbonXML = ribbonXML + "           </tab>"
    ribbonXML = ribbonXML + "       </tabs>"
    ribbonXML = ribbonXML + "   </ribbon>"
    ribbonXML = ribbonXML + "</customUI>"


However - it seems anytime I try to do something not provided in your example, my ribbon will not load.  Here are the three things I tried:
1) adding getVisible=""getVisible"" to the tabs and groups. 
2) adding getEnabled=""getEnabled"" to the tabs and groups. 
3) adding an editBox

All the above use the standard method (add the action in the ribbon with the callback sub name, add the callback sub) as shown below:


{the gobal variable}
Public objRibbonVisible As Boolean
'
{inside the ribbon string}
ribbonXML = ribbonXML + "               <group id=""Group1"" label=""Group1"" getVisible=""GetVisible"">"

{The callback sub}
Public Sub GetVisible(control As IRibbonControl, visible)
    visible = objRibbonVisible
    objRibbon.Invalidate
End Sub

Is there something I am missing??

perry59

I know this is an old thread, but hope I can still get an answer.
I'm new to this ribbon (been on visio 2007 until just this year) stuff but found this stencil pretty cool and modified it to suite my needs pretty easily.
the only thing I can't get it to do is use different icons for the buttons.
there are lines in the xml file like this imageMso="SomeIcon" which specify an image but if I change that to any of the other icons which are in the word document that contains them, no image shows up.
What am I doing wrong? does this xml code actually access that word document on microsoft's site each time it loads? that doesn't sound very efficient, and what if you have no internet connection?
Thanks for any help
what, me worry?

AndyW

Handle the following to load your image,

Public Function LoadImage(strImageName As String) As IPictureDisp
Live life with an open mind

perry59

Quote from: AndyW on March 16, 2020, 11:01:17 AM
Handle the following to load your image,

Public Function LoadImage(strImageName As String) As IPictureDisp

I don't see any code at all like that in the current stencil but it loads images just fine.
what, me worry?

Remko

HI, I get a permission denied trying to export the XML.  or do you need to supply one first? was hoping to export one so i can look and learn from it.

Thomas Winkel

Hi,

try to set the xml path to something like c:\temp\ribbon.xml (c:\temp must exist).
c:\ribbon.xml give me the same permission denied message.

Suggested proceeding is:

  • Export the xml of the existing ribbon
  • Adapt xml to your needs
  • Import xml

The existing buttons demonstrates:
* Ribbon xml for Buttons, menus, checkboxes, splitter
* Store settings in Windows Registry
This is only to give you a starting point.
For real projects I suggest to remove these buttons and handle the xml import / export from VBA editor.

Nikolay

Quote from: Remko on November 29, 2022, 04:58:35 PM
HI, I get a permission denied trying to export the XML.  or do you need to supply one first? was hoping to export one so i can look and learn from it.

Yes, you need to supply one first.
There is nothing to export in "stock" Visio. You'll get an empty string as output.
I.e. everything that you provide in ribbon.xml is applied "on the top" of the Visio's built-in user interface.
By default, nothing is applied, so the ribbon you export will be empty.

Thomas Winkel

Hi Nikolay,

I guess Remkos question is about the "Export XML" function of my Visio-Tools stencil from the first post.
This will export the XML that defines the Visio-Tools ribbon (see attached screenshot).
The XML string is stored in the stencils document property User.Ribbon.

BR,
Thomas

Nikolay

I see. Thank you for the clarification. I thought it was about exporting the built-in ribbon