Excel:不可思议的缩放控件

67

偶尔,我会遇到一个电子表格,其中包含一些神奇的按钮或下拉框,随着时间的推移它们变得越来越大或越来越小。

代码中没有任何指示。

还有其他人经历过这种“乐趣”吗?


我曾经看到这种行为,尤其是在单选按钮缩小时,但从未理解为什么会发生,为什么只有有时会发生,或者如何修复它。只是假定它是一个错误。 - Lunatik
1
潜在问题与以下其他问题相同:http://stackoverflow.com/questions/9518002/excel-vba-combobox-dropdown-button-size-changed-itself;https://dev59.com/c2kw5IYBdhLWcg3w4eiS - matt_black
5
+1,但是,这不应该放在Super User SE上吗? - JMCF125
1
在使用 Excel 2016 几个月后,我遇到了这个问题,并在此线程中找到了解决方法。回答中描述的各种情况似乎都不适用于我的情况。但最终起作用的是在按钮代码开头插入一行代码 "button".width = "button".width。 - Ron Rosenfeld
4
这是由于缩放级别计算错误造成的。如果您不使用缩放(100%),则不会发生这种情况。如果使用 VBA 改变任何元素的大小,建议将缩放设置为 100%,调整大小,然后再设置回之前的缩放级别。非常有效。 - cyberponk
显示剩余2条评论
34个回答

39

问题似乎与Windows处理显示器上的非本地分辨率有关,可以通过多种方式避免该问题

当此问题发生时,这可能会成为一场完全的噩梦,但它只是间歇性的。

我们最近在测试由几十个人使用的Excel工作表,并已经了解了该问题的原因和一些可能的解决方法。

该问题似乎与任何屏幕在非本地分辨率中使用的设置有关。如果用户将外部显示器插入笔记本电脑并未仔细选择所得到的屏幕配置,这很容易发生。例如,如果将笔记本电脑插入投影仪(可能是具有本地1024 x 768显示器的旧型号),但笔记本电脑的分辨率为1280 x 800,且用户选择“复制”显示而不是“扩展”显示(在Windows 7中的“连接到投影机”或“显示”控制面板中的设置),结果是两个屏幕都以非本地分辨率显示,这将导致两个屏幕的图像不可预测且通常不满意。我们发现这些设置几乎总是会导致Excel按钮的严重问题,特别是ActiveX控件。有时,在重复点击时,它们会缩小到无法读取的大小;其他时候,它们会扩展到覆盖整个屏幕。

通常,当我们指示用户使用“扩展”显示设置,并且结果是两个屏幕都使用本地分辨率时,我们就不会看到这个问题。

还有一些基于代码的方法可以将此问题最小化。我们尝试在单击按钮和控件时重置它们的位置和大小(如果您有很多按钮,则会增加很多繁琐的代码)。这有时有效。我们还尝试切换自动调整大小属性从true到false,再从false到true(在开发者模式下手动进行此操作),这会修复更多实例,但似乎不能解决所有问题。


1
重置控件的大小和位置?现在就射我吧!将代码放在标准模块中而不是工作表中作为单击事件,这种权衡让我感到更加快乐。我只有在需要更改按钮文本或类似情况时才使用ActiveX控件。 - Nick
2
@Nick,我刚刚通过为有问题的复选框设置一个OnClick事件来完成这个操作,该事件只是将控件的Width属性设置为.Width + 1,然后立即设置为.Width - 1。当你点击时,控件会缩小,但在你点击其他地方后又会自动恢复原状。 - nhinkle
4
我发现在按钮的代码中也可以使用.Width = .Width - Ron Rosenfeld
这是非常有用的信息。在我的情况下,它发生在复选框控件上;当我在投影仪或另一个显示器上复制我的屏幕时。 - Jaqen H'ghar

12

发现问题的原因是人们在通过远程桌面访问的机器上打开电子表格,本地和远程机器之间存在屏幕分辨率差异。这会影响控件工具箱中可用的控件,但尚未使用传统的表单按钮控件遇到这个问题,所以我不满意的答案是使用它。


很不幸,我也遇到了类似的问题,即使使用旧按钮也是如此。按钮会重新定位并缩小约一半。当人们拆下笔记本电脑时,屏幕大小会发生变化,从而导致错误发生。我想唯一的解决方案是使用图像作为可点击项,以打开带有其余控件(即控制面板)的单独表单。 - Ole Henrik Skogstrøm
嗨,我也曾经因为远程桌面连接遇到过完全相同的问题。这真的很烦人,因为你必须手动更改ActiveX按钮的大小。 - Wheeliam

7
这个问题困扰我多年,时有发生。虽然有许多解决方法,但它们似乎都不是很可靠。在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按钮后,它会更改为不正确的大小”,则应执行以下操作:
  • 单击“开始”,单击“运行”,在打开框中键入regedit,然后单击“确定”。
  • 定位并选择以下注册表子键HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\Options
  • 在“编辑”菜单上,指向“新建”,然后单击“DWORD值(32位)”。
  • 键入LegacyAnchorResize,然后按Enter键。
  • 在详细信息窗格中,右键单击LegacyAnchorResize,然后单击“修改”。
  • 在“数值数据”框中,键入1,然后单击“确定”。
  • 退出注册表编辑器。
或者其次,如果您的症状是“在Excel 2010中预览工作簿后,按钮形式控件显示不正确”,则应执行以下操作:
  • 单击开始,单击运行,在“打开”框中键入regedit,然后单击确定。
  • 定位并选择以下注册表子键:HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\Options
  • 在“编辑”菜单上,指向“新建”,然后单击“DWORD值(32位)”。
  • 键入MultiSheetPrint,然后按Enter。
  • 在“详细信息”窗格中,右键单击MultiSheetPrint,然后单击“修改”。
  • 在“数值数据”框中键入1,然后单击确定。
  • 再次选择以下注册表子键:HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\Options
  • 在“编辑”菜单上,指向“新建”,然后单击“DWORD值(32位)”。
  • 键入LegacyAnchorResize,然后按Enter。
  • 在“详细信息”窗格中,右键单击LegacyAnchorResize,然后单击“修改”。
  • 在“数值数据”框中键入1,然后单击确定。
  • 退出注册表编辑器。

或者第二种情况是:“在查看Excel 2010工作表的打印预览后,一个ActiveX按钮大小变小了”,则您需要:

  • 单击开始,单击运行,在“打开”框中键入regedit,然后单击确定。
  • 定位并选择以下注册表子键:HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\Options
  • 在“编辑”菜单上,指向“新建”,然后单击“DWORD值(32位)”。
  • 键入LegacyAnchorResize,然后按Enter。
  • 在“详细信息”窗格中,右键单击LegacyAnchorResize,然后单击“修改”。
  • 在“数值数据”框中键入1,然后单击确定。
  • 退出注册表编辑器。

祝您好运。这个问题真是太麻烦了...


5

这个问题实际上是由屏幕分辨率引起的。最常见的情况是用户在使用Excel应用程序时连接到投影仪或WebEx。

解决此问题的简单方法是要求用户在没有任何外围连接(投影仪)的情况下重新启动计算机,然后再次打开Excel应用程序。


4

之前讨论的解决方案,即在单击事件后以编程方式调整/重新定位Active X控件或修改注册表(使用D word LegacyAnchorResize),对我在Excel 2010 / Windows 7 64位中无法解决问题。

对于我来说,解决方案在这里找到:https://support.microsoft.com/en-us/kb/838006

对于Excel 2010,该链接指示执行以下操作:

  1. 退出所有正在运行的程序。
  2. 单击“开始”按钮,单击“运行”,在“打开”框中键入regedit,然后单击“确定”。
  3. 查找并单击以下注册表项:
  4. HKEY_CURRENT_USER\Software\microsoft\office\14.0\common
  5. 在“编辑”菜单上,指向“新建”,然后单击“项”。
  6. 输入Draw,然后按Enter。
  7. 在“编辑”菜单上,指向“新建”,然后单击“DWORD值”。
  8. 输入UpdateDeviceInfoForEmf,然后按Enter。
  9. 右键单击UpdateDeviceInfoForEmf,然后单击“修改”。 10.在“数值数据”框中,输入1,然后单击“确定”。
  10. 单击“文件”菜单,单击“退出”以关闭注册表编辑器。

2

我发现这些答案都没有将控件锚定到特定的行和列。这对我来说非常干净,因为行/列往往比监视器的分辨率更可预测。

下面的示例基本上“测量”对象应该放在哪里,然后在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

结果将如下所示:

enter image description here


2
我的显示器都似乎设置为本机分辨率,这加深了神秘感。然而,我发现对按钮进行某些操作(移动或调整大小)可以解决问题。此例程自动化了移动操作,然后恢复原始设置。
以下代码似乎至少可以解决按钮的问题。
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

我喜欢在属性窗口中习惯性地设置.TakeFocusOnClick = False的想法。+1 - Nick

2

这个问题非常令人沮丧,我的经验是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

1
我们刚刚通过为所有宏启用的工作簿添加以下模块来解决了这个问题:
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

1

尝试使用右下方的滑块将缩放设置更改为100%。对于我不同大小的两个监视器都起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接