2011-05-17 31 views
9

Seguí el directions here para crear una cinta personalizada para una aplicación de Access. ¡Pero ninguno de los botones funcionó! Seguí recibiendo un error que indicaba que Access no podía encontrar la función o macro, aunque era pública y en un módulo estándar.Cinta personalizada onAction pregunta de sintaxis

Con el tiempo descubrí que iba a funcionar si utiliza la siguiente sintaxis:

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

fncMyFunction recibe tecleado manualmente en los argumentos, pero no el objeto de la cinta.

En Word para otro proyecto, creé una cinta personalizada abriendo el documento como un archivo .ZIP, agregando el XML en el lugar apropiado y agregando una referencia al mismo. Relevant directions somewhere in this novel here.

En Word, yo era capaz de tener todo funcione de la manera que esperaba que con la siguiente sintaxis:

onAction="fncMyFunction"

En Word, fncMyFunction tiene un listón que se le pasa cuando se hace clic en el botón .

¿Cuál es el problema aquí? ¿Por qué la sintaxis diferente? Y es de una forma u otra "incorrecta"?

Respuesta

10

Debe usar la propiedad tag del elemento de cinta para almacenar algunos valores que desea pasar a su acción.

Por ejemplo, supongamos que tiene una cinta simple que contiene un par de botones:

  • el primer botón utiliza una acción genérica ribbonOpenForm que abre un formulario FormDashBoardFinance cuando se hace clic.
  • el segundo botón utiliza una acción genérica ribbonDoAction que ejecutar la función LogOff("bye") VBA (no un sub!) Que, por ejemplo, muestra un mensaje al usuario y cierra la sesión.
  • el último duplica el comportamiento que quería para su 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 para gestionar la cinta estaría en un módulo:

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 

Un excelente recurso para la cinta de acceso es Avenius Gunter's Access 2010 Ribbon site

Cuestiones relacionadas