Excel:令人难以置信的收缩和扩大控制
偶尔,我会遇到一个电子表格,这些电子表格会随着时间的推移而变得越来越大或者越来越小。
代码中没有任何指示。
有没有人体验过这种喜悦?
这个问题似乎与Windows在监视器上处理非本机分辨率的方式有关,可以通过多种方式避免
问题可能是一个完整的恶梦,但它只发生间歇性。
我们最近testing了几十个人使用的excel工作表,并且对这个原因和一些可能的修复有了一个好的想法。
原因似乎涉及任何设置屏幕的使用非本地分辨率的东西。 如果用户将外接显示器插入笔记本电脑,并且不仔细select最终的屏幕configuration,则可能会发生这种情况。 例如,如果一台笔记本电脑插入投影仪(也许是一个老的1024×768显示器),但笔记本电脑是1280×800,用户select复制显示器而不是扩展显示器(设置为“连接到一台投影机“或”显示“控制面板),结果是在两个屏幕上的非自然分辨率都是不可预知的,通常不能令人满意的图像。 我们发现这些设置几乎总是对Excelbutton造成严重的问题,特别是ActiveX控件。 有时,反复点击,他们缩小到不可读性; 其他时候他们扩大覆盖整个屏幕。
大多数情况下,当我们指导用户使用扩展显示设置,结果是两个屏幕都使用原生分辨率时,我们不会看到问题。
也有基于代码的方式来最大限度地减less问题。 我们试着重新设置button和控件的位置和大小,当它们被点击时(如果你有很多button,会增加很多繁琐的代码)。 这有时工作。 我们也尝试将autosize属性从true切换到false,并返回(这在开发人员模式下可以手动工作),这样可以修复更多的实例,但显然不是全部。
发现原因是人们在通过远程桌面访问的计算机上打开spreasheet,并且在本地和远程计算机之间的屏幕分辨率存在差异。 这会影响控件工具箱中的控件,但仍然使用老式的表单button控件来体验问题,所以我不满意的答案是使用该控件。
这个问题实际上是由于屏幕分辨率。 当用户使用Excel应用程序连接到投影仪或WebEx时,通常会发生这种情况。
解决这个问题的一个简单方法就是要求用户在没有任何外设连接(投影机)的情况下重新启动机器,然后再次打开Excel应用程序。
这一直困扰着我多年,一次又一次。 周围有一些修复,但他们似乎挨打。 它仍然在Excel 2010中发生(发生在我2014年5月),并且在一些报告中仍然在Excel 2013中发生。 最好的描述,我发现至less符合我的情况(Excel 2010,没有涉及RDP,没有涉及打印预览)在这里:
Microsoft Excel支持团队博客:ActiveX和窗体控件在单击或执行打印预览时调整自身大小(在Excel 2010中)
(这可能无助于Excel 2013的用户抱歉)
编辑:添加案例technet链接永远死亡,technet文章说:
首先安装适用于Excel 2010的Microsoft Hotfix 2598144 ,可以在这里find 。
第二,如果您的症状是 “在Excel 2010工作表中单击它后,ActiveXbutton更改为不正确的大小”,则应该:
- 单击开始,单击运行,在打开框中,键入regedit,然后单击确定。
- find并select以下registry子项HKEY_CURRENT_USER \ Software \ Microsoft \ Office \ 14.0 \ Excel \ Options
- 在编辑菜单上指向新build,然后单击DWORD(32位)值。
- 键入LegacyAnchorResize,然后按Enter键。
- 在“详细信息”窗格中,右键单击“LegacyAnchorResize”,然后单击“修改”。
- 在数值数据框中,键入1,然后单击确定。
- 退出registry编辑器
OR SECONDLY,如果您的症状是 “在Excel 2010中查看工作簿的打印预览后,工作簿中的button窗体控件显示不正确”,则应该:
- 单击开始,单击运行,在打开框中,键入regedit,然后单击确定。
- find并select以下registry子项:HKEY_CURRENT_USER \ Software \ Microsoft \ Office \ 14.0 \ Excel \ Options
- 在编辑菜单上指向新build,然后单击DWORD(32位)值。
- 键入MultiSheetPrint,然后按Enter键。
- 在“详细信息”窗格中,右键单击“MultiSheetPrint”,然后单击“修改”。
- 在数值数据框中,键入1,然后单击确定。
- 再次select以下registry子项:HKEY_CURRENT_USER \ Software \ Microsoft \ Office \ 14.0 \ Excel \ Options
- 在编辑菜单上指向新build,然后单击DWORD(32位)值。
- 键入LegacyAnchorResize,然后按Enter键。
- 在“详细信息”窗格中,右键单击“LegacyAnchorResize”,然后单击“修改”。
- 在数值数据框中,键入1,然后单击确定。
- 退出registry编辑器
或者第二,如果您的症状是 “在查看工作表的打印预览后Excel工作表中的一个ActiveXbutton被更改为不正确的大小”,那么您应该:
- 单击开始,单击运行,在打开框中,键入regedit,然后单击确定。
- find并select以下registry子项:HKEY_CURRENT_USER \ Software \ Microsoft \ Office \ 14.0 \ Excel \ Options
- 在编辑菜单上指向新build,然后单击DWORD(32位)值。
- 键入LegacyAnchorResize,然后按Enter键。
- 在“详细信息”窗格中,右键单击“LegacyAnchorResize”,然后单击“修改”。
- 在数值数据框中,键入1,然后单击确定。
- 退出registry编辑器
祝你好运。 这个问题是如此的痛苦…
前面讨论的修复,在单击事件之后以编程方式调整/重新定位Active X控件或修改registry(使用D word LegacyAnchorResize),并不能解决Excel 2010 / Windows 7 64位的问题。
我find了解决scheme: https : //support.microsoft.com/en-us/kb/838006
对于Excel 2010,链接指示:
- 退出所有正在运行的程序。
- 单击开始,单击运行,在打开框中,键入regedit,然后单击确定。
- find,然后单击下面的registry项:
- HKEY_CURRENT_USER \软件\微软\办公室\ 14.0 \共同
- 在编辑菜单上,指向新build,然后单击密钥。
- 键入绘图,然后按Enter键。
- 在编辑菜单上,指向新build,然后单击DWORD值。
- inputUpdateDeviceInfoForEmf,然后按Enter键
- 用鼠标右键单击UpdateDeviceInfoForEmf,然后单击修改。 10.在数值数据框中,键入1,然后单击确定。
- 在文件菜单上,单击退出以closuresregistry编辑器。
难道是button被定义为坚持到一个单元格的angular落,而不是自由浮动?
检查它
格式| 属性| 对象定位
并select任何东西,但“移动和单元格大小”
我的显示器似乎都是以原始分辨率设置的,这加深了这个谜团。 但是,我发现做button(移动或resize)某种方式修复问题。 这个例程自动移动,然后恢复原来的设置。
下面的代码似乎解决了这个问题,至less对于button来说。
Public Sub StablizeButton(oButton As MSForms.CommandButton) With oButton ' If True, then temporary distortion is remedied only by clicking somewhere. ' If False, then the temporary distortion is remedied merely by moving the mouse pointer away. .TakeFocusOnClick = False ' For best results: In the Properties Sheet, initialize to False. .Left = .Left + 200 ' Move the button 200 units to the right, ... .Left = .Left - 200 ' ... and then move it back. End With End Sub
调用它如下:
Private Sub MyButton_Click() StablizeButton MyButton ' Remainder of code. End Sub
我有这个问题几次,并解决我做了以下几点:
- 通过我的C:\驱动器search任何扩展名为“.exd”的文件
- 删除这些文件(可以这样做)
- 实现在每次打开表单时重新调整ActiveX对象大小的代码
我发现这个问题导致我们将笔记本电脑插入投影机并保存文件。 然后每当问题出现,我只是重复步骤1和2,我的ActiveX对象再次performance
旧的线程,但我有这个问题,并解决了它通过首先分组,在我的情况下,有问题的选项button,然后简单地设置(重置)在Auto_Open这个组的大小,因此:
With ThisWorkbook .Worksheets("1").Shapes("grpInput").Width = 383.1 .Worksheets("2").Shapes("grpSuite").Width = 383.1 .Worksheets("3").Shapes("grpLoc").Width = 383.1 .Worksheets("4").Shapes("grpDecision").Width = 383.1 End With
这很奇怪。 查询时(无论是在代码中还是使用属性表),“宽度”和“高度”属性都不收缩,但显然它们会发生更改。
我注意到,如果使用属性表并将标准15的宽度更改为14,然后将其更改为15,则会修复此问题。
下面的代码适用于我(在表单上有一个有趣的视觉效果:单击,缩小,屏幕闪烁,然后展开)。
我的代码解决scheme(在checkbox的点击事件):
Dim myCtrl As OLEObject For Each myCtrl In ActiveSheet.OLEObjects myLab = myCtrl.Name myCtrl.Height = 14 ' to "wake up" the property. myCtrl.Height = 15 ' to reset it back to normal myCtrl.Width = 12 ' just making sure Next myCtrl
searchnetworking后,它接缝的最佳解决scheme是将文件保存为.xlsb(二进制)而不是.xlsm
我刚开始做的事情是让我有一个单独的子集来设置我所有的控件的大小。 然后,我可以从代码中控件增长或缩小的任何点运行此子。 有时候会有很多额外的挑剔的工作,但是让我的button不能吃我的电子表格。
我没有testing这个,但我想这必须做的缩放属性(也许添加activewindow.Zoom = false
)。
也可以在形状上做一个循环,在workbook_open和.Placement = xlMove
上定义.Placement = xlMove
,这是为了防止形状调整与单元格(但将与他们一起移动)。
我正在使用Excel 2013,从来没有这个问题,我也从来没有远程使用它,只是试图帮助小的想法
我可能find了一个解决方法:“ 确保工作表上的所有形状都有唯一的名称 ”(包括checkbox/单选button(OLE控件)以及图片和其他形状types…)
由于问题是间歇性的,我不能保证这一点。 我现在有两种forms,现在使用这个修复工作正常,但“两个”是一个非常小的样本集,可能只是巧合。 从来没有,这是我采取的步骤:
我列出了一个空白工作表(Sheet1)上问题表(wsForm)中的所有形状:
Sub ListShapes() Dim spShape As Shape Dim intRow As Integer Sheet1.Range("A1:F1") = Array("Name", "Left", "Top", "Width", "Height", "Bottom Right Cell") intRow = 2 For Each spShape In wsForm.Shapes Sheet1.Cells(intRow, 1).Value = spShape.Name Sheet1.Cells(intRow, 2).Value = spShape.Left Sheet1.Cells(intRow, 3).Value = spShape.Top Sheet1.Cells(intRow, 4).Value = spShape.Width Sheet1.Cells(intRow, 5).Value = spShape.Height Sheet1.Cells(intRow, 6).Value = spShape.BottomRightCell.Address intRow = intRow + 1 Next End Sub
然后我使用列G中的公式计算A列中的每个形状名称:
= COUNTIF($ A $ 2:$ A $ 120 A2)
很明显,调整范围以适应…你可以过滤所有在这个列没有“1”的形状。 “右下单元格”帮助您在工作表上find形状:通过select形状进行重命名,然后在Excel左上angular的名称/引用框中input新的唯一值。
这个形状列表还帮助find一些被遗忘和未被使用的“死”形(0高或0宽)。
我希望这对你有用! 对于这个问题…我希望它适用于我未来的事件…
如果你不想显示button来回移动,你可以把原来的位置放入你的代码,然后检查这些。 单击button时closures屏幕更新,检查控件上的位置是否不同,如果需要,请将其更改回来,然后重新开启屏幕更新
DP
在尝试了许多有关这篇文章和相关文章的解决scheme后,我发现微软发布的另一个问题的解决scheme在以特定方式应用时也能可靠地工作,至less在我工作的环境中是如此。 当我转换到非本地分辨率时,我在这里和PC上的笔记本电脑本地解决了这些问题。 也就是说,加载比正常大的button,点击时变大,这些button中的文本和图像缩小(至less文本的设置保持不变,所以我看不到以任何方式将其更改回编程否则)。在我的情况下,这些并不是间歇性的问题。 虽然在使用微软公布的解决scheme打印预览后,我有间歇性的问题。 我试过这个,它似乎工作。
解决scheme:对于Excel,closures应用程序并从C:\Users{UserName}\AppData\Local\Temp\Excel8.0
中删除MSForms.exd文件,同时在您要查看button的解决scheme中。您也可以在其他Office应用程序的本地AppData \ Temp文件夹中search其他.exd文件。
正如我所提到的,这是微软针对不同的问题提出的一个解决scheme – 安装14月12日更新后button停止工作。 这是该文章的链接。 在这种情况下,这是一次性修复。 在这里,您可能需要每次更改分辨率时都这样做。
对控件进行分组似乎对我有用。 我会upvote或评论,但SO不会让我。 请注意,如果您使用W8显示屏缩放并使用高分辨率笔记本电脑和较旧的显示器,则会出现此问题。
我发现所有对象(button,文本框等)的这个问题。 当我打印/打印预览多张纸时,除序列中第一张以外的所有纸张都移动或调整了大小。 经过多次testing,最简单的解决scheme就是放大或缩小页面,并返回原始设置。
我们刚刚在公司层面上解决了这个问题,将以下模块添加到所有启用macros的工作簿中:
Option Explicit Type ButtonSizeType topPosition As Single leftPosition As Single height As Single width As Single End Type Public myButton As ButtonSizeType Sub GetButtonSize(cb As MSForms.CommandButton) ' Save original button size to solve windows bug that changes the button size to ' adjust to screen resolution, when not in native resolution mode of screen myButton.topPosition = cb.top myButton.leftPosition = cb.Left myButton.height = cb.height myButton.width = cb.width End Sub Sub SetButtonSize(cb As MSForms.CommandButton) ' Restore original button size to solve windows bug that changes the button size to ' adjust to screen resolution, when not in native resolution mode of screen cb.top = myButton.topPosition cb.Left = myButton.leftPosition cb.height = myButton.height cb.width = myButton.width End Sub
只需在代码的开头和结尾调用它们就可以了:
Private Sub CommandButton1_Click() Application.ScreenUpdating = False ' Turn off ScreenUpdating to make sure the user dosn't see the buttons flicker GetButtonSize CommandButton1 ' Saves original button size ' Do cool things ' ' ' SetButtonSize CommandButton1 ' Restores original button size Application.ScreenUpdating = True ' Turn ScreenUpdating back on when you're done End Sub
我也遇到了ActiveX列表框的问题,并在其他地方发现了以下内容,它似乎工作到目前为止,似乎也是最简单的解决scheme:将电子表格交给其他人时,
“虽然ListBox有一个IntegralHeight属性,其副作用是FALSE设置可以防止控件发生歪斜,而命令button具有诸如单元格移动/大小等属性,但是其他控件不够优美。
他们还有一些build议: http : //www.experts-exchange.com/articles/5315/Dealing-with-unintended-Excel-Active-X-resizing-quirks-VBA-code-simulates-self-correction.html
我发现这个问题似乎只发生在冻结窗格打开时,通常会在大多数应用程序中打开,因为您将命令button等放置在不会滚动出去的位置。
已经解决的办法是对控制进行分组,但也确保该组超出冻结窗格区域。 我这样做是通过在冻结窗格区域外添加一个控件,将其添加到组中,但也隐藏了控件,以免看到它。
现在使用Excel 2013,这发生每次我扩展我的显示,而Excel运行(每次我删除扩展名)。
我已经开始实施的修复是使用超链接而不是button,并打开一个用户窗体与所有其他的ActiveX控件。
将此代码添加到.reg文件。 双击并确认。 重新启动Excel。
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\options] "LegacyAnchorResize"=dword:00000001 [HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Common\Draw] "UpdateDeviceInfoForEmf"=dword:00000001
尝试使用右下angular滑块将缩放设置更改为100%。 在两个不同大小的显示器上为我修好了。
我find了一个可以解决问题的解决scheme,可以解决单个用户的问题。 如果你不想读我的小咆哮,你可以直接跳到解决scheme。
RANT:
自恐龙以来,我一直在经历这个愚蠢的问题。 与此同时,微软有足够的资源来发布Office套件的无数主要更新,但这个问题没有得到解决。 这绝对是令人愤怒的。 当这样的基本东西不起作用时,我没有理由升级。 毫无疑问,MS上的某个人正在高分辨率显示器上使用Excel中的ActiveX控件,不是吗?
我没有在我的台式电脑上遇到这个问题,也不知道为什么,但是在我的Surface Pro 4上,当我点击它们时,我的ActiveX控件就去香蕉了。
今天,我决定深究这一点。 我search了很高的和低的,尝试了各种论坛上提出的每一个解决scheme(其中没有一个是有效的)。 无论控件是否分组,是否locking,是否安装了修补程序。
昨天我遇到了另一个问题,在另一个名为Traktor(DJ软件)的应用程序中出现exception,当显示缩放设置为一个不是100%的精确倍数的值时,控件会跳转。 用户发现解决scheme是编辑该应用程序的兼容模式。 所以我做了同样的Excel,它的工作! 现在我的控件保持放置,无论显示分辨率和缩放。
解:
(确保Excel没有运行)
- findEXCEL.EXE(在我的系统上可以在C:\ Program Files \ Microsoft Office \ Office16 \ EXCEL.EXEfind)
- 将“EXCEL.EXE”重命名为“_EXCEL.EXE”(基本上将其更改为其他)
- 用鼠标右键单击重命名EXCEL.EXE文件,然后转到属性>兼容性选项卡>设置部分
- 设置覆盖高DPI缩放行为=启用,缩放执行=应用程序
- 点击OK
- 重命名为“_EXCEL.EXE”回到“EXCEL.EXE”
现在,Excel将以其原始分辨率运行,并且ActiveX控件不会出错。 唯一的缺点是,Excel不会响应屏幕缩放,所以事情可能看起来比想象的要小一些。 在我的Surface Pro 4上是可以接受的
笔记:
1) Excel 2016需要步骤2和6,因为EXCEL.EXE的“属性”对话框不提供“兼容性”选项卡。 重命名后,选项卡变为可用。
2)此解决scheme仅适用于一个用户。 也就是说,如果将包含ActiveX控件的Excel文件发送给同事,则ActiveX控件将无法在其系统上正确显示,除非它们更改了兼容模式设置。
3)应用此黑客之后,以前损坏的Excel文件似乎修复自己打开它们时,所有控件恢复其原始的预期的尺寸。
请testing和评论,我希望这可以帮助别人,欢呼!
我有时也有同样的问题。 就我而言,我可以把它复制到一个文件上,但是在一个几乎相同的文件上是不一致的。 我也发现大小错误不是永久性的 – 我可以保存并重新打开文件来恢复button的外观。 我也可以创build一个新的窗口,然后放弃损坏的窗口。 我使用单个显示器configuration。
对于我来说,当我访问工作表的HPageBreaks集合时调整了button的大小。 通过临时更改窗口视图,我能够避免这个问题,如下所示:
ActiveWindow.View = xlPageBreakPreview ' do pagination stuff using HPageBreaks ActiveWindow.View = xlNormalView
我们也有这个问题。 我不记得究竟是什么修复,因为我们现在正在按预期运作…尝试分组的控制。 我认为这是我们的决议。