繁体   English   中英

如何在 VBA 代码运行时禁用功能区

How to disable ribbon while VBA code is running

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

如果代码已经在运行,我需要取消自定义功能区上的按钮点击。

问题:虽然我可以禁用按钮,但点击仍然“注册”,即使禁用,每次点击按钮都会运行一次相应的代码。

Public Sub OnActionButton(control As IRibbonControl)

    ' The following approach fails to prevent code from running
    If Not globalEnabled Then Exit Sub

    ' The following approach fails to prevent code from running
    Dim goodToGo as Boolean
    GetEnabled control, goodToGo
    If Not goodToGo Then Exit Sub


    ' *********************************************************
    ' Code Below Here Should NOT Run If Button Was Clicked 
    ' While globalEnabled = False (i.e. code already running)
    ' *********************************************************

    ' Disable the Ribbon
    globalEnabled = False
    RibbonInvalidate

    Select Case control.id
        Case "btnID"
            ' doSomething
    End Select

    ' Re-enable the ribbon
    globalEnabled = True
    RibbonInvalidate

End Sub

编辑:就其价值而言,这就是我禁用按钮的方式:

Public Sub GetEnabled(control As IRibbonControl, ByRef enabled)
' Called by RibbonInvalidate
    Select Case control.id
        Case "btnID"
            enabled = globalEnabled 
    End Select 
End Sub

我可以想象第一次点击按预期运行,第二次点击(在与第一次点击对应的代码正在运行时进行)“排队”,直到第一次点击完成。 此时 globalEnabled 再次为 True,因此检查无效。

我想我可以隐藏自定义功能区选项卡(或用虚拟选项卡替换它) - 但这真的有必要吗?

有没有一种优雅的方法来取消按钮按下?


编辑:

我可以在代码中添加一堆 doEvents,但是太慢了。

编辑2:

如果我在代码执行期间显示一个消息框,那么出于某种原因,事情似乎按预期工作......

事实上......如果我显示一个消息框,那么我什至不需要提前退出逻辑 - 太奇怪了!

2 个回复

这是有效的,主要是在最后添加 doEvents(或消息框)。

Public Sub OnActionButton(control As IRibbonControl)

    ' Disable the Ribbon
    globalEnabled = False
    RibbonInvalidate

    Select Case control.id
        Case "btnID"
            ' doSomething
    End Select

    ' Re-enable the ribbon
    doEvents                     ' <-- Adding this fixed the issue for me
    ' msgbox "finished"          ' <-- also works, but pretty annoying ;-)
    globalEnabled = True
    RibbonInvalidate

End Sub

我迟到了,但是您是否将 GlobalEnabled 声明为全局变量? 因为根据我的理解和测试(在类似的问题上)如果它没有明确声明为全局,每次单击功能区按钮时,都会创建 GlobalEnabled 的局部变量,而不是使用宏的先前运行中设置的值。

1 jQuery-动画运行时禁用功能

我正在使用下面的代码在滚动条上添加类到导航栏。 它工作正常,但我希望它在单击导航栏中的和li元素时禁用滚动功能,因此在用户单击导航后,当滚动动画启动时它不会开始更改类,所以我想我需要禁用滚动功能,直到滚动动画完成。 有什么建议么? 编辑也许我在这里不清楚。 当用户单击li项时,我使用 ...

3 如果VBA中存在特定工作表,如何在Excel中禁用功能区按钮

我正在构建一个Excel加载项,允许用户与PowerPoint交互并导出数据。 用户可以选择通过功能区中的按钮将模板插入现有工作簿。 当他们单击此按钮时,该按钮将被禁用,因为您在一个工作簿中不能有两个模板。 然后,用户可以保存他们的工作簿并在稍后返回。 我的问题是我需要检测他们是否已 ...

4 代码运行时未调用Excel VBA功能区getEnabled

我有一个运行很长时间的Excel VBA宏(可能持续数天,它执行数据采集)。 它最初是为Excel 2003编写的,具有自定义工具栏和菜单。 我最近更新了它以使用RibbonXML使用功能区界面。 当宏运行时,我想禁用一些界面元素(例如“开始测试”),并启用其他元素(例如“停止测试”按 ...

6 禁用功能区按钮

我想禁用而不是隐藏特定列表类型上的功能区按钮(特别是 Ribbon.ListItem.New.NewListItem)。 在网络上,我可以找到很多帖子向我展示了删除/隐藏按钮的方法,但没有一个真正值得,这可以告诉我如何在我的自定义列表类型中禁用现有的共享点按钮。 例如以下代码确实删除了按钮而不是隐 ...

7 禁用功能区按钮

我目前使用WPF的Ribbon Framework开发功能区。 我已经看到,在办公室中,一旦满足条件,就会有“禁用的按钮”将被“激活”。 有谁知道如何启用这种功能? 另外,请注意红色框左侧的“文本框”,其中标记着“位置”功能区按钮,无论如何都可以扩展功能区文本框来获得那些“向上 ...

8 如何在Outlook中启用/禁用功能区按钮

我有一个使用VSTO创建的Outlook加载项。 使用功能区设计器,我创建了一个带有三个按钮的选项卡。 ( 环境:Outlook 2010,.NET 4.0,VSTO最新运行时 ) 当按下其中一个按钮时,将打开一个无模式对话框。 只要用户正在使用此对话框,我都不希望他能够再次按下该按 ...

9 在运行时演示和使用功能

我想向外界展示一个类的功能(成员函数),而不在公共部分中公开它的功能。 因此用户将能够动态了解/调用其功能。 以下是一些方法: a)提供指向成员函数的指针。 在带有附加字符串的结构中使用的指针,用于保存函数的名称。 b)提供函数名称的字符串列表,以及提供带有字符串参数以调用指定 ...

10 在运行时使用功能转换类型列表

我有一个类型列表。 我想创建一个元组,其结果是对该列表中的每种类型调用一个函数,然后将其用作另一个函子的参数。 所以像这样: 问题是func(*get_arg&lt;param_types&gt;(id)...); 实际上不会编译,因为param_types是一个元组而不是参数包。 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM