偶尔,我会遇到一个电子表格,其中包含一些神奇的按钮或下拉框,随着时间的推移它们变得越来越大或越来越小。
代码中没有任何指示。
还有其他人经历过这种“乐趣”吗?
偶尔,我会遇到一个电子表格,其中包含一些神奇的按钮或下拉框,随着时间的推移它们变得越来越大或越来越小。
代码中没有任何指示。
还有其他人经历过这种“乐趣”吗?
问题似乎与Windows处理显示器上的非本地分辨率有关,可以通过多种方式避免该问题
当此问题发生时,这可能会成为一场完全的噩梦,但它只是间歇性的。
我们最近在测试由几十个人使用的Excel工作表,并已经了解了该问题的原因和一些可能的解决方法。
该问题似乎与任何屏幕在非本地分辨率中使用的设置有关。如果用户将外部显示器插入笔记本电脑并未仔细选择所得到的屏幕配置,这很容易发生。例如,如果将笔记本电脑插入投影仪(可能是具有本地1024 x 768显示器的旧型号),但笔记本电脑的分辨率为1280 x 800,且用户选择“复制”显示而不是“扩展”显示(在Windows 7中的“连接到投影机”或“显示”控制面板中的设置),结果是两个屏幕都以非本地分辨率显示,这将导致两个屏幕的图像不可预测且通常不满意。我们发现这些设置几乎总是会导致Excel按钮的严重问题,特别是ActiveX控件。有时,在重复点击时,它们会缩小到无法读取的大小;其他时候,它们会扩展到覆盖整个屏幕。
通常,当我们指示用户使用“扩展”显示设置,并且结果是两个屏幕都使用本地分辨率时,我们就不会看到这个问题。
还有一些基于代码的方法可以将此问题最小化。我们尝试在单击按钮和控件时重置它们的位置和大小(如果您有很多按钮,则会增加很多繁琐的代码)。这有时有效。我们还尝试切换自动调整大小属性从true到false,再从false到true(在开发者模式下手动进行此操作),这会修复更多实例,但似乎不能解决所有问题。
Width
属性设置为.Width + 1
,然后立即设置为.Width - 1
。当你点击时,控件会缩小,但在你点击其他地方后又会自动恢复原状。 - nhinkle.Width = .Width
。 - Ron Rosenfeld发现问题的原因是人们在通过远程桌面访问的机器上打开电子表格,本地和远程机器之间存在屏幕分辨率差异。这会影响控件工具箱中可用的控件,但尚未使用传统的表单按钮控件遇到这个问题,所以我不满意的答案是使用它。
或者第二种情况是:“在查看Excel 2010工作表的打印预览后,一个ActiveX按钮大小变小了”,则您需要:
祝您好运。这个问题真是太麻烦了...
这个问题实际上是由屏幕分辨率引起的。最常见的情况是用户在使用Excel应用程序时连接到投影仪或WebEx。
解决此问题的简单方法是要求用户在没有任何外围连接(投影仪)的情况下重新启动计算机,然后再次打开Excel应用程序。
之前讨论的解决方案,即在单击事件后以编程方式调整/重新定位Active X控件或修改注册表(使用D word LegacyAnchorResize),对我在Excel 2010 / Windows 7 64位中无法解决问题。
对于我来说,解决方案在这里找到:https://support.microsoft.com/en-us/kb/838006
对于Excel 2010,该链接指示执行以下操作:
我发现这些答案都没有将控件锚定到特定的行和列。这对我来说非常干净,因为行/列往往比监视器的分辨率更可预测。
下面的示例基本上“测量”对象应该放在哪里,然后在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
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
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
尝试使用右下方的滑块将缩放设置更改为100%。对于我不同大小的两个监视器都起作用。