【问题标题】:Custom Ribbon onAction syntax question自定义功能区 onAction 语法问题
【发布时间】:2011-08-26 23:32:52
【问题描述】:

我按照directions here 为 Access 应用程序创建了一个自定义功能区。但是没有一个按钮起作用!我不断收到一条错误消息,指出 Access 找不到函数或宏,即使它是公共的并且在标准模块中。

最终我发现如果我使用以下语法,它会起作用:

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

fncMyFunction 接收手动输入的参数,但不接收功能区对象。

在另一个项目的 Word 中,我通过将文档打开为 .ZIP 文件、在适当的位置添加 XML 并添加对它的引用来创建自定义功能区。 Relevant directions somewhere in this novel here.

在 Word 中,我能够使用以下语法让一切按我预期的方式工作:

onAction="fncMyFunction"

在 Word 中,fncMyFunction 在单击按钮时会传递一个功能区对象。

这里有什么问题?为什么不同的语法?一种方式或另一种方式是“错误的”吗?

【问题讨论】:

    标签: ms-access vba ms-word ms-office ribbon


    【解决方案1】:

    您应该使用功能区元素的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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 2017-01-19
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多