2013-08-01 44 views
3

早在VBA的旧时代,我们曾经能够通过名称直接访问表单上的控件。对于如何在VBA 2010中做到这一点,我有点困惑(或者如果甚至可能的话)。从另一个控件的回调中更新iRibbon控件的内容

说我有一个名为“channelList”的下拉列表的功能区控件,并在功能区上的其他位置我有一个名为“labelText”的文本框。这些项目中的每一个都有一个唯一的回调函数 - 当我在labelText中输入内容时,它的回调会触发,当我从channelList列表框中选择一个项目时,它的回调将作为参数传递给列表项目。

我被难倒的地方是我如何用channelList回调中的'something'来更新labelText文本框的内容。

有没有办法从列表框回调中直接访问文本框控件,还是必须生成某种事件?我将使用什么方法或功能来设置控件的文本值? (我是否需要将IRibbonControl对象投射到某物上?)

回答

2

的解决方案是一个答案和注释的组合,所以这里有云:

  • 添加“的getText”回调子程序的名字到功能区XML ,特定于“labelText”编辑框。
 
    editBox id="labelText" label="Text:" sizeString="xxxxxxxxxx" 
    onChange="TextboxCallback" getText="UpdateTextBoxText" 
    screentip="Channel label" 
    supertip="Limited to 10 characters. Press Enter once finished typing." 
  • 在组合框中回调函数,所需的编辑框的文本设置为一个全球性的,并呼吁Ribbon.InvalidateControl与“LabelText的”的说法。
 
    MyRibbon.InvalidateControl "labelText" 
  • 实现编辑框回调,传递的句柄色带和另一个变量的ByRef遏制“东西”进行更新。使用全局通过ByRef参数更新控件的文本。
 
    Sub UpdateTextBoxText(control As IRibbonControl, ByRef returnedVal) 
    Select Case (control.id)  
     Case "labelText" 
      returnedVal = LabelText 
    End Select 
    End Sub 

我想这是 “进步”。 labelText.Value =“blah”是太简单了。

2

请看Ribbon.Invalidate方法。当您“禁用”功能区时,您基本上重置了功能区,此时您可以根据当时可以跟踪的任何内容设置功能区上的控件属性。为此,您需要在您的VBA中有Control.GetEnabledGetVisible等子程序。

您还可以通过Ribbon.InvalidateControl使单个控件失效。

这里有一个链接,可以帮助:http://sourcedaddy.com/ms-excel/resetting-controls.html

+0

无效的控制对我来说很有意义,但我还是不知道如何设置从回调函数新的文本框的值,因为LabelText的色带控制似乎并没有任何方法或暴露于VBA(我无论如何可以找到)。我需要调用什么方法来实际设置文本,以及在哪里/如何记录?我无情地搜索了VBA的帮助。 –

+1

你不会在VBA帮助中找到它。您需要搜索功能区相关的帖子。另外,你应该使用某种Ribbon UI编辑器。我使用[Andy Pope's](http://www.andypope.info/vba/ribboneditor.htm)。当我看到它时,我看到一个EditBox和Label控件,没有“labelText”控件。我看到的事件是EditBox.GetText和Label.GetLabel。请注意,这个东西起初很混乱。理想情况下,我会得到一本解决功能区定制的书 - 也许是专业的Excel开发。 –

+0

labelText是我分配EditBox控件的名称。我使用Microsoft Office的自定义用户界面编辑器,这是100%纯粹的骨骼。我会把你的建议放在一本书上,看看你的建议程序。 2010 VBA是从2003年开始的一种模式转变 - 早期的这种Ribbon功能,它基本上就像一种新语言。我从流利到完全文盲。 –

相关问题