Пользовательский вопрос о синтаксисе ленты onAction - PullRequest
10 голосов
/ 17 мая 2011

Я следовал указаниям здесь , чтобы создать собственную ленту для приложения Access.Но ни одна из кнопок не сработала!Я продолжал получать сообщение об ошибке, в котором говорилось, что Access не может найти функцию или макрос, даже если он был общедоступным и находится в стандартном модуле.

В конце концов я обнаружил, что он будет работать, если бы я использовал следующий синтаксис:

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

fncMyFunction получает введенные вручную аргументы, но не объект ленты.

В Word для другого проекта я создал пользовательскую ленту, открыв документв виде файла .ZIP, добавив XML в соответствующее место и добавив ссылку на него. Соответствующие указания где-то в этом романе здесь .

В Word я смог заставить все работать так, как я ожидал, со следующим синтаксисом:

onAction="fncMyFunction"

В Word, fncMyFunction передает объект ленты при нажатии кнопки.

Что здесь происходит?Почему другой синтаксис?И так или иначе «неправильно»?

1 Ответ

11 голосов
/ 21 июня 2011

Вам следует использовать свойство tag элемента ленты, чтобы сохранить некоторые значения, которые вы хотите передать своему действию.

Например, допустим, у вас есть простая лента с несколькими кнопками:

  • первая кнопка использует общее действие ribbonOpenForm, которое при щелчке открывает форму FormDashBoardFinance.
  • вторая кнопка использует общее действие ribbonDoAction, которое выполняет LogOff("bye") VBA функция (не Sub!), которая, например, отображает сообщение пользователю и выходит из системы.
  • последний дублирует поведение, которое вы хотели для вашего 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>

VBA для управления лентой будет находиться в модуле:

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

Отличным ресурсом для ленты доступа является Avenius Gunter's Access 2010 Ribbon site

...