【问题标题】:ToggleButton status切换按钮状态
【发布时间】:2020-09-20 15:19:49
【问题描述】:

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

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

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

onAction 事件(二)

Public Sub IxlRibbonGetButtonStateByTag(theControl As IRibbonControl, ByRef isbtnpressed)
'++
'Get ShowOnClick button state, callback for getPressed
'
' Arguments:
'    theControl - The ribbon control that fired the OnAction request.
'    IsPressed - Button status
'--
On Error Resume Next
isbtnpressed = (ReadFromSettingsFile (theControl.Tag, "0") <> "0")

End Sub

Public Sub IxlRibbonToggleSettingByTag(control As IRibbonControl, IsPressed As Boolean)
'++
'callback for onAction
'
' Arguments:
'    theControl - The ribbon control that fired the OnAction request.
'    IsPressed - Button status
'--
On Error Resume Next

If IsPressed Then
    WriteToSettingsFile control.Tag, "1"
Else
    WriteToSettingsFile control.Tag, "0"
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ᴇʜ在评论部分建议

【问题讨论】:

  • 全局变量有什么问题?它会按预期工作,我认为它没有任何缺点。那么有什么比这更好的呢?
  • 我在想一些 get/set 函数来获取切换状态而不是全局变量。
  • 呃,我同意@Pᴇʜ Public Variable最佳选项。只需 2 行代码,然后在任何你想要的地方使用该变量。 替代:只需在Private Sub Workbook_Open() 事件中添加一个工作表并将值存储在那里,然后在Private Sub Workbook_BeforeClose(Cancel As Boolean) 事件中关闭工作簿时删除临时表?如果您不想添加/删除工作表,那么只需隐藏工作表?比写入文本文件或注册表要容易得多...

标签: excel vba togglebutton


【解决方案1】:

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

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

    Public const MyApp as string = "MyApp Name"
    Public const MyAppSett as string = "MyApp Settings"
    Public const TglVal as string = "Toggle_Val"
    
  2. 将您的事件代码转换为:

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

    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
    
  4. 并像这样使用它:

    If TglStatus Then
         'do something for true
    Else
         'do something else for false
    End If
    

【讨论】:

  • @Pᴇʜ:正确!谢谢!我将以这种建议的方式调整代码...
猜你喜欢
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多