2011-05-17 4 views
9

je suivais le directions here pour créer un ruban personnalisé pour une application d'accès. Mais aucun des boutons n'a fonctionné! Je continué à obtenir une erreur déclaré que l'accès ne pouvait pas trouver la fonction ou macro, même si elle était publique et dans un module standard.Ruban personnalisé onAction question syntaxe

Finalement j'ai découvert que cela fonctionnerait si je la syntaxe suivante:

onAction="=fncMyFunction('string argument', 1234)"

fncMyFunction reçoit le tapée manuellement dans les arguments, mais pas l'objet de ruban.

Dans Word pour un autre projet, j'ai créé un ruban personnalisé en ouvrant le document comme un fichier .ZIP, en ajoutant le XML à l'endroit approprié, et en ajoutant une référence. Relevant directions somewhere in this novel here.

Dans Word, j'ai pu avoir tout travailler comme je l'attendais avec la syntaxe suivante:

onAction="fncMyFunction"

Dans Word, fncMyFunction a un objet ruban qui lui est passé lorsque le bouton est cliqué .

Quelle est la situation ici? Pourquoi la syntaxe différente? Et est-ce que l'un ou l'autre est "mauvais"?

Répondre

10

Vous devez utiliser la propriété de l'élément de ruban tag pour stocker des valeurs que vous souhaitez transmettre à votre action.

Par exemple, supposons que vous avez un simple ruban contenant quelques boutons:

  • le premier bouton utilise une action générique ribbonOpenForm qui ouvre un formulaire FormDashBoardFinance lorsque vous cliquez dessus.
  • le deuxième bouton utilise une action générique ribbonDoAction qui exécute la LogOff("bye") VBA fonction (pas un Sub!) Qui, par exemple, affiche un message à l'utilisateur et se déconnecte.
  • le dernier reproduit le comportement que vous vouliez pour votre fncMyFunction().
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" 
      onLoad="ribbonLoad" loadImage="ribbonLoadImage"> 
    <ribbon startFromScratch="false"> 
     <tabs> 
     <tab id="Home" label="Home"> 
        <group id="gpDash" label="Dashboards"> 
         <button id="btHomeFinance" 
           label="Finance" 
           imageMso="BlogHomePage" 
           onAction="ribbonOpenForm" 
           tag="FormDashBoardFinance"/> 
         <button id="btLogOff" 
           label="Log Off" 
           imageMso="DatabasePermissionsMenu" 
           onAction="ribbonDoAction" 
           tag="LogOff('bye')"/> 
         <button id="btMyFunc" 
           label="My Function" 
           imageMso="AppointmentColorDialog" 
           onAction="fncMyFunction" 
           tag="'a string argument', 1234"/> 
        </group> 
      </tab> 
     </tabs> 
    </ribbon> 
</customUI> 

La VBA pour gérer le ruban serait dans un module:

Option Compare Database 
Option Explicit 

' We keep a reference to the loaded Ribbon 
Private ribbon As IRibbonUI 

'----------------------------------------------------------------------------- 
' Save a reference to the Ribbon 
' This is called from the ribbon's OnLoad event 
'----------------------------------------------------------------------------- 
Public Sub ribbonLoad(rb As IRibbonUI) 
    Set ribbon = rb 
End Sub 

'----------------------------------------------------------------------------- 
' Open the Form specified by the ribbon control's Tag. 
'----------------------------------------------------------------------------- 
Public Sub ribbonOpenForm(control As IRibbonControl) 
    DoCmd.OpenForm control.tag, acNormal 
End Sub 

'----------------------------------------------------------------------------- 
' Perform the action specified by the ribbon control's Tag 
' Use single quotes to delimit strings, they will be expanded. 
' The action to be performed must be defined as a public Function! 
'----------------------------------------------------------------------------- 
Public Sub ribbonDoAction(control As IRibbonControl) 
    Dim action As String 
    action = Replace(control.Tag,"'","""") 
    Eval action 
End Sub 

'----------------------------------------------------------------------------- 
' fncMyFunction example implementation 
' Use single quotes to delimit strings, they will be expanded. 
'----------------------------------------------------------------------------- 
Public Sub fncMyFunction(control As IRibbonControl) 
    ' Split the string to separate the paramaters in the Tag 
    Dim params As Variant 
    params = Split(control.Tag, ",") 
    ' Now we can assign each parameter 
    Dim myString As String 
    Dim myInt As Integer 
    myString = Replace(Trim(params(0)),"'","") ' remove single quotes 
    myInt = CInt(Trim$(params(1)))    ' We're expecting an Integer 
    ' ... do something with the params ... 
    Debug.Print myString ' Will print: a string argument 
    Debug.Print myInt * 2 ' Will print: 2468 
End Sub 

Une excellente ressource pour l'accès au ruban est Avenius Gunter's Access 2010 Ribbon site