Search code examples
vbaexcelribbon

How to set a text on a Editbox Ribbon via VBA (Excel)


How can I set a text in a Ribbon Editbox? I can't find it on internet :/

I just can find examples of click event but nothing about set a text from a Sub.

So for example, I want something like this:

Sub settingText()
   editboxname = "my text"
end sub

Solution

  • It's a little while since this answer was posted, and there looks to be a recent-ish change to the behaviour of the ribbon, which means the original answer posted may not be a solution any more. For the record, I'm using Excel 2013 with some updates that are dated after Braulio's answer.

    The heart of the difference is that Invalidate and InvalidateControl on the ribbon don't behave the same way as previously. This means that InvalidateControl does not call the getText callback on the editBox. I replaced the InvalidateControl calls with Invalidate (so forces a re-draw on the entire ribbon), and that does trigger the callback as expected.

    So here's the code of my solution for a filename/browse button (note I've included extra code for caching the ribbon UI reference on a very hidden sheet so that resets during development don't make the ribbon inaccessible).

    Private sobjRibbon As IRibbonUI
    Private strFilename As String
    
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (destination As Any, source As Any, ByVal length As Long)
    
    Private Function GetRibbon() As IRibbonUI
        If sobjRibbon Is Nothing Then
            Dim objRibbon As Object
            CopyMemory objRibbon, ThisWorkbook.Worksheets("Ribbon_HACK").Range("A1").Value, 4
            Set sobjRibbon = objRibbon
        End If
        Set GetRibbon = sobjRibbon
    End Function
    
    'Callback for customUI.onLoad
    Sub Ribbon_Load(ribbon As IRibbonUI)
        Set sobjRibbon = ribbon
        Dim lngRibPtr As Long
        lngRibPtr = ObjPtr(ribbon)
        ' Write pointer to worksheet for safe keeping
        ThisWorkbook.Worksheets("Ribbon_HACK").Range("A1").Value = lngRibPtr
        strFilename = ""
    End Sub
    
    'Callback for FileName onChange
    Sub OnChangeFilename(control As IRibbonControl, text As String)
        strFilename = text
    End Sub
    
    'Callback for FileName getText
    Sub GetFileNameText(control As IRibbonControl, ByRef returnedVal)
        returnedVal = strFilename
    End Sub
    
    'Callback for FilenameBrowse onAction (I'm looking for XML files here)
    Sub OnClickFilenameBrowse(control As IRibbonControl)
        Dim objFileDialog As Office.FileDialog
    
        Set objFileDialog = Application.FileDialog(msoFileDialogFilePicker)
    
        With objFileDialog
            .AllowMultiSelect = False
            .Title = "Please select the file."
            .Filters.Clear
            .Filters.Add "XML", "*.xml"
    
            If .Show = True Then
                strFilename = .SelectedItems(1)
                GetRibbon().Invalidate ' Note the change here, invalidating the entire ribbon not just the individual control
            End If
        End With
    End Sub
    

    For the record, here's the XML for the two objects I'm dealing with here:

    <editBox id="FileName" onChange="OnChangeFilename" screentip="Filename of the XML file to upload" label="XML file name" showImage="false" getText="GetFileNameText" />
    <button id="FilenameBrowse" imageMso="ImportExcel" onAction="OnClickFilenameBrowse" screentip="Find the file to upload" label="Browse" />