使用VBA更改Office Ribbon中元素的属性

7

我是VBA和Office Ribbon UI方面的初学者。我正在使用Office 2007,并使用自定义UI来开发PPTM中的Ribbon。我已经添加了一组类似以下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”表单并从用户那里获取用户名和密码。在验证用户名和密码之后,一切都很顺利,但我不确定如何获得控件“lblUsername”和“lblFullname”的属性,以便使用已登录用户的详细信息更改它们的值。

澄清

在“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

当我在自定义UI中使用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。

1
嗯,我以前没有尝试过这个,让我看看能否弄清楚。有趣的问题加一分。 - David Zemens
什么都没用。但是我接受了你所付出的努力并给予了赞同。 :) 这是我能做到的最好的! - Praveen Kumar Purushothaman
如果您能展示完整的XML,也许我可以帮助您修复它。 - David Zemens
2个回答

4
你可以在xml中使用名为getLabel的属性。例如:
getLabel = "GetLabelMacro"

现在,在您的GetLabelMacro中,您可以添加以下代码:
Sub GetLabelMacro(control As IRibbonControl, ByRef label)
    if control.id = "MyLabel" then
        label = "New Label"
    end if
End Sub

您可以修改此示例代码以适应您的需求。有关 getLabel 语法的更多信息,可以通过谷歌搜索“getLabel 回调”来找到。

这应该在VBA中像任何其他回调函数一样工作。 - hnk
实际上,@DavidZemen在这里的答案描述了如何使用它,但更加详细(我正在使用移动设备打字,所以我的答案会有点简短)。 - hnk
好的,会尝试@hnk的建议,除了“刷新”XML之外还有其他方法吗? - Praveen Kumar Purushothaman
1
不太确定。尝试更新全局变量,看看会发生什么。我不知道这个功能区是否使用某些事件或电子表格的“计算”自动刷新。 - hnk
2
不,你必须刷新功能区。 - David Zemens
显示剩余5条评论

4
这里有一个简单而实用的例子。我使用简单的提示替换了您的UserForm代码,但是总体原则仍然适用。 我创建了公共变量username、fullname和bAuthenticated(让您的表单分配给这些变量,或直接引用表单)。在验证用户后,将bAuthenticated = True。 使用回调函数getLabel并刷新功能区。 我创建了两个单独的回调函数,一个用于用户名,一个用于全名,它们是getUserNamegetFullName。我还添加了VisibleGroup的vba,该vba从getVisible XML属性调用。 请注意,修改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>

注意: 我将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

1
您需要使用 Group 控件的 getVisible 属性和一个布尔值来确定用户是否已成功验证,然后刷新功能区。 - David Zemens
xmlID是什么?它是如何与之关联的?我只得到了错误,比如未定义。 - Praveen Kumar Purushothaman
1
好的。如果您遇到问题,请告诉我并更新您的问题,包括您正在使用的完整CustomXML,以便我可以查看它的设置。 - David Zemens
当我在自定义UI中使用getVisiblegetLabel这两个属性时,插件本身没有显示出来。 :( 如果我将它们都删除,它就可以正常工作。奇怪。顺便说一下,我正在使用Office 2007。我该怎么办? - Praveen Kumar Purushothaman
你能包含完整的XML吗? - David Zemens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接