Access ribbon items execute VBA functions - vba

I have some problems configuring my ribbon.
Only macros are working as onAction or getPressed attributes. Functions in standard modules don't work. Callbacks written in standard modules don't work either.
How can I use the value of edit box in VBA function?
This is xml of my ribbon for example:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="true">
<tabs>
<tab idMso="TabHome">
<group idMso="GroupFont" visible="false" />
</tab>
<tab id="CustomTab" label="Клиенты">
<group id="PeopleGroup" label="Люди">
<toggleButton id="ToggleButton1" size="large" label="Все люди"
onAction="Pplopenmacro" imageMso="ContactPictureMenu"/>
<editBox id="PeopleEditBox"
label="Поиск по рег№"
onChange="MyEditBoxCallbackOnChange" />
<button id="Button3" label="TEST"
size="normal" onAction="=Person_choose()" />
</group>
<group id="CompaniesGroup" label="Компании">
<toggleButton id="ToggleButton2" size="large"
label="Компании"
onAction="Cmpnopenmacro" imageMso="MeetingsWorkspace" />
</group>
</tab>
<tab id="CustomTab2" label="Документы">
<group id="MyGroup" label="Документы" >
<button id="Button1" label="Счета"
size="large" onAction="Invoiceopenmacro"
imageMso="BusinessFormWizard" />
<button id="Button2" label="Хуета" size="normal" />
</group >
</tab>
</tabs>
</ribbon>
</customUI>
And these are my functions in std module:
Public Sub MyEditBoxCallbackgetText(control As IRibbonControl, ByRef strText)
' Callback EditBox
' Select Case control.Id
' Case "PeopleEditBox"
' strText = "Hello World"
' End Select
MsgBox "1"
End Sub
Public Sub MyEditBoxCallbackOnChange(control As IRibbonControl, strText As String)
' Callback Editbox: Returnvalue Editbox
' Select Case control.Id
' Case "PeopleEditBox"
' MsgBox "Value Editbox: " & _
' strText, vbInformation, "Sample EditBox"
' End Select
MsgBox "2"
End Sub
Public Sub Person_choose()
'DoCmd.openForm "People", acNormal
MsgBox "Yahoo!"
End Sub

You may need to tell XML where the procedure can be found. Example -
<group id="PeopleGroup" label="People">
<toggleButton id="ToggleButton1" size="large"
label="All People"
onAction="ThisWorkbook.Pplopenmacro" imageMso="ContactPictureMenu"/>
<editBox id="PeopleEditBox"
label="Search by Region #"
onChange="ThisWorkbook.MyEditBoxCallbackOnChange" />
<button id="Button3" label="TEST"
size="normal" onAction="ThisWorkbook.Person_choose()" />
</group>
ThisWorkbook. means that the procedures are found in the ThisWorkbook object (see your Project Explorer in the VBA editing window)
I have never put the callbacks into a standard module, but since you are doing that maybe you need to have something like onAction="MyModuleName.Pplopenmacro" in the XML?

Related

VBA Word Custom Ribbon does not effect Macros

I've written a few subroutines in VBA to do some things in Word that I want it to do. It works as intended. However, when I created a custom ribbon for it, using the Office RibbonX Editor and generated callbacks, nothing happens when the associated button is pressed. Here is the xml schema for the ribbon:
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon startFromScratch="false" >
<tabs>
<tab id="Ribbon1" label="Custom Ribbon">
<group id="Group_1" label="Common" autoScale="true">
<button id="btn1" label="DoThis" imageMso="AppointmentColor10" onAction="RibbonControl.DoThis" visible="true"/>
<button id="btn2" label="DoThis1" imageMso="BlackAndWhiteWhite" onAction="RibbonControl.DoThis1" visible="true"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
Callbacks are generated like this:
'Callback for btn1 onAction
Sub DoThis(control As IRibbonControl)
End Sub
'Callback for btn2 onAction
Sub DoThis1(control As IRibbonControl)
End Sub
I have tried different modification of the >onAction< attribute, but between getting VBA errors and buttons not working, this is the point I'm stuck in.
I'd appreciate any tips on how to solve it.
In my working Ribbon XML I am not using a module name, just calling the method directly. So your XML code should look like this:
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon startFromScratch="false" >
<tabs>
<tab id="Ribbon1" label="Custom Ribbon">
<group id="Group_1" label="Common" autoScale="true">
<button id="btn1" label="DoThis" imageMso="AppointmentColor10" onAction="DoThis" visible="true"/>
<button id="btn2" label="DoThis1" imageMso="BlackAndWhiteWhite" onAction="DoThis1" visible="true"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
For these methods to be reachable from the Ribbon some things must be true:
The code must exist in a regular Module. Not a class module, form, or any other object. Make a module called "RibbonActions" or something and put them all there.
The methods must be public, your subs are implicitly public so that should work but I like to add the Public keyword just to be explicit about it.
The signature must match the event, which yours does appear to fit the pattern.

How to add inbuilt tool of Powerpoint in Custom UI Editor Customized Tab

As I was creating customized tab which will help me all the tool I use in single tab with the help of "Custom UI" in that I can add which i have scripted, but not getting how to add the inbuilt tool of powerpoint for example "Font Color Picker" i want to add what should I do.
Below are the script
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="customTab" label="GEPper">
<group id="TextTools" label="Text Tools">
<button id="FontSize" label=" " image="a4" size="normal" onAction="FontSize" screentip="Font Size 10" supertip=" "/>
<button id="FontSize12" label=" " image="a3" size="normal" onAction="FontSize12" screentip="Font Size 12" supertip=" "/>
<button id="FontSize14" label=" " image="a2" size="normal" onAction="FontSize14" screentip="Font Size 14" supertip=" "/>
<button id="FontSize16" label=" " image="a1" size="normal" onAction="FontSize16" screentip="Font Size 16" supertip=" "/>
<button id="FontColorBlack" label=" " image="black" size="normal" onAction="FontColorBlack" screentip="Font Color Black" supertip=" "/>
<button id="FontColorWhite" label=" " image="white" size="normal" onAction="FontColorWhite" screentip="Font Color White" supertip=" "/>
<button id="Bullet" label=" " image="bullet" size="normal" onAction="Bullet" screentip="Bullet Color Black" supertip=" "/>
<button idMso="FontColorPicker"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
It would be great help if anyone can help me out
In a ribbon mod, the XML for a built-in gallery looks like this:
<gallery
idMso="FontColorPicker"
showImage="true"
showLabel="false"/>
To find other idMso identifiers, you need to reference a set of Excel spreadsheets published by Microsoft. Here's the link for the 2016 (also applies to 2019) files: Office 2016 Help Files: Office Fluent User Interface Control Identifiers
There is one workbook for PowerPoint. Search the first column.

How to display two controls aligned horizontally in a custom Ribbon XML

In a group of a custom tab of a Ribon XML of a custom VSTO WORD AddIn, I need to display an editBox aligned horizontally inline with a checkBox. How can I achieve that? Following displays both the controls aligned vertically one after the other:
<tab idMso="TabAddIns">
<group id="ContentGroup" label="Content">
<editBox id="editBoxID" label="Insert Text"
screentip="Text" onAction="getText"/>
<checkBox id="checkBoxID" label="Enable" />
</group>
</tab>
Use a box, with a horizontal boxStyle.
<group id="groupid" label="Content">
<box id="ContentGroup" boxStyle="horizontal">
<editBox id="editBoxID" label="Insert Text" />
<checkBox id="checkBoxID" label="Enable" />
</box>
</group>

Excel Context Menu Not Showing

I am using the "Custom UI Editor For Microsoft Office". I have added an "Office 2007 Custom UI Part" which creates the "customui.xml" file for me. It currently has the following code which adds my "Zoom Cell" button to the developer tab.
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
<tabs>
<tab idMso="TabDeveloper" >
<group id="customGroup1" label="Zoom" insertAfterMso="GroupModify">
<button id="customButton1" label="Zoom Cell" size="large" onAction="ZoomCell" imageMso="ZoomPrintPreviewExcel" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
What I am trying to do is add the same button basically to the context menu for right-clicking on a cell; however, it is not working for me. If I modify the code even the button from the above code gets removed. Here is what I have tried. I am pretty sure that there is something weird in my xml code; I just can't find it.
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
<tabs>
<tab idMso="TabDeveloper" >
<group id="customGroup1" label="Zoom" insertAfterMso="GroupModify">
<button id="customButton1" label="Zoom Cell" size="large" onAction="ZoomCell" imageMso="ZoomPrintPreviewExcel" />
</group>
</tab>
</tabs>
</ribbon>
<contextMenus>
<contextMenu idMso="ContextMenuCell">
<button id="MyButton" label="Zoom Cell" onAction="ZoomCell" imageMso="ZoomPrintPreviewExcel" insertBeforeMso="Cut" />
</contextMenu>
</contextMenus>
</customUI>
When I put your code in the CustomUI Editor and try to validate it, I get an error that "contextMenus" is not supported element in the CustomUI namespace, followed by a list of expected/allowable elements:
Allowable elements are:
qat
officeMenu
contextualTabs
It seems from THIS LINK (which is for Outlook, but I believe the approach would be same/similar for Excel/etc.) that context Menus are manipulated through VBA events in Office 2007.
I think that RibbonUI manipulation of context menus was not introduced until 2010.

Add Event to UI button click

I have created a custom ribbon in Microsoft Word but I am having issues attaching events to the buttons found in a ribbon. Below is my code:
UI XML:
<mso:cmd app="Word" dt="1" />
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="true" >
<tabs>
<tab id="CustomTab" label="MyTasks" >
<group id="Group1" label="Details Labels">
<menu id="Menu1" label="Details" size="large">
<menu id="Menu21" label="Dates">
<button id="my_date" onAction="foo_eventhandler" label="Some Date" />
</menu>
</menu>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
I then have the following VBA code in Modules/NewMacros VBA code:
Sub foo_eventhandler(control As IRibbonControl)
End Sub
NOTE:
I import the XML by opening Word-->going to File-->Options-->Customize Ribbon-->Import/Export. I then select my XML file and import it.
When this code is run, though, I get the error "Argument Not Optional". If I run the same code without the "control As IRibbonControl" it's fine but I need to be able to get the Sender object. Anyone have any suggestions?
jason
I think you are running into problems because you are importing the XML code via Options -> Customize Ribbon ->Import/Export. This method is really for general users who wish, for example, to never see the Page Layout tab and have it hidden. They can export their custom ribbon and import it onto new machines for the same layout.
For developers a better method is use the most excellent CustomUIEditor for Word and Excel. http://openxmldeveloper.org/blog/b/openxmldeveloper/archive/2009/08/07/7293.aspx
The steps you need to take are to create your normal macro enabled Word template (the .dotm) file and save it. Then open that file up in the CustomUIEditor and paste you XML (minus the first line). I've expanded your XML code with another button and I've added the tag to the XML so the VBA knows which button is being pressed.
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false" >
<tabs>
<tab id="CustomTab" label="MyTasks" >
<group id="Group1" label="Details Labels">
<menu id="Menu1" label="Details" size="large">
<menu id="Menu21" label="Dates">
<button id="my_date_1" onAction="foo_eventhandler" label="Some Date" tag="Date1" />
<button id="my_date_2" onAction="foo_eventhandler" label="Some Other Date" tag="Date2" />
</menu>
</menu>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
I generally put my Ribbon code in a Ribbon module. In your callback code you just need to use the .Tag property of the inputted control variable to know which button is pressed which you'll see corresponds to the tag in the XML. ie:
Sub foo_eventhandler(control As IRibbonControl)
MsgBox "Hooray! for " & control.Tag
End Sub