【问题标题】:VBA Excel Button resizes after clicking on it (Command Button)VBA Excel 按钮在单击后调整大小(命令按钮)
【发布时间】:2012-03-23 18:52:02
【问题描述】:

如何阻止按钮调整大小?每次单击按钮时,按钮的大小或字体大小都会发生变化。

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

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

【问题讨论】:

  • 为什么不能锁定工作表?您应该能够使用 VBA 来执行此任务。 Sheet.Protect/Sheet.Unprotect(您也可以传递一个可选的密码变量)
  • 锁定不能解决问题,因为原因似乎是 Windows 不擅长。在此处查看类似问题的答案:stackoverflow.com/q/1573349/1047635

标签: excel vba button resize


【解决方案1】:

我将以下内容用于列表框。按钮的原理相同;酌情调整。

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

【讨论】:

    【解决方案2】:

    我在onClick 的末尾添加了一些代码,因此:

    CommandButton1.Width = 150
    CommandButton1.Height = 33
    CommandButton1.Font.Size = 11
    

    似乎有效。

    我以稍微不同的方式解决了这个问题。通过在我的主要笔记本电脑显示器上打开工作簿,然后将其移动到我的大显示器上。我假设的根本原因相同。

    【讨论】:

    • 这是个好主意。我的问题是,随着点击问题的累积,我必须设置Font.Size = 200 才能看到文本。我对微软没有印象深刻,因为这个问题似乎已经存在好几年了。
    • 如果我使用 ActiveX 控件,您的代码可以工作。相反,如果我使用一个形状(例如,圆形、方形)并为其分配一个宏,您的代码将不起作用。我确实用形状名称(例如,rectangle2)替换了 CommandButton1,但它不起作用。你能帮我吗?谢谢。
    【解决方案3】:

    在 Excel 2007、2010 和 2013 中看到此问题

    此代码可防止问题出现。每次激活活动 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
    

    【讨论】:

    • 您似乎忘记格式化示例中的所有代码。以Sub Shared_ObjectReset() 开头,以EndSub 结尾。
    • 最佳答案,解决所有问题。感谢它,我进行了测试,它立即将所有对象的大小调整为我手动定义的方面。
    【解决方案4】:

    (Excel 2003)

    在我看来有两个不同的问题: - 单击 ONE 按钮时调整其文本大小(尽管并非总是如此,不知道为什么),以及 - 在具有不同分辨率的显示器上打开工作簿时更改所有按钮的大小(即使回到初始显示器上仍然存在)。

    至于个别调整大小问题:我发现修改按钮的一维以“恢复”它就足够了。 如:

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

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

    【讨论】:

      【解决方案5】:

      我在 Excel 调整大小和移动时遇到了 ActiveX 按钮和旋转的相同问题。这是在几台不同 PC 的笔记本电脑和屏幕上使用的共享电子表格。由于它是共享的,因此我无法使用宏在代码中自动重新定位和调整大小。

      最终在寻找解决方案并尝试了所有可能的按钮设置之后。我发现对按钮进行分组可以立即解决问题。控件、按钮、微调器都保持在原位。我已经测试了一周,没有任何问题。只需选择控件,右键单击并分组 - 就像魔术一样工作。

      【讨论】:

        【解决方案6】:

        使用表单按钮而不是 ActiveX 按钮,ActiveX 控件在工作表上随机出现行为异常

        【讨论】:

        • 他使用的是 ActiveX 按钮吗?我以前见过一次这个问题(我相信最终将所有内容都移到了新工作表上),而没有使用 ActiveX 按钮。
        【解决方案7】:

        按钮宏中有选择命令吗?

        在我重命名工作表中的某些单元格(包括切换按钮在其切换功能后选择的单元格)后不久,字体大小缩小了。我通过确保 Range("...").Select 包含新的单元格名称而不是坐标来解决此问题。

        【讨论】:

          【解决方案8】:

          在打开 Excel 后屏幕分辨率/设置发生变化时会发生这种情况。

          例如:

          1. 打开一个上面有按钮的工作簿
          2. 从具有不同屏幕尺寸的计算机使用远程桌面登录
          3. 点击按钮 => 按钮大小会改变

          我找到的唯一解决方案是关闭 Excel 并使用新的屏幕设置重新打开它。 Excel的所有实例都必须关闭,包括其他进程没有接口执行的不可见实例必须被杀死。

          【讨论】:

          • 在我的例子中,虽然它至少部分与使用不同分辨率的屏幕有关,但这个问题不需要在打开 Excel 后更改分辨率。 Windows 10 上的 Excel 2007,当我开始在笔记本电脑上使用外接显示器时,这个问题确实开始了,但在打开 Excel 后我从未切换显示器或更改分辨率。插入外接显示器(Windows 设置为“仅外接屏幕”,因此只使用外接显示器),打开 PC,打开 Excel,允许宏,单击任意按钮,它的大小和字体都会缩小。
          【解决方案9】:

          旧问题,但对于我们这些停留在 Excel 2007 上的人来说似乎仍然是一个问题。在 ActiveX 列表框对象上遇到同样的问题,并且在每次重新计算时都会扩大其大小。 LinkCells 属性正在寻找其值的动态(偏移)范围。重组以使其处于正常范围内解决了我的问题。

          【讨论】:

            【解决方案10】:

            我在使用 Excel 2013 时遇到了这个问题。在很长一段时间内一切正常,突然之间,当我点击按钮 (ActiveX) 时,它变大了,同时字体变小了。

            没有保存文件,我重新启动计算机并再次打开同一个 Excel 文件,一切都再次正常。

            【讨论】:

              【解决方案11】:

              我在打印和更改缩放后调整大小重新绘制屏幕并修复它

              ActiveWindow.Zoom = 100
              ActiveWindow.Zoom = 75
              

              【讨论】:

                【解决方案12】:

                在 Excel 2016 中发现了同样的问题 - 能够通过更改控制按钮的高度、将其改回,然后在工作表上选择一个单元格来进行纠正。只是调整大小并不能始终如一地工作。下面的命令按钮示例 (cmdBALSCHED)

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

                这会将高度重置为 20,并将按钮字体重置为找到的值。

                【讨论】:

                  【解决方案13】:

                  经过一番沮丧的摆弄后,以下代码帮助我解决了这个 Excel/VBA 错误。 需要注意的两个关键事项可能会有所帮助:

                  • 尽管其他人建议更改大小,然后立即将其改回,但请注意,此代码避免在单个切换状态更改时多次更改它。如果在一次事件状态更改期间值更改两次(特别是如果第二个值在初始值时相同),则可能永远不会将备用宽度和高度属性应用于控件,这不会将控件宽度和高度重置为它需要防止宽度和高度值减小。
                  • 我对宽度和高度使用了硬编码值。这并不理想,但我发现这是防止控件在多次单击后收缩的唯一方法。
                  私人子 ToggleButton1_Click() '注意:初始高度为 133.8,初始宽度为 41.4 如果 ToggleButton1.Value = True 那么 ' [当用户单击控件和切换状态时我想要运行的代码为真(与此问题无关)] '当切换值为真时,只需将宽度和高度值更改为初始值以外的特定值。 ToggleButton1.Height = 40.4 ToggleButton1.Width = 132.8 别的 ' [当用户单击控件并切换状态为 false 时我想要运行的代码(与此问题无关)] '当切换值为假时,调整为备用宽度和高度值。 '这些可以与初始值相同,只要它们在单独的条件语句中即可。 ToggleButton1.Height = 41.4 ToggleButton1.Width = 133.8 万一 结束子

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

                  【讨论】:

                    猜你喜欢
                    • 2013-02-11
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-02-11
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-06-11
                    相关资源
                    最近更新 更多