Excel Ribbon 组合框:始终显示当前选择并在保存前记住选择

问题描述 投票:0回答:2

如何设置组合框,以便它始终更新/刷新其显示并始终显示当前选择?

A. 在此示例中,我可以选择工作表。如果我通过组合框选择,一切看起来都很好。但是,一旦我通过单击其选项卡选择一个工作表,组合框就不会刷新。例如,我通过组合框选择“Sheet1”。然后我通过其选项卡选择“Sheet3”。盒子剧照显示“Sheet1”。

B. 此外,关闭和打开工作簿时,选择默认为组合框中的第一个位置。在保存和关闭时,如何告诉组合框保持在其位置?

-- XML
<group id="GroupDemo2" 
    label="SelectSheet"
    imageMso="AddInManager">    
    <comboBox id="ComboBox001"
        label="comboBox001"
        onChange="ComboBox001_OnChange">
        <item id="ItemOne"
            label="One"/>
        <item id="ItemTwo"
            label="Two"/>
        <item id="ItemThree"
            label="Three"/>
    </comboBox>
</group>   

-- Callback VBA Code 
Sub ComboBox001_OnChange(control As IRibbonControl, id As String)
    Select Case id
        Case "One"
            Sheets("Sheet1").Select
        Case "Two"
            Sheets("Sheet2").Select
        Case "Three"
            Sheets("Sheet3").Select
    End Select
End Sub

谢谢!

excel vba combobox ribbonx
2个回答
1
投票

您没有回答我的澄清问题...因此,我会认为您所指的“工作簿”就其活动工作表和功能区组合框之间的相关性而言,是保留 XML 显示代码的工作簿,而不是保留 XML 显示代码的工作簿。插件。

您的问题有两个问题。

  1. 第一个可以按照第一条评论中的建议轻松解决,分别使用

    Invalidate
    控件。我将在代码中显示我打算发布的事件修改代码。

  2. 第二个与工作簿所选工作表和功能区组合框值的相关性相关,稍微复杂一点,但不是很......基本上,您需要写入/读取更改后的组合值并进行调整一些 XML 和现有的 VBA 代码。

    
    

  3. A.请按照以下方式调整 XML 代码(插入以
Registry

开头的新行):

getText

      <group id="GroupDemo2" 
            label="SelectSheet"
            imageMso="AddInManager">    
            <comboBox id="ComboBox001"
                label="comboBox001"
                getText="ComboBox001_getText"           
                onChange="ComboBox001_OnChange">
                
                <item id="ItemOne"
                    label="One"/>
                <item id="ItemTwo"
                    label="Two"/>
                <item id="ItemThree"
                    label="Three"/>                
            </comboBox>
        </group>       

getText
控制触发。
B.在标准模块顶部(在声明区域中)声明下一个变量,用于写入/读取注册表:

Invalidate

C. 
Public Const myApp As String = "RibbApp", mySett As String = "Settings", myVal As String = "Value"

事件必须通过以下方式修改(以

OnChange
控制并在注册表中写入最后的组合值):
Invalidate

D。为了能够使用注册表中记住的值更改组合值,您还需要复制下一个子:

Sub ComboBox001_OnChange(control As IRibbonControl, id As String) Select Case id Case "One" Sheets("Sheet1").Select 'it would be good to use here ThisWorkbook.Sheets(""). 'otherwise, it will consider the active sheet of any open workbook Case "Two" Sheets("Sheet2").Select Case "Three" Sheets("Sheet3").Select End Select myRibbon.InvalidateControl "ComboBox001" SaveSetting myApp, mySett, myVal, id End Sub

为了做到这一点,
必须触发

!这是通过运行 Sub ComboBox001_getText(control As IRibbonControl, ByRef returnedVal) Dim comboVal As String comboVal = GetSetting(myApp, mySett, myVal, "No Value") 'read it from Registry If comboVal <> "No Value" Then returnedVal = comboVal End If End Sub 控制来完成的。必须在保存 XML 代码的工作簿打开时执行此操作。我想您在 XML 之上有类似的内容:

Invalidate

<customUI onLoad="RibbonLoaded_MyWB" xmlns="http://schemas.microsoft.com/office/2009/07/customui"> 

称为子

onLoad
(在您的情况下,其名称可能不同)。基本上,这样的
RibbonLoaded_MyWB
应该看起来像:
Sub

当然,您需要在标准模块之上声明
Sub RibbonLoaded_MyAddin(ribbon As IRibbonUI) Set myRibbon = ribbon myRibbon.InvalidateControl "ComboBox001" 'to trigger getText... End Sub

变量(也许,命名不同)。比如:

myRibbon

我添加的代码行(
Public myRibbon As IRibbonUI

)只是为了触发

myRibbon.InvalidateControl "ComboBox001"
...
如果有什么不够清楚的地方,请随时要求澄清。


0
投票

是的,“工作簿”是保存 XML 的,它不是加载项。

我仔细按照您描述的所有步骤进行操作,谢谢您的详细解释!第一个问题已解决,工作簿将打开并显示最后的选择。第二个问题仍然存在:当单击工作表选项卡时,组合框尚未刷新。 我想我将用于写入/读取注册表的变量放置在错误的位置?它们应该在额外的模块中吗?

ComboBox001_getText

© www.soinside.com 2019 - 2024. All rights reserved.