Excel 切换按钮状态

Excel 切换按钮状态,excel,vba,togglebutton,Excel,Vba,Togglebutton,我正在使用Excel功能区切换按钮。根据它的开/关状态,我在SheetSelectionChange事件的Excel单元格中进行一些处理。如果不访问我的设置文件,我无法从单元格中获取toggleButton的状态,这是不必要的开销。让我来介绍一段代码 全局变量可以是一个选项。但是我能要更好的吗 Private Sub mExcel_SheetSelectionChange(ByVal theSheet As Object, ByVal Target As Range) '++ ' Call th

我正在使用Excel功能区切换按钮。根据它的开/关状态,我在SheetSelectionChange事件的Excel单元格中进行一些处理。如果不访问我的设置文件,我无法从单元格中获取toggleButton的状态,这是不必要的开销。让我来介绍一段代码

全局变量可以是一个选项。但是我能要更好的吗

Private Sub mExcel_SheetSelectionChange(ByVal theSheet As Object, ByVal Target As Range)
'++
' Call the C++ Code.
'--
'If (isbtnpressed) Then  ** <-- This is where i want to check the ToglgeButton status
' I don't want to read the settings file for every cell click. **
    Dim flagVal As Boolean
    'IsValidData goes to C++ for validation
    If IsValidData(Target.Application.ActiveCell) Then
        LoadMyListForm Target.Application.ActiveCell
    End If
'End If

End Sub
UI XML看起来像

            <toggleButton id="tb_IxlToggleButton"
                label="My Label"
                tag="MyLabel"
                getPressed="IxlRibbonGetButtonStateByTag"
                onAction="IxlRibbonToggleSettingByTag"
                imageMso="ControlToggleButton" />
                <button id="MyLabel"
                    tag="MyLabel"
                    onAction="IxlRibbonToggleSettingByTag"/>

我已经开始使用全局变量作为解决方法 @P在评论部分建议ᴇʜ


如果不希望使用
Public
变量,一种方便的方法是在注册表中保留并清除它的状态。也可以在应用程序启动时根据记忆状态设置切换按钮:

  • 在模块级别创建一些常量:

    Public const MyApp as string = "MyApp Name"
    Public const MyAppSett as string = "MyApp Settings"
    Public const TglVal as string = "Toggle_Val"
    
  • 在以下位置转换事件代码:

    Public Sub IxlRibbonToggleSettingByTag(control As IRibbonControl, IsPressed As Boolean)
     SaveSetting MyApp, MyAppSett, TglVal, cStr(IsPressed)
    End Sub
    
  • 创建一个函数以快速返回状态(在注册表中读取):


  • 全局变量对此有什么问题?它会像预期的那样工作,我看不出它有什么缺点。那么哪种方法能比这更好呢?我想用一些get/set函数来获取切换状态,而不是全局变量。呃,我同意@Pᴇʜ
    公共变量
    是最佳选择。只需两行代码,然后在任何需要的地方使用该变量。备选方案:只需在
    私有子工作簿\u Open()
    事件中添加一个工作表,并将该值存储在该事件中,然后在关闭(取消为布尔值)之前在
    私有子工作簿中关闭工作簿时删除临时工作表?如果您不想添加/删除工作表,那么只需隐藏工作表?比写入文本文件或注册表容易得多…@Pᴇʜ:对!谢谢我将以这种建议的方式修改代码。。。
    
    Public const MyApp as string = "MyApp Name"
    Public const MyAppSett as string = "MyApp Settings"
    Public const TglVal as string = "Toggle_Val"
    
    Public Sub IxlRibbonToggleSettingByTag(control As IRibbonControl, IsPressed As Boolean)
     SaveSetting MyApp, MyAppSett, TglVal, cStr(IsPressed)
    End Sub
    
    Function TglStatus() As Boolean
        Dim strToggle As String
        strToggle = GetSetting(MyApp, MyAppSett, TglVal, "Nothing...")
       If strToggle <> "Nothing..." Then
            TglStatus = CBool(strToggle)
       Else
            TglStatus = False 'for the case before memorizing of something...
       End If
    End Function
    
    If TglStatus Then
         'do something for true
    Else
         'do something else for false
    End If