VBA Excel按钮在点击后调整大小(命令按钮)

20

如何防止按钮重新调整大小?每次单击按钮时,按钮的大小或字体大小都会更改。

注意:我无法锁定工作表,因为我的宏将写入该工作表。

已关闭自动调整大小。我在Windows 7(64位)上运行Excel 2007。


为什么不能锁定工作表?你应该能够使用VBA来执行此任务。Sheet.Protect/Sheet.Unprotect(还可以传递可选密码变量)。 - Gaffi
1
问题并不是通过锁定解决的,因为原因似乎是Windows而不是Excel。请参阅此处类似问题的答案:https://dev59.com/v3I_5IYBdhLWcg3wAd82 - matt_black
14个回答

6
我在ListBox中使用以下代码。对于按钮的操作原理也是相同的,只需根据需要进行适当调整。
Private Sub myButton_Click()
    Dim lb As MSForms.ListBox
    Set lb = Sheet1.myListBox

    Dim oldSize As ListBoxSizeType
    oldSize = GetListBoxSize(lb)

    ' Do stuff that makes listbox misbehave and change size.
    ' Now restore the original size:
    SetListBoxSize lb, oldSize
End Sub

这里使用以下类型和过程:

Type ListBoxSizeType
    height As Single
    width As Single
End Type

Function GetListBoxSize(lb As MSForms.ListBox) As ListBoxSizeType
    GetListBoxSize.height = lb.height
    GetListBoxSize.width = lb.width
End Function

Sub SetListBoxSize(lb As MSForms.ListBox, lbs As ListBoxSizeType)
    lb.height = lbs.height
    lb.width = lbs.width
End Sub

6
我在 onClick 的结尾添加了一些代码,如下所示:
CommandButton1.Width = 150
CommandButton1.Height = 33
CommandButton1.Font.Size = 11

看起来可以工作。

我以稍微不同的方式遇到了这个问题。通过在我的主要笔记本电脑显示器上打开工作簿,然后将其移动到我的大型监视器上。我想应该是相同的根本原因。


这是一个好想法。我的问题是,随着点击问题的累积,我不得不设置 Font.Size = 200 才能看到文本。我对微软并不印象深刻,因为这个问题似乎已经存在了几年。 - Holene
如果我使用一个ActiveX控件,你的代码可以工作。相反,如果我使用一个形状(例如圆形、正方形)并为其分配一个宏,你的代码就无法工作。我曾经用形状名称(例如rectangle2)替换了CommandButton1,但它仍然不起作用。你能帮我解决吗?谢谢。 - Marco

5

我看到过这个问题在Excel 2007、2010和2013中出现。

以下代码可以防止该问题的发生。每当一个Active X对象被激活时,需要运行该代码。

Sub Shared_ObjectReset()

    Dim MyShapes As OLEObjects
    Dim ObjectSelected As OLEObject

    Dim ObjectSelected_Height As Double
    Dim ObjectSelected_Top As Double
    Dim ObjectSelected_Left As Double
    Dim ObjectSelected_Width As Double
    Dim ObjectSelected_FontSize As Single

    ActiveWindow.Zoom = 100

    'OLE Programmatic Identifiers for Commandbuttons = Forms.CommandButton.1
    Set MyShapes = ActiveSheet.OLEObjects
    For Each ObjectSelected In MyShapes
        'Remove this line if fixing active object other than buttons
        If ObjectSelected.progID = "Forms.CommandButton.1" Then
            ObjectSelected_Height = ObjectSelected.Height
            ObjectSelected_Top = ObjectSelected.Top
            ObjectSelected_Left = ObjectSelected.Left
            ObjectSelected_Width = ObjectSelected.Width
            ObjectSelected_FontSize = ObjectSelected.Object.FontSize

            ObjectSelected.Placement = 3

            ObjectSelected.Height = ObjectSelected_Height + 1
            ObjectSelected.Top = ObjectSelected_Top + 1
            ObjectSelected.Left = ObjectSelected_Left + 1
            ObjectSelected.Width = ObjectSelected_Width + 1
            ObjectSelected.Object.FontSize = ObjectSelected_FontSize + 1

            ObjectSelected.Height = ObjectSelected_Height
            ObjectSelected.Top = ObjectSelected_Top
            ObjectSelected.Left = ObjectSelected_Left
            ObjectSelected.Width = ObjectSelected_Width
            ObjectSelected.Object.FontSize = ObjectSelected_FontSize

        End If
    Next

End Sub

1
看起来您忘记格式化示例中的所有代码。从 Sub Shared_ObjectReset() 开始,到 EndSub 结束。 - nicorellius
最好的答案,解决了所有问题。谢谢它,我测试了一下,它立即将所有对象调整到我手动定义的比例。 - Gabz

4

(Excel 2003)

在我看来,有两个不同的问题: - 点击一个按钮时(虽然不是每次都会发生,但不知道为什么),文本大小会调整; - 当在分辨率不同的显示器上打开工作簿时,所有按钮的大小都会改变(即使回到初始显示器上也是如此)。

至于单个调整大小的问题:我发现只需要修改一个按钮的尺寸就可以“恢复”它。 例如:

 myButton.Height = myButton.Height + 1
 myButton.Height = myButton.Height - 1

您可以将它放在每个按钮的点击子程序(“myButton_Click”)中,或者为“onClick”事件实现一个自定义类。

0

打印后我的大小改变了,更改缩放比例重新绘制屏幕并修复了它

ActiveWindow.Zoom = 100
ActiveWindow.Zoom = 75

0

在一些沮丧的尝试之后,以下代码帮助我解决了这个Excel/VBA的bug。 需要注意的两个关键点是:

  • 虽然其他人建议更改大小,然后立即将其更改回来,但请注意,此代码避免在单个切换状态更改中多次更改它。如果值在一个事件状态更改期间更改两次(特别是如果第二个值与初始值相同),则可能永远不会将备用宽度和高度属性应用于控件,这将不会重置控件的宽度和高度,以防止宽度和高度值减小。
  • 我使用硬编码值来设置宽度和高度。这并不理想,但我发现这是防止控件在被点击多次后缩小的唯一方法。

私有子过程ToggleButton1_Click() '注意:初始高度为133.8,初始宽度为41.4
如果ToggleButton1.Value = True Then ' [我想在用户单击控件并切换状态为true时运行的代码(与此问题无关)] '当切换值为true时,只需将宽度和高度值更改为特定值,而不是它们的初始值。
ToggleButton1.Height = 40.4 ToggleButton1.Width = 132.8 Else ' [我想在用户单击控件并切换状态为false时运行的代码(与此问题无关)] '当切换值为false时,调整为备用宽度和高度值。 '只要它们在单独的条件语句中,这些值可以与初始值相同。 ToggleButton1.Height = 41.4 ToggleButton1.Width = 133.8 End If End Sub

对于不切换的控件,您可以使用迭代变量或其他方法来确保宽度和高度属性在两个类似的值集之间交替,这将产生类似于我在此情况下使用的切换状态更改的效果。


0

虽然这是一个老问题,但对于那些被困在Excel 2007上的人来说,仍然似乎是个问题。我在ActiveX Listbox Object上遇到了同样的问题,并且每次重新计算时都会扩展其大小。LinkCells属性正在寻找其值的动态(偏移)范围。重构使其寻找正常范围可以解决我的问题。


0
发现Excel 2016也有同样的问题 - 可以通过更改控制按钮的高度,然后再将其改回来,并选择工作表上的单元格来进行修正。仅仅调整大小并不总是有效。以下是一个命令按钮(cmdBALSCHED)的示例:
Public Sub cmdBALSCHED_Click()

Sheet3.cmdBALSCHED.Height = 21
Sheet3.cmdBALSCHED.Height = 20
Sheet3.Range("D4").Select

这将重置高度为20,按钮字体恢复为原始状态。


0
我在Excel中使用ActiveX按钮和旋转控件时遇到了同样的问题,它们会改变大小并移动位置。这是一个共享电子表格,在几台不同的PC、笔记本电脑和屏幕上使用。由于它是共享的,我无法使用宏来在代码中自动重新定位和调整大小。
最终,在寻找解决方案并尝试了所有可能的按钮设置后,我发现将这些按钮分组可以立即解决问题。控件、按钮和旋转控件都保持在原位。我已经测试了一周,没有问题。只需选择控件,右键单击并分组 - 就像魔术一样。

对我来说,它没有解决问题。 - undefined

0

当Excel已经打开后,屏幕分辨率/设置更改时会发生这种情况。

例如:

  1. 打开一个带有按钮的工作簿
  2. 使用具有不同屏幕大小的计算机从远程桌面登录
  3. 单击按钮 => 按钮大小将更改

我找到的唯一解决方案是关闭Excel并使用新的屏幕设置重新打开它。必须关闭所有Excel实例,包括由其他进程执行的任何不带界面的隐藏实例都必须被终止。


在我的情况下,尽管这至少部分与使用不同分辨率的屏幕有关,但此问题不需要在打开Excel之后更改分辨率。在Windows 10上的Excel 2007中,当我开始使用外部显示器时,此问题确实出现了,但我从未在打开Excel后切换监视器或更改分辨率。外部显示器已连接(并且Windows设置为“仅外部屏幕”,因此仅使用外部显示器),打开Excel,允许宏,单击任何按钮,它会缩小大小和字体。 - SantiBailors

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