使用VBA更改Office功能区中元素的属性

时间:2014-07-07 14:14:07

标签: vba powerpoint powerpoint-vba powerpoint-2007

我是VBA和Office Ribbon UI的初学者。我正在使用Office 2007并使用自定义UI在PPTM中开发功能区。我添加了一组XML,如下所示:

<group id="myGroup" label="Hello World" visible="false">
    <labelControl id="lblUsername" label="Your Username: " />
    <labelControl id="lblFullname" label="" />
</group>

因此,在此Hello World标签中,我想将其展示次数更改为true并更改lblUsernamelblFullname的值。目前,必须在此按钮的上一次调用之后完成此操作:

<button id="signin" label="Sign In" image="signin" size="large"
    supertip="Click this button to sign in."
    onAction="ribbon_SignIn" tag="SignIn" />

目前ribbon_SignIn中的代码如下:

Sub ribbon_SignIn()
    SignIn.Show
End Sub

这将打开SignIn表单并从用户处获取用户名和密码。验证用户名和密码后,一切正常,但我不确定控制lblUsernamelblFullname的属性是如何通过登录用户更改其值的过程&#39;细节。


澄清

SignIn表单中,我有登录按钮的以下代码。

Private Sub btnSignIn_Click()
    ' Authentication Mechanism
    MsgBox "You have successfully signed in!"

    ' Show the Ribbon group.
    ' What am I supposed to do here to make the group visible?
    ' Also how do I change the text of the label?
End Sub

那么,在这里我该怎样才能让小组看得见?另外如何更改标签的文字?


更新#1

当我在自定义用户界面中使用两个属性getVisiblegetLabel时,加载项本身不会显示。 :(我使用的代码是:

<group id="myGroup" label="Hello World" getVisible="VisibleGroup">
    <labelControl id="lblUsername" label="Your Username: " getLabel="lblUsername" />
    <labelControl id="lblFullname" label="" getLabel="lblFullname" />
</group>

如果我删除这两个属性,很奇怪。顺便说一句,我正在使用 Office 2007

2 个答案:

答案 0 :(得分:4)

您可以在xml中使用名为getLabel属性的内容。

e.g。

getLabel = "GetLabelMacro"

现在,您可以在GetLabelMacro中输入代码

Sub GetLabelMacro(control As IRibbonControl, ByRef label)
    if control.id = "MyLabel" then
        label = "New Label"
    end if
End Sub

您可以为此目的修改此示例代码。有关getLabel语法的更多信息可以通过google搜索getLabel回调来找到。

答案 1 :(得分:3)

这是一个简单的功能性示例。我替换简单的InputBox提示而不是尝试重新创建您的UserForm代码,但一般主体应该仍然适用。

我为username和fullname以及bAuthenticated创建公共变量(将表单分配给这些变量,或直接引用表单)。在对用户进行身份验证后设置bAuthenticated = True

使用getLabel回调并刷新功能区。我创建了两个单独的回调,一个用于用户名,一个用于全名,这些回调是getUserNamegetFullName。我还添加了VisibleGroup的vba,它是从getVisible XML属性调用的。

注意在更改VBA时,您可能需要保存,关闭&amp;重新打开文件,因为进行这些更改可能会清除所有公共变量,包括表示功能区本身的变量。这就是您可能从RefreshRibbon程序中收到错误的原因。

您的xml可能如下所示。

已更新,以包含getVisible回调

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="RibbonOnLoad">
    <ribbon startFromScratch="false" >
        <tabs>
            <tab id="customTab" label="Custom Tab">
                      <group id="myGroup" label="Hello World" getVisible="VisibleGroup" >
                          <labelControl id="lblUsername" getLabel="getUserName" />
                          <labelControl id="lblFullname" getLabel="getFullName" />
                      </group>
                      <group id="mySignin" label="SignIn" visible="true" >
                          <button id="signin" label="Sign In" size="large"
                              supertip="Click this button to sign in."
                              onAction="ribbon_SignIn" tag="SignIn" />
                      </group>
            </tab>
        </tabs>
    </ribbon>
</customUI>

注意:我已将 myGroup 的可见属性设置为True,以便我可以更轻松地对此进行测试。如果需要在运行时更改此属性,则可以类似地使用getVisible回调。

然后VBA模块中的回调看起来或多或少会像:

Option Explicit
Public Rib As IRibbonUI
Public xmlID As String
Public username As String
Public fullName As String
Public bAuthenticated As Boolean

'Callback for customUI.onLoad
Sub RibbonOnLoad(ribbon As IRibbonUI)
    'MsgBox "onLoad"
    Set Rib = ribbon
End Sub

Sub ribbon_SignIn(control As IRibbonControl)

    username = InputBox("enter your username", "Your username?")
    fullName = InputBox("enter your full name", "Your full name?")

    'Authenticate
    bAuthenticated = True

    VisibleGroup control, bAuthenticated
End Sub
Sub VisibleGroup(control As IRibbonControl, ByRef returnedVal)
    returnedVal = bAuthenticated
    Call RefreshRibbon("myGroup")
End Sub
Sub getUserName(control As IRibbonControl, ByRef returnedVal)
    returnedVal = username
    Call RefreshRibbon(control.id)
End Sub
Sub getFullName(control As IRibbonControl, ByRef returnedVal)
    returnedVal = fullName
    Call RefreshRibbon(control.id)
End Sub
Sub RefreshRibbon(id As String)
    xmlID = id
    'MsgBox "Refreshing ribbon for " & Id, vbInformation
    If Rib Is Nothing Then
        MsgBox "Error, Save/Restart your Presentation"
    Else
        Rib.Invalidate
    End If
End Sub