Размер кнопки VBA Excel после нажатия на нее изменяется (кнопка Command) - PullRequest
14 голосов
/ 06 марта 2012

Как я могу остановить изменение размера кнопки? Каждый раз, когда я нажимаю на кнопку, изменяется размер кнопки или размер шрифта.

Примечание. Я не могу заблокировать свой лист, поскольку мой макрос будет записывать в него.

Авторазмер выключен. Я запускаю Excel 2007 в Windows 7 (64-разрядная версия).

Ответы [ 13 ]

6 голосов
/ 07 марта 2012

Я использую следующее для ListBoxes.Тот же принцип для кнопок;адаптируйте соответствующим образом.

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
4 голосов
/ 07 сентября 2015

Я добавил некоторый код в конец onClick, таким образом:

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

Кажется, работает.

Я получил проблему немного по-другому.Открыв книгу на моем основном дисплее ноутбука, затем переместив ее на мой большой монитор.Та же самая основная причина, я бы предположил.

1 голос
/ 14 июля 2017

(Excel 2003)

Мне кажется, есть две разные проблемы: - изменение размера текста ОДНОЙ кнопки при нажатии на нее (хотя и не всегда, не знаю почему), и - изменение размера кнопок ВСЕ при открытии рабочей книги на дисплее с другим разрешением (которое сохраняется даже при возврате на начальный дисплей).

Что касается отдельной проблемы изменения размера: я обнаружил, что достаточно изменить одно измерение кнопки, чтобы «омолодить» ее. Такие как:

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

Вы можете поместить его в подпункт щелчка для каждой кнопки («myButton_Click») или реализовать его пользовательский класс для события "onClick".

1 голос
/ 27 июля 2016

Просмотр этой проблемы в 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
0 голосов
/ 03 июля 2019

После некоторого разочарования, следующий код помог мне обойти эту ошибку Excel / VBA. Обратите внимание на две ключевые вещи:

  • Хотя другие рекомендовали изменить размер, а затем немедленно изменить его обратно, обратите внимание, что этот код избегает изменения его более одного раза при изменении одного состояния переключения. Если значение изменяется дважды в течение одного изменения состояния события (особенно, если второе значение совпадает с начальным значением), альтернативные свойства ширины и высоты могут никогда не применяться к элементу управления, что не приведет к сбросу ширины и высоты элемента управления как это должно быть для предотвращения уменьшения ширины и высоты.
  • Я использовал жестко запрограммированные значения ширины и высоты. Это не идеально, но я обнаружил, что это был единственный способ предотвратить сжатие элемента управления после нескольких нажатий.
 
Private Sub ToggleButton1_Click()
   'Note: initial height is 133.8 and initial width was 41.4

    If ToggleButton1.Value = True Then
        '  [Code that I want to run when user clicks control and toggle state is true (not related to this issue)]
        'When toggle value is true, simply change the width and height values to a specific value other than their initial values. 

        ToggleButton1.Height = 40.4
        ToggleButton1.Width = 132.8
Else
        '  [Code that I want to run when user clicks control and toggle state false (not related to this issue)]
        'When toggle value is false adjust to an alternate width and height values. 
'These can be the same as the initial values, as long as they are in a separate conditional statement. 
         ToggleButton1.Height = 41.4
         ToggleButton1.Width = 133.8
    End If
End Sub


Для элемента управления, который не переключается, вы можете использовать переменную итератора или какой-либо другой метод, чтобы гарантировать, что свойства ширины и высоты чередуются между двумя одинаковыми наборами значений, что приведет к эффекту, аналогичному изменениям состояния переключения что я использовал в этом случае.

0 голосов
/ 26 октября 2018

У меня возникла такая же проблема с кнопками и вращениями ActiveX в Excel при изменении размера и перемещении. Это была общая электронная таблица, используемая на нескольких разных ноутбуках и экранах ПК. Поскольку это было общим, я не мог использовать макросы для автоматического изменения положения и изменения размера в коде.

В конце концов, после поиска решения и пробуя всевозможные настройки кнопок. Я обнаружил, что группировка кнопок сразу же решила проблему. Элементы управления, кнопки, вращатели остаются на месте. Я проверил это в течение недели и никаких проблем. Просто выберите элементы управления, щелкните правой кнопкой мыши и сгруппируйте - все работает как по волшебству.

0 голосов
/ 02 октября 2018

Обнаружена та же проблема с Excel 2016 - удалось исправить, изменив высоту кнопки управления, вернув ее обратно, затем выбрав ячейку на листе. Просто изменение размера не работает последовательно. Пример ниже для кнопки команды (cmdBALSCHED)

Public Sub cmdBALSCHED_Click()

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

При этом высота вернется к 20, а шрифт кнопки вернется в исходное состояние.

0 голосов
/ 10 июля 2016

Мой размер изменился после печати и изменения масштаба, перерисовал экран и исправил его

ActiveWindow.Zoom = 100
ActiveWindow.Zoom = 75
0 голосов
/ 02 октября 2015

У меня была эта проблема с использованием Excel 2013. Все для нормальной работы в течение длительного времени и внезапно, когда я нажал на кнопку (ActiveX), оно стало больше, а шрифт стал меньше.

Не сохраняя файл, я перезагрузил компьютер и снова открыл тот же файл Excel, и все снова в порядке.

0 голосов
/ 03 августа 2015

Старая проблема, но все еще кажется проблемой для тех из нас, кто застрял в Excel 2007. У нее была та же проблема с объектом списка ActiveX, и он увеличивал свой размер при каждом пересчете.Свойство LinkCells искало динамический (смещенный) диапазон для своих значений.Перестройка так, чтобы он искал нормальный диапазон, исправила мою проблему.

...