Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 2016:在宏运行时,使用控件窗体覆盖Excel功能区_Excel_Vba - Fatal编程技术网

Excel 2016:在宏运行时,使用控件窗体覆盖Excel功能区

Excel 2016:在宏运行时,使用控件窗体覆盖Excel功能区,excel,vba,Excel,Vba,我有一个宏在功能区上进行操作。因为用户在功能区上看到快速自动操作看起来很尴尬,所以我想在宏使用控件窗体或某种填充矩形运行时遮盖功能区。你能提出一个解决方案吗 编辑:我尝试创建一个无模式表单并将其放置在功能区上。不幸的是,当宏运行时,动作仍然会闪烁,它们的z顺序似乎超过了用户表单的顺序。考虑到我的另一个,我想我已经用尽了一切,但谁知道也许有什么东西能起作用 编辑2:正如您在上面的GIF中所看到的,即使按照建议将窗口位置设置为最顶部,宏操作仍然会在无模式用户窗体上闪烁。我还尝试在扩展功能区后显示和

我有一个宏在功能区上进行操作。因为用户在功能区上看到快速自动操作看起来很尴尬,所以我想在宏使用控件窗体或某种填充矩形运行时遮盖功能区。你能提出一个解决方案吗

编辑:我尝试创建一个无模式表单并将其放置在功能区上。不幸的是,当宏运行时,动作仍然会闪烁,它们的z顺序似乎超过了用户表单的顺序。考虑到我的另一个,我想我已经用尽了一切,但谁知道也许有什么东西能起作用


编辑2:正如您在上面的GIF中所看到的,即使按照建议将窗口位置设置为最顶部,宏操作仍然会在无模式用户窗体上闪烁。我还尝试在扩展功能区后显示和重新定位表单,但这会导致运行时错误,因为UI自动化框架无法跟踪下一步需要操作的UI元素

要在屏幕的某个部分显示用户表单以覆盖某些内容,而代码会对其后面的功能区做一些事情,我们需要一个无模式用户表单

与模式用户表单相比,无模式用户表单具有以下优点,因为它是一个单独的窗口:它可以显示在Excel窗口的顶部,而Excel窗口保持焦点。

假设用户表单的名称是
frmCoverScreen
。要将其作为无模式用户表单调用,我们需要执行以下操作:

frmCoverScreen.Show vbModeless
现在,我们需要使用Windows API中的
SetWindowPos
函数,以便使表单始终显示在Excel窗口的顶部。我们还需要
FindWindow
函数来获取用户表单的窗口句柄。您可以包含以下代码以在项目中声明函数(模块顶部):

因此,我们现在可以获得userform的窗口句柄:

If Val(Application.Version) >= 9 Then
    WinHandle = FindWindow("ThunderDFrame", frmCoverScreen.Caption)
Else
    WinHandle = FindWindow("ThunderXFrame", frmCoverScreen.Caption)
End If
现在有了句柄,我们可以使用以下命令使userform窗口始终显示在Excel的顶部:

SetWindowPos WinHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE
然后我们只需要设置userform的
.Top
Left
Width
Height
属性,以确保它覆盖了我们需要覆盖的屏幕部分

最后,当我们不再需要覆盖屏幕时,我们可以简单地卸载表单:

Unload frmCoverScreen

您是否尝试过
Application.ScreenUpdate=False
?是。它不适用于在功能区上执行的操作。我不太清楚你为什么对这篇文章投了反对票,但没问题。
。。我不太清楚你为什么否决了这篇文章,但没关系我没有否决您的帖子。您可以隐藏应用程序,然后在更改完成后使其可见吗?1.
应用程序屏幕更新=False
在功能区上不起作用,宏本身执行通过功能区导航的操作a单击按钮2.
应用程序.visible=False也不起作用,因为它隐藏了UI树,宏无法执行操作。感谢您抽出时间编写另一个可能的解决方案。不幸的是,它也没有像预期的那样起作用,在这个阶段,我将不得不安定下来,接受我所拥有的。是的,如果这不起作用的话。如果有别的办法,我会很惊讶的。
SetWindowPos WinHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE
Unload frmCoverScreen