- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个自定义应用程序,它将在其自己单独的 Excel 实例(新应用程序)中启动。
新创建的实例默认不可见,因此需要手动使其可见。我喜欢仅在一切设置完毕后才让我的应用程序可见 - 以避免屏幕闪烁。我认为这是比关闭和打开 ScreenUpdating 更时尚的解决方案:即,如果应用程序无论如何都是不可见的,那么应该不需要切换 ScreenUpdating。在准备好之前,您可以将其保持不可见。
但是,我遇到了一些关于隐藏功能区的异常行为。以下命令:
Application.ExecuteExcel4Macro ("SHOW.TOOLBAR(" & Chr(34) & "Ribbon" & Chr(34) & ",False)")
...用于隐藏功能区。如果将命令简单地粘贴到“立即”窗口中,则可以看到其效果。它隐藏功能区:但应用程序窗口不受影响。但是...如果应用程序在执行此命令时不可见,则看起来不仅功能区被隐藏,而且窗口的整个标题栏也被隐藏!在以下子部分中对此进行测试:
Sub TestVisible()
Dim xl As Excel.Application
Set xl = New Excel.Application
xl.Workbooks.Add ' Required
' xl.Visible = True ' Un-comment out this line to preserve the Title bar
' If the following command is executed while Visible=False, then the TITLE bar will ALSO be hidden alongside the ribbon.
xl.ExecuteExcel4Macro ("SHOW.TOOLBAR(" & Chr(34) & "Ribbon" & Chr(34) & ",False)") ' Hide the ribbon
xl.Visible = True
End Sub
所以我的问题是:有人对这种行为有解释吗?这是一个错误吗?如果有,是否为人所知?如果不是,那么有解决办法吗? (除了在隐藏功能区之前简单地使应用程序可见,然后在需要时设置 ScreenUpdating 的解决方法之外。)
最佳答案
我在这方面花费的时间比我应该花的时间多:)但这里有一些解决方法,也是我认为的完整解决方案,因为它将“标题”栏恢复到新的 Excel 实例。
我可以推测“为什么”ExecuteExcel4Macro
在这里不能正常工作:
ExecuteExcel4Macro
实际上是一个可以追溯到 1995 年之前的 Excel 的遗留问题。它不经常使用,而且我认为其中很多功能不再起作用。使用它来隐藏功能区菜单栏——该菜单栏直到 2007 年才存在,它代表了对完全暴露于 VBA 的遗留 Application.CommandBars
的范式转变(例如:您无法像在 Excel <= 2003 中那样执行 Application.CommandBars("some command bar name").Visible = False
) - 似乎可能存在一些 Microsoft 可能永远不会出现的错误地址。
通过使用各种 WinAPI 函数进行进一步调查,我发现一个有趣的事情是,当 Excel 不可见时,FindWindow
函数返回 0。我可能做错了什么,但如果没有,那么我猜测这在某种程度上导致了您观察到的行为。
这是一种类似的方法,但功能区只是最小化,用户仍然可以切换:
Sub TestAlternate()
Dim xl As Excel.Application
Set xl = New Excel.Application
xl.Workbooks.Add ' Required
xl.Application.CommandBars.ExecuteMso ("HideRibbon")
xl.Visible = True
End Sub
调整原始代码的另一个可能的解决方法是强制新实例最小化(并且可见),以避免标题栏出现错误行为:
Sub TestVisible()
Dim xl As Excel.Application
Set xl = New Excel.Application
xl.Workbooks.Add ' Required
xl.Application.WindowState = xlMinimized
xl.Visible = True ' Un-comment out this line to preserve the Title bar
' If the following command is executed while Visible=False, then the TITLE bar will ALSO be hidden alongside the ribbon.
xl.ExecuteExcel4Macro ("SHOW.TOOLBAR(" & Chr(34) & "Ribbon" & Chr(34) & ",False)") ' Hide the ribbon
xl.Visible = False
xl.Application.WindowState = xlNormal
' any additional code required to set up/configure the new instance/application
xl.Visible = True
End Sub
第三种可能的解决方案如OP评论中提到的,我建议重构代码以从模板添加新工作簿。该模板将包含 CustomUI XML 规范和适当的 VBA 回调函数来隐藏功能区上的项目。我不能 100% 确定您可以使用此方法完全复制您的设计意图,对于初学者来说这不是一件小事,但它可能值得探索。
<小时/>我找到了this solution这很有希望,但实现比我预期的要复杂,但我认为我有一些适合您的目的的东西,是根据上述内容进行修改的。
在我所做的调试中,功能区和标题栏似乎紧密地联系在一起,您会注意到我根本不使用 ExecuteExcel4Macro
,因为此函数调用需要还要照顾丝带。我怀疑这个链接可能会导致您原来的问题!
以下是 API Hook :
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const WS_CAPTION = &HC00000
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_MINIMIZEBOX = &H20000
Private Const WS_SYSMENU = &H80000
Private Declare Function SetWindowPos Lib "user32" _
(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
ByVal x As Long, ByVal y As Long, ByVal cx As Long, _
ByVal cy As Long, ByVal wFlags As Long) As Long
Private Enum ESetWindowPosStyles
SWP_SHOWWINDOW = &H40
SWP_HIDEWINDOW = &H80
SWP_FRAMECHANGED = &H20
SWP_NOACTIVATE = &H10
SWP_NOCOPYBITS = &H100
SWP_NOMOVE = &H2
SWP_NOOWNERZORDER = &H200
SWP_NOREDRAW = &H8
SWP_NOREPOSITION = SWP_NOOWNERZORDER
SWP_NOSIZE = &H1
SWP_NOZORDER = &H4
SWP_DRAWFRAME = SWP_FRAMECHANGED
HWND_NOTOPMOST = -2
End Enum
Private Declare Function GetWindowRect Lib "user32" _
(ByVal hwnd As Long, lpRect As RECT) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Sub ShowTitleBar(xlApp As Excel.Application, bShow As Boolean, Optional bCaptionOverride As Boolean = True)
Dim lStyle As Long
Dim tRect As RECT
'Dim sWndTitle As String
Dim xlhnd
'## I modified this function to receive an Application instance and
'## to use it's .Hwnd property rather than the FindWindow API call
xlhnd = xlApp.hwnd
'// Get the window's position:
GetWindowRect xlhnd, tRect
If Not bShow Then
lStyle = GetWindowLong(xlhnd, GWL_STYLE)
lStyle = lStyle And Not WS_SYSMENU
lStyle = lStyle And Not WS_MAXIMIZEBOX
lStyle = lStyle And Not WS_MINIMIZEBOX
'## I added this logic to ensure the CAPTION may always displayed if bCaptionOverride
If Not bCaptionOverride Then
lStyle = lStyle And Not WS_CAPTION
Else
lStyle = lStyle Or WS_CAPTION
End If
Else
lStyle = GetWindowLong(xlhnd, GWL_STYLE)
lStyle = lStyle Or WS_SYSMENU
lStyle = lStyle Or WS_MAXIMIZEBOX
lStyle = lStyle Or WS_MINIMIZEBOX
lStyle = lStyle Or WS_CAPTION
End If
SetWindowLong xlhnd, GWL_STYLE, lStyle
xlApp.DisplayFullScreen = Not bShow
'// Ensure the style is set and makes the xlwindow the
'// same size, regardless of the title bar.
SetWindowPos xlhnd, 0, tRect.Left, tRect.Top, tRect.Right - tRect.Left, _
tRect.Bottom - tRect.Top, SWP_NOREPOSITION Or SWP_NOZORDER Or SWP_FRAMECHANGED
End Sub
这是我们用于隐藏功能区的新子项,已在 Excel 2016 中进行了测试:
Sub Test()
Dim xl As New Excel.Application
xl.Workbooks.Add
ShowTitleBar xl, False
' configure the application
xl.Visible = True
' Re-enable the ribbon, or the user can double-click the title bar or Restore menu.
ShowTitleBar xl, True
End Sub
我在 Visible = True
语句后中断并确认功能区未显示:
最后,在过程结束时我们可以恢复功能区(如果需要)
<小时/>注意:我注意到菜单中的“恢复”选项(右键单击标题栏中的 Excel 图标)不会恢复功能区,如果您使用 ExecuteExcel4Macro
,但如果您使用 WinAPI 调用,它确实会恢复功能区。
如果您只是设置一个环境,那么这应该不重要,但我实现的方法并不能完全复制该功能。可以通过 WinAPI 进一步配置(例如,我知道您可以使用 lStyle = lStyle And Not WS_SYSMENU
关于Excel异常行为: hiding ribbon also hides TITLE bar if application is invisible,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51672541/
我先说我是一个新手 Haskell 程序员(这些年来偶尔会修改它)但是当谈到 OOO 和命令式编程时,我有几年的时间。我目前正在学习如何使用 monad 并通过使用 monad 转换器将它们组合起来(
基本上我正在寻找的是能够从选择项的下拉列表中隐藏选项的能力。因此,从技术上讲,它们仍然是选项,但由于它们是隐藏的,因此您将无法单击它们。 我查看了文档并找到了与禁用相关的内容,不幸的是我非常希望能够隐
我正在制作一个平均堆栈应用程序,但遇到了一个问题!我尝试在第 10 个问题问完后隐藏所有内容。我使用指令 ng-hide,当我到达第 10 个问题时,该指令被设置为 true!这是代码:
好吧,我正在尝试对我发现的网站上的一项功能进行逆向工程 - 网站管理员没有回复我。有问题的网站是http://www.win-free-stuff.ca/new-contests特别是,我正在尝试构建
我正在为一个 div 设置动画。它具有以下定义: ... 我定义了以下 CSS: div.ng-hide { transition: 0.5s linear opacity; opac
我正在创建一个自定义应用程序,它将在其自己单独的 Excel 实例(新应用程序)中启动。 新创建的实例默认不可见,因此需要手动使其可见。我喜欢仅在一切设置完毕后才让我的应用程序可见 - 以避免屏幕闪烁
这是非常基本的代码: $('.myDiv').click(function() { $('.anotherDiv').hide(); alert('pause the ui');
我正在尝试为一些图片制作一个 super 简单的灯箱。基本上我有一个 div,其中包含一组使用 ng-repeat 显示的图像,我希望在单击其中一个图像时显示一个灯箱 div。我不知道为什么我的灯箱
我正在尝试为 制作动画单击按钮从左侧滑入/滑出。我正在使用 Angular 框架和 ng-show控制 显示/可见性,并将转换添加到 ng-hide样式集。 我已经成功地让 div 从左边滑入,但是
我正在写一个非常简单的幻灯片,我使用的是“常规”hide(),如下所示: jQuery("#featured li:nth-child(1)").hide('slow'); 这不仅隐藏了里,而且还慢慢
我有一个产品页面,在 Bootstrap 中以砖石格式显示 -md 和 -lg(中型和大型)屏幕的结果,其中图像可能具有不同的高度 - 对于 -sm 或 -xs,我对较小的设备使用相同高度的图像。我有
在我的活动召唤的那一刻。在其onCreate方法内部,以隐藏状态栏并以全屏模式显示。。作为向Android 30迁移的一部分,正如文档所建议的那样,我用WindowInsetsController#H
Bootstrap 显然使用了“hide”、“fade”和“in”类来进行转换。 我遇到的问题是使用“fade”和“in”会将不透明度从0更改为1。过渡效果很完美,但内容仍然占据页面上的空间,即使您看
在脱碳过程中,我现在开始使用 NSMenu 以编程方式创建菜单栏。 Carbon 似乎非常适合将标准项目添加到应用程序菜单:服务、隐藏应用程序、隐藏其他、显示全部、退出应用、甚至可以使用系统偏好设置的
我有这样的代码: Hello how are you td1 被正确隐藏,但是当 td2 被隐藏时,它
//我搜索了但没有运气,所以我开始一个新问题 :) 我有: Notification 我想要:当我点击这个 a ,它将显示/隐藏一个 div,当我在该 div 外部单击时,如果它可见,它就会隐藏。 我
Test App.js: (function() { angu
想要基于下拉(选择)隐藏或显示 AngularJS 上的元素,但由于该页面是与 QlikSense 的混搭,因此来自 Qlik 的元素不能与 ng-show 很好地配合。我用 ng-show 尝试了这
如何使下面的代码更简单、更少? 谢谢。 012 012 $('.btn div:eq(0)').click(function(){ $('.content div').hide();
我看到一些方法可以在 jQuery UI 的对话框中隐藏标题栏和标题栏中的图标,但在 jQuery Mobile 中没有。有谁知道如何在 jQuery Mobile 中做到这一点? 从对话框中删除/隐
我是一名优秀的程序员,十分优秀!