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

Pra*_*man 6 powerpoint vba 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>
Run Code Online (Sandbox Code Playgroud)

所以,在这个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" />
Run Code Online (Sandbox Code Playgroud)

现在的代码ribbon_SignIn如下:

Sub ribbon_SignIn()
    SignIn.Show
End Sub
Run Code Online (Sandbox Code Playgroud)

这将打开SignIn表单并从用户获取用户名和密码.验证用户名和密码后,一切顺利,但我不确定获取控件属性lblUsernamelblFullname使用登录用户的详细信息更改其值的过程是什么.


澄清

SignIn表单中,我有以下代码的Sign In按钮.

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
Run Code Online (Sandbox Code Playgroud)

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


更新#1

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

<group id="myGroup" label="Hello World" getVisible="VisibleGroup">
    <labelControl id="lblUsername" label="Your Username: " getLabel="lblUsername" />
    <labelControl id="lblFullname" label="" getLabel="lblFullname" />
</group>
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ens 4

这是一个简单、实用的示例。我用简单的InputBox提示代替尝试重新创建用户窗体代码,但一般原则仍然适用。

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

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

请注意,在对 VBA 进行更改时,您可能必须保存、关闭并重新打开文件,因为进行这些更改可能会清除所有公共变量,包括代表功能区本身的变量。这就是您可能会从该过程中收到错误的原因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>
Run Code Online (Sandbox Code Playgroud)

注意:我已将myGroup的visible 属性设置为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
Run Code Online (Sandbox Code Playgroud)