Access Ribbon OnAction

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

下面是我的XML代码

    <toggleButton id="CloseBtn" label = "Close" 
        size="large"
        imageMso="FrameDelete"
        onAction= "=InvoiceRibbon_Close()"
        getPressed="MyToggle"
        keytip="C"
        supertip= "Close current window."/>

按功能为表单代码:

Public Function InvoiceRibbon_Close() As Boolean

它可以在三台计算机上使用。其中两个具有Office 2016 Access,一个仅是Access 2016运行时。在其他两台计算机上不起作用。两者都是Access 2016运行时。所有三台2016年运行时计算机都是Windows 10的新计算机。附加了错误消息。

enter image description here

onAction函数位于Form VBA代码内部。下面是我做的一些测试。

  1. 如果我将InvoiceRibbon_Close移至Module,则可以。
  2. 在模块OnAction函数上,我仍然无法通过调用Forms(“ FormName”)。InvoiceRibbonTesting_Close来调用Form内部的函数。错误消息仍然相同。
  3. Form中的功能起作用。我用了一段时间。
  4. 我想将该功能保留在VBA表格中。我有数百个与表单相关的函数。将其移至模块将是一项艰巨的任务
ms-access ribbon
1个回答
0
投票

好吧,在发生故障的计算机上,任何VBA代码都能正常工作吗?因此,请输入按钮代码和其他内容-检查它们是否起作用。如果它们不起作用,那么功能区代码当然将不起作用。

另一个问题:检查您是否正在运行计时器表单。请记住,您所使用的幻想想法是调用表单中的函数,而不要使用可怕的回调,这些回调必须放置在标准代码模块中,因此不会附加到给定的表单中,因为99%的时间我们都希望在其中可以运行和使用的表单(例如,与任何标准按钮代码一样,但是现在您正在使用功能区。因此,您的设置很好,值得推荐。)

要检查此失败的一些事项:是否有任何VBA运行?检查受信任的位置设置。

您是否在后台运行计时器表单。这非常非常,但是非常非常重要。计时器表单发生的情况是,在计时器代码运行时,表单焦点实际上更改为计时器表单,然后返回到当前具有焦点的任何表单。这是非常重要的,因为当您单击功能区按钮时,它将首先尝试在当前关注的表单的代码模块中运行代码。这很好,也很不错,因为正如您所指出的那样,您已经(并且应该)拥有属于该表单的代码。

但是,如果在这段时间内单击功能区并且当前表单焦点发生变化(例如计时器代码或运行MIGHT / MAYBE / COULD / PERHAPS / POSSBILE的其他表单代码将表单焦点更改为另一个?

嗯,功能区将查找并尝试以CURRENT焦点为形式查找该例程。这样运行的计时器表单将更改表单的焦点,如果在计时器表单代码运行时单击该按钮,则该时间点的那个表单实际上具有焦点,因此功能区实际上将尝试查找并运行该计时器形式的功能区中的函数名称!

您可以通过删除已运行的任何计时器表格进行测试来快速测试以上内容。

要寻找的另一件事是任何形式的意外焦点更改。那么,假设您最近添加了一个子表单,或者另一个导航表单,或者没有?好了,现在您认为具有焦点的表单实际上没有焦点,因此功能区找不到要运行的例程。当您说切换到一台不错的新计算机,并且使用例如运行时时,通常会发生这种情况。使用较新的计算机,通常一切运行都变得越来越好,越来越快,以至于您没有看到的FOCUS CHANGE发生变化的方式更加积极。

您在这里寻找的底线是:是否发生了意外的窗体焦点更改。说一些指定不同功能区的子表单,或者其他一些意料之外的小消息,对话框或弹出窗口。随着这些对象中的任何一个被聚焦,那么将不会找到带有功能区按钮调用代码的主窗体。

所以,这不是一个受信任的位置(即:其他VBA代码工作正常),然后检查并测试是否正在运行任何计时器表单(因为已指出,此类表单非常快就可以获取并抢劫当前表单)将焦点移开-如果您在运行计时器代码的同时按下功能区,则焦点也会发生变化,因此功能区按钮将失败。

以上结果也表示:如果可以避免这种情况,请不要使用计时器表格。计时器代码(如果必须)必须是非常好的和高效的代码-最好进入,快速运行,然后退出。

没有太大的计时器间隔。那么,说某个计时器是要检查并关闭访问权限吗?好吧,每秒检查10次,甚至每秒检查一次,就是OVER kill。每3秒检查一次。

[请注意,上述计时器问题通常还会导致报表打印按钮失败-您发现打印了一些空白表格(而该空白表格实际上是当您单击报表打印按钮时,temp成为焦点的计时器表格。)

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