有时,我会遇到一个受魔术按钮或列表框影响的电子表格,这些按钮或列表框会随着时间的推移而变大或变小。
代码中的任何内容都没有说明这一点。
有没有其他人经历过这种快乐?
有时,我会遇到一个受魔术按钮或列表框影响的电子表格,这些按钮或列表框会随着时间的推移而变大或变小。
代码中的任何内容都没有说明这一点。
有没有其他人经历过这种快乐?
该问题似乎与 Windows 在显示器上处理非本机分辨率的方式有关,可以通过多种方式避免
当问题发生时,它可能是一场彻头彻尾的噩梦,但它只是间歇性地发生。
我们最近一直在测试几十人使用的 Excel 工作表,并且对原因和一些可能的修复有了很好的了解。
原因似乎与屏幕用于其原始分辨率以外的任何设置有关。如果用户将外接显示器插入笔记本电脑并且没有仔细选择生成的屏幕配置,则很容易发生这种情况。例如,如果笔记本电脑插入投影仪(可能是一台带有原生 1024 x 768 显示器的旧电脑),但笔记本电脑是 1280 x 800 的,并且用户选择复制显示器而不是扩展显示器(“连接到Windows 7 中的“投影仪”或“显示器”控制面板),结果是在两个屏幕上都出现不可预测且通常不令人满意的图像,并且两者均采用非本机分辨率。我们发现这些设置几乎总是导致 Excel 按钮出现严重问题,尤其是 ActiveX 控件。有时,在反复点击时,它们会缩小到不可读;其他时候,它们会扩展以覆盖整个屏幕。
大多数情况下,当我们指示用户使用扩展显示设置并且结果是两个屏幕都使用本机分辨率时,我们看不到问题。
还有一些基于代码的方法可以最大限度地减少问题。我们尝试在单击按钮和控件时重置它们的位置和大小(如果您有很多按钮,这会增加很多繁琐的代码)。这有时奏效。我们还尝试将 autosize 属性从 true 切换到 false 并返回(这在开发人员模式下手动工作),这修复了更多实例,但显然不是全部。
发现原因是人们在通过远程桌面访问的机器上打开电子表格,并且本地和远程机器之间的屏幕分辨率存在差异。这会影响控件工具箱中可用的控件,但尚未遇到使用老式表单按钮控件的问题,所以我不满意的答案是使用它。
这一直困扰着我多年,断断续续。周围有许多修复,但它们似乎命中注定。它仍在 Excel 2010 中发生(2014 年 5 月发生在我身上),并且某些报告仍在 Excel 2013 中发生。我发现至少与我的情况相匹配的最佳描述(Excel 2010,不涉及 RDP,不涉及打印预览)在这里:
Microsoft Excel 支持团队博客:ActiveX 和表单控件在单击或执行打印预览时自行调整大小(在 Excel 2010 中)
(这可能对 Excel 2013 的用户没有帮助,抱歉)
编辑:在technet链接失效的情况下添加细节,technet文章说:
首先为 Excel 2010 安装 Microsoft Hotfix 2598144,可用:此处。
其次,如果您的症状是“在 Excel 2010 工作表中单击 ActiveX 按钮后,它的大小更改为不正确”,那么您应该:
或者其次,如果您的症状是“在 Excel 2010 中查看工作簿的打印预览后,工作簿中的按钮表单控件显示不正确”,那么您应该:
或者其次,如果您的症状是“在您查看工作表的打印预览后,Excel 2010 工作表中的 ActiveX 按钮更改为不正确的大小”,那么您应该:
祝你好运。这个问题好痛。。。
这个问题实际上是由于屏幕分辨率造成的。最常见的情况是用户在使用 excel 应用程序时连接到投影仪或 WebEx。
解决这个问题的一个简单方法是要求用户在没有任何外围连接(投影仪)的情况下重新启动他们的机器,然后再次打开 excel 应用程序。
前面讨论的修复程序,在单击事件后以编程方式调整 Active X 控件的大小/重新定位,或修改注册表(使用 D 字 LegacyAnchorResize),并没有解决 Excel 2010/Windows 7 64 位的问题。
在这里找到了适合我的解决方案:https: //support.microsoft.com/en-us/kb/838006
对于 Excel 2010,该链接指示:
我的显示器似乎都设置为原始分辨率,这加深了谜团。但是,我发现对按钮做一些事情(移动或调整大小)以某种方式解决了这个问题。此例程自动移动,然后恢复原始设置。
下面的代码似乎解决了这个问题,至少对于按钮。
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
这个问题非常令人沮丧,我的经验是通常在 ActiveX 对象上正确设置属性。我已经从上面修改了一个 UDF,使其能够在任何活动工作表上运行,这将使一切恢复到收缩前的状态。
Public Sub ResizeAllOfIt()
Dim myCtrl As OLEObject
For Each myCtrl In ActiveSheet.OLEObjects
Dim originalHeight
Dim originalWidth
originalWidth = myCtrl.width
originalHeight = myCtrl.height
myCtrl.height = originalHeight - 1
myCtrl.height = originalHeight
myCtrl.width = originalWidth
Next myCtrl
End Sub
我注意到这些答案都没有将控件锚定到特定的行和列。这对我来说非常干净,因为行/列往往比监视器的分辨率更容易预测。
下面的示例基本上“测量”对象应该去哪里,然后在Worksheet_Activate
代码中设置它。在下面的示例中,按钮将始终捕捉到覆盖D8:F10
。
Private Sub Worksheet_Activate()
'Note this is done in the sheet code, not a Module.
With Me.Shapes("CommandButton1")
.Left = Me.Range("A1:C1").Width
.Top = Me.Range("a1:a7").Height
.Width = Me.Range("D1:F1").Width
.Height = Me.Range("A8:a10").Height
End With
End Sub
结果将如下图所示:
难道按钮被定义为粘在单元格的角落,而不是自由浮动?
检查它
格式 | 属性 | 对象定位
并选择除“使用单元格移动和调整大小”之外的任何内容
这很奇怪。查询时(在代码中或使用属性表),宽度和高度属性不会缩小,但显然它们确实发生了变化。
我注意到,如果我使用属性表并将宽度从标准的 15 更改为例如 14,然后返回到 15,它会修复它。
下面的代码对我有用(并且在工作表上具有有趣的视觉效果:您单击,它会缩小,屏幕闪烁,然后它会向后扩展)。
我在代码中的解决方案(在复选框的单击事件上):
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
我遇到过几次这个问题,为了解决我做了以下事情:
我发现这个问题是由我们将笔记本电脑插入投影仪并保存文件造成的。然后每次出现问题时,我都会重复第 1 步和第 2 步,而我的 ActiveX 对象又开始运行了
我们刚刚通过将以下模块添加到所有启用宏的工作簿中,在公司层面解决了这个问题:
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
旧线程,但我遇到了这个问题,并通过首先将出现问题的选项按钮分组在一起,然后简单地在 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
尝试使用右下方的滑块将缩放设置更改为 100%。在不同尺寸的两台显示器上为我修复了它。
[EXCEL PROFESSIONAL PLUS 2016, 32BITS, 版本 1802, BUILD 9029.2167]
我遇到了同样的问题,我可以通过在 Windows 10、64 位中自定义显示缩放来解决问题。它非常简单,适用于单个用户。只需按照以下说明操作,您就可以将所有表单控件、工作表形状、图形和 ActiveX 控件恢复为原始大小。无需编码或进行高级技巧/巫术/黑客攻击。如果提供的链接已损坏,请重复这些步骤。
要在 Windows 10 中设置显示自定义缩放,您需要执行以下操作。
打开设置。
这是一篇旧帖子,但我希望它可以帮助任何正在处理这个烦人且压力大的 Excel 问题的人。
https://winaero.com/blog/set-display-custom-scaling-windows-10/
我在 Excel 2010 中一直遇到这个问题(这总是让我回到这个线程),虽然我还没有找到 100% 的解决方法,但我相信我有一些可以帮助其他人的信息。
在繁琐地使用按钮时,我发现每个对象的不同事件会导致不同的问题。例如,
唯一对我有用的解决方案是编写代码来重置导致随机调整大小的每个对象事件的大小/文本。像这样...
其中 MaterialNum 是输入框的名称,而 MouseDown 是事件...
Private Sub MaterialNum_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
' Reset the size, font style, and size
With Worksheets("QuoteForm").Shapes("MaterialNum")
.Height = 21
.Width = 101.25
.Left = 972.75
.Top = 87
With .DrawingObject.Object.Font
.Name = "Arial"
.Size = 12
End With
End With
End Sub
此外,我不得不更改格式控件中的一些选项(右键单击对象> 格式控件):
此外,在“对象属性”窗格中(右键单击对象 > 属性)我将 TakeFocusOnClick 设置为 false
是的,这是耗时且乏味的,因为它必须对每个对象进行,但它是唯一对我有用的修复(而且它似乎比等待 Microsoft 修复它更快!!!)。希望它可以帮助其他人。
我希望其他人觉得这有帮助
我有一个类似的问题,但是我发现通过放大和缩小页面很快就解决了。因此,我将以下代码添加到宏的底部作为快速修复。我不是 Excel 高手,但它似乎工作正常。更改底部数字应反映您首选的缩放比例。
ActiveWindow.Zoom = 100
ActiveWindow.Zoom = 90
在网上搜索后,最好的解决方案是将文件保存为 .xlsb (二进制)而不是 .xlsm
不久前我开始做的是有一个单独的 sub 来设置我所有控件的大小。然后,我可以从代码中控件增长或缩小的任何位置运行此子程序。有时这是很多额外的挑剔工作,但它可以防止我的按钮吃掉我的电子表格。
我没有对此进行测试,但我想这与 zoom 属性有关(可能是 add activewindow.Zoom = false
)。
也可以对.Placement = xlMove
在 workbook_open 和 window_activate 上定义的形状进行循环,这是为了防止形状随单元格调整大小(但会随它们移动)。
我正在使用 excel 2013,从来没有遇到过这个问题,我也从不远程使用它......,只是想帮助一些小想法
我可能找到了解决方法:“确保工作表上的所有形状都有唯一的名称”(包括复选框/单选按钮(OLE 控件)以及图片和其他形状类型...)
因为问题是间歇性的,我不能保证这一点。我现在有两个表格使用此修复程序可以正常工作,但“两个”是一个非常小的样本集,可能只是巧合。无论如何,这些是我采取的步骤:
我在一张空白表 (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”的所有形状。“右下单元格”可帮助您在工作表上找到形状:通过选择形状重命名,然后在 Excel 左上角的名称/引用框中输入新的唯一值。
此形状列表还有助于找到一些长期被遗忘和未使用的“死”形状(0 高度或 0 宽度)。
我希望这对你有用!就此而言......我希望它适用于我未来的事件......
如果您不想显示按钮来回移动,您可以将原始位置放入您的代码中,然后检查这些。单击按钮时关闭屏幕更新,检查控件上的位置是否不同,将其更改回来,如果需要,重新打开屏幕更新
DP
在尝试了这篇文章和相关文章的许多解决方案后,我发现微软发布的另一个问题的解决方案在以特定方式应用时也能可靠地解决这个特定问题,至少在我工作的环境中是这样。每当我切换到非本机分辨率时,我都会在我们这里的笔记本电脑和 PC 上的本机分辨率中遇到这些问题。即,按钮以大于正常大小加载,单击时变大,并且这些按钮中的文本和图像缩小(至少文本的设置保持不变,所以我看不到任何方式以编程方式将其更改回来或其他。)在我的情况下,这些不是间歇性问题。尽管在使用 Microsoft 已发布解决方案的打印预览后,我遇到了间歇性问题在这里。我已经尝试过了,它似乎正在工作。
解决方案:对于 Excel,关闭应用程序并在您想要查看按钮的分辨率中删除 MSForms.exd 文件C:\Users{UserName}\AppData\Local\Temp\Excel8.0
。您还可以在本地 AppData\Temp 文件夹中搜索其他 .exd 文件以查找其他 Office 应用程序.
正如我所提到的,这是 Microsoft 针对另一个问题提出的解决方案 - 在安装 14 年 12 月更新后按钮停止工作。这是该文章的链接。在这种情况下,这是一次性修复。在这里,您可能需要在每次更改分辨率时都执行此操作。
对控件进行分组似乎对我有用。我会投票或发表评论,但不会让我这样做。请注意,如果您使用 W8 显示缩放并拥有高分辨率笔记本电脑和较旧的显示器,则此问题经常出现。
我在所有对象(按钮、文本框等)中都发现了这个问题。当我打印/打印预览多张工作表时,除了序列中的第一个工作表之外的所有工作表都已移动或调整大小的对象。经过多次测试,最简单的解决方案是放大或缩小页面并返回原始设置。
我也遇到了 ActiveX 列表框的问题,并在其他地方找到了以下内容,它似乎到目前为止工作,而且它似乎也是迄今为止最简单的解决方案,在将电子表格交给其他人时转移:
“虽然 ListBox 有一个 IntegralHeight 属性,其 FALSE 设置的副作用将使该控件不会歪斜,而命令按钮具有诸如移动/调整单元格等属性,其他控件就没有那么优雅了。”
我发现问题似乎只在打开冻结窗格时发生,这通常在大多数应用程序中都会打开,因为您会将命令按钮等放置在它们不会滚动到视野之外的位置。
可行的解决方案是对控件进行分组,同时确保该组超出冻结窗格区域。我通过在冻结窗格区域之外添加一个控件来做到这一点,将其添加到组中,但同时隐藏控件,以便您看不到它。
现在使用 Excel 2013,每次我在 Excel 运行时扩展我的显示时都会发生这种情况(以及每次我删除扩展名时)。
我已经开始实施的修复是使用超链接而不是按钮和一个打开所有其他 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
我找到了一个可行的修复程序,并解决了单个用户的问题。如果您不想阅读我的小吐槽,可以直接跳到解决方案。
咆哮:
自恐龙时代以来,我一直在经历这个愚蠢的问题。与此同时,微软拥有大量资源来发布 Office 套件的无数重大更新,但这个问题仍未得到解决。这绝对令人愤怒。当像这样的基本东西不起作用时,我没有任何理由升级。肯定有人在 MS 中在高分辨率显示器上使用 Excel 中的 ActiveX 控件,不是吗?
我在我的台式电脑上没有遇到这个问题,不知道为什么,但是在我的 Surface Pro 4 上,我的 ActiveX 控件在我单击它们时就会变成香蕉。
今天我决定把这件事弄清楚。我搜索了高低,尝试了各种论坛上提出的每一个解决方案(顺便说一句,它们都不起作用)。控件是否分组,是否锁定,是否安装了修补程序都没有关系。
昨天我在另一个名为 Traktor(DJ 软件)的应用程序中遇到了另一个问题,当显示缩放设置为不是 100% 的精确倍数时,控件会跳来跳去。一位用户发现解决方案是编辑此应用程序的兼容模式。所以我对 Excel 做了同样的事情,它奏效了!现在,无论显示分辨率和缩放比例如何,我的控件都保持不变。
解决方案:
(确保 Excel 未运行)
现在 Excel 将以其原始分辨率运行,ActiveX 控件不会出错。唯一的缺点是 Excel 不会响应屏幕缩放,因此看起来可能比人们想要的要小一些。在我的 Surface Pro 4 上是完全可以接受的
笔记:
1) Excel 2016 需要步骤 2 和 6,因为 EXCEL.EXE 的“属性”对话框不提供“兼容性”选项卡。重命名后,选项卡变为可用。
2)此解决方案仅适用于单个用户。也就是说,如果您将包含 ActiveX 控件的 Excel 文件发送给您的同事,除非他们更改兼容模式设置,否则 ActiveX 控件将无法在他们的系统上正确显示。
3)应用此 hack 后,以前损坏的 Excel 文件在您打开它们时似乎会自行修复,所有控件都会恢复其原始预期尺寸。
请测试和评论,我希望这可以帮助某人,干杯!
我有时也有同样的问题。就我而言,我可以在一个文件上 100% 复制它,但在几乎相同的文件上却不一致。我还发现大小错误不是永久性的——我可以保存并重新打开文件以恢复按钮的外观。我还可以创建一个新窗口,然后丢弃损坏的窗口。我使用单显示器配置。
对我来说,当我访问工作表的HPageBreaks集合时,按钮会调整大小。我可以通过临时更改窗口视图来避免这个问题,如下所示:
ActiveWindow.View = xlPageBreakPreview
' do pagination stuff using HPageBreaks
ActiveWindow.View = xlNormalView
其中一些问题可能是由于控件在填充时自行调整大小。我倾向于将控件(例如列表框) 的IntegralHeight属性从 True(默认)设置为 False,以防止在运行时自动调整控件高度的大小。
尽管这种行为显然有很多原因,但有几个答案指出了缩放和屏幕分辨率的问题。一种解决方法是使用以下函数来调整控件的大小并将其锚定到特定单元格:
Sub ResizeCombo(ByRef cbo As Shape, ByVal rw As Long, ByVal cl As Long, ByVal wid As Long)
cbo.Height = Intake.Cells(rw, cl).Height - 1
cbo.Top = Intake.Cells(rw, cl).Top + 1
cbo.Left = Intake.Cells(rw, cl).Left + 1
cbo.Width = wid
End Sub
Sub ResizeCheckbox(ByRef cbo As Shape, ByVal rw As Long, ByVal cl As Long)
cbo.Height = Intake.Cells(rw, cl).Height - 1
cbo.Top = Intake.Cells(rw, cl).Top + 1
cbo.Left = Intake.Cells(rw, cl).Left + 6
cbo.Width = Intake.Cells(rw, cl).MergeArea.Width - 7
End Sub
Sub ResizeCombos()
ResizeCombo Intake.Shapes("School"), 11, 1, 144
ResizeCheckbox Intake.Shapes("cbReading"), 70, 1
''ResizeCombo also works for option buttons
ResizeCombo Intake.Shapes("obGenderMale"), 20, 8, 45
ResizeCombo Intake.Shapes("obGenderFemale"), 20, 9,50
但是,最近这种解决方法停止了工作。几天来我一直在反对它,直到我发现工作表的缩放级别已调整为 105%!将其重置为 100% 即可解决问题。但是,如果用户需要更高的缩放级别怎么办?我发现我可以在调整大小后更改缩放,并且事情会保持原状。我的调用函数现在看起来像这样:
Sub refresh()
OldZoom = ActiveWindow.Zoom
ActiveWindow.Zoom = 100
Call ResizeCombos
ActiveWindow.Zoom = OldZoom
End Sub
到目前为止,它正在工作!
我们也有这个问题。我不记得究竟是什么修复了,因为我们现在按预期运行......尝试对控件进行分组。我认为这是我们的决议。