Иногда я буду сталкиваться с таблицей, которая страдает от волшебных кнопок или списков, которые со временем становятся все больше или меньше.
Ничто в коде не инструктирует это.
Кто-нибудь еще испытал эту радость?
Иногда я буду сталкиваться с таблицей, которая страдает от волшебных кнопок или списков, которые со временем становятся все больше или меньше.
Ничто в коде не инструктирует это.
Кто-нибудь еще испытал эту радость?
Проблема, похоже, связана с тем, как Windows обрабатывает неродные разрешения на мониторах, и их можно избежать несколькими способами.
Проблема может быть полным кошмаром, когда это происходит, но это происходит только периодически.
Недавно мы тестировали таблицу Excel, используемую несколькими десятками человек, и разработали хорошее представление о причине и некоторых возможных исправлениях.
Причина, по-видимому, связана с любой установкой, где экраны используются в чем-то отличном от их собственного разрешения. Это может случиться легко, если пользователь подключает внешний монитор к ноутбуку и не выбирает результирующую конфигурацию экрана. Например, если ноутбук подключен к проектору (возможно, к старому с дисплеем с разрешением 1024 на 768), но ноутбук составляет от 1280 до 800, и пользователь выбирает дублировать экран, а не расширение (настройки в панели "подключиться к проектору" или "отображает" в Windows 7), результатом является непредсказуемое и обычно неудовлетворительное изображение на обоих экранах как с неродными разрешениями. Мы обнаружили, что эти настройки почти всегда вызывают серьезные проблемы с кнопками Excel, особенно с элементами ActiveX. Иногда при повторных кликах они сокращаются до нечитаемости; в других случаях они расширяются, чтобы охватить весь экран.
В основном, когда мы инструктируем пользователей использовать параметр expand, а результат - два экрана с использованием собственных разрешений, мы не видим проблемы.
Существуют также основанные на кодах способы минимизации проблемы. Мы попытались сбросить местоположение и размер кнопок и элементов управления, когда они были нажаты (что добавляет много утомительного кода, если у вас много кнопок). Иногда это срабатывало. Мы также пытались переключить свойство autosize с true на false и назад (это работает вручную в режиме разработчика), и это фиксирует больше экземпляров, но не все.
нашел причину, по которой люди открывают страницу на компьютере, доступ к которому осуществляется через удаленный рабочий стол, и существует разница в разрешении экрана между локальными и удаленными машинами. Это влияет на элементы управления, доступные из панели инструментов управления, но все же, чтобы испытать проблему с помощью кнопки управления старой формой школы, поэтому мой неудовлетворительный ответ заключается в том, чтобы использовать это.
Это мучило меня годами, и снова и снова. Вокруг есть множество исправлений, но они кажутся удачными. Это все еще происходило в Excel 2010 (происходит со мной в мае 2014 года) и все еще происходит в Excel 2013 в некоторых отчетах. Наилучшее описание, которое я нашел, которое, по крайней мере, соответствует моей ситуации (Excel 2010, без RDP, без предварительного просмотра):
(Это может не помочь пользователям Excel 2013, извините)
РЕДАКТИРОВАТЬ: Добавление деталей в случае, если ссылка на Technet когда-либо не работает, статья Technet говорит:
Сначала установите Microsoft Hotfix 2598144 для Excel 2010, доступно здесь.
Во-вторых, если ваш симптом "кнопка ActiveX меняется на неправильный размер после щелчка на листе Excel 2010", то вам следует:
ИЛИ ВТОРОЕ, если у вас есть симптом " Элемент управления формы кнопки неправильно отображается в книге после просмотра предварительного просмотра книги в Excel 2010", то вам следует:
ИЛИ ВТОРОЕ, если ваш симптом "кнопка ActiveX изменена на неверный размер на листе Excel 2010 после просмотра предварительного просмотра листа", то вам следует:
Удачи. Эта проблема такая боль...
Эта проблема на самом деле обусловлена разрешением экрана. Чаще всего это происходит, когда пользователь подключается к проектору или WebEx при использовании приложения excel.
Простое решение этой проблемы - попросить пользователя перезагрузить компьютер без каких-либо периферийных соединений (проектор), а затем снова открыть приложение excel.
Исправления, обсуждавшиеся ранее, с программным изменением размера/перестановки элементов управления Active X после событий клика или изменения реестра (с помощью слова D LegacyAnchorResize), не помогли мне решить проблему с 64-разрядной версией Excel 2010/Windows 7.
Решение для меня было найдено здесь: https://support.microsoft.com/en-us/kb/838006
В Excel 2010 ссылка указывает:
Может ли быть, что кнопка определена, чтобы придерживаться углов ячейки, а не свободно плавать?
Проверьте его с помощью
Формат | Недвижимость | Позиционирование объектов
и выберите что угодно, кроме "перемещения и размера с ячейками"
Мои мониторы кажутся настроенными на собственные разрешения, что углубляет тайну. Однако я обнаружил, что выполнение SOMETHING на кнопке (перемещение или изменение размера) каким-то образом устраняет проблему. Эта процедура автоматизирует перемещение, а затем восстанавливает исходную настройку.
Следующий код, похоже, решает проблему, по крайней мере для кнопок.
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
У меня была эта проблема несколько раз, и для решения я сделал следующее:
Я обнаружил, что эта проблема была вызвана тем, что мы подключили ноутбук к проектору и сохранили файл. Затем каждый раз, когда проблема возникала, я просто повторял шаги 1. и 2. и мои объекты ActiveX велись снова
Мы просто решили это на уровне компании, добавив следующий модуль ко всем книгам с поддержкой макросов:
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
Старый поток, но у меня возникла эта проблема и я решил ее сначала группировать, в моем случае, кнопки параметров вместе с проблемой, а затем просто установил (сбросил) размер этой группы в Auto_Open как таковой:
With ThisWorkbook
.Worksheets("1").Shapes("grpInput").Width = 383.1
.Worksheets("2").Shapes("grpSuite").Width = 383.1
.Worksheets("3").Shapes("grpLoc").Width = 383.1
.Worksheets("4").Shapes("grpDecision").Width = 383.1
End With
[EXCEL PROFESSIONAL PLUS 2016, 32 бита, версия 1802, сборка 9029.2167]
У меня была та же проблема, и я мог решить эту проблему, настроив масштабирование экрана в Windows 10, 64 бита. Это очень просто и работает для одного пользователя. Просто следуйте приведенным ниже инструкциям, и у вас будут все элементы управления формой, формами листов, рисунками и элементами управления ActiveX до их исходного размера. Нет необходимости кодировать или делать сложные хитрости/волшебство/хаки. Если указанная ссылка не работает, просто повторите эти шаги.
Чтобы настроить отображение пользовательского масштабирования в Windows 10, необходимо сделать следующее.
Открыть настройки.
Это старый пост, но я надеюсь, что он поможет всем, кто имеет дело с этой надоедливой и напряженной проблемой Excel.
https://winaero.com/blog/set-display-custom-scaling-windows-10/
Эта проблема очень расстраивает, мой опыт показывает, что свойства обычно правильно устанавливаются для объектов 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
Я постоянно сталкиваюсь с этой проблемой в Excel 2010 (которая всегда возвращает меня к этой теме), и хотя я не нашел исправления на 100%, я считаю, что у меня есть некоторая информация, которая может помочь другим.
Утомительно играя с кнопками, я обнаружил, что РАЗЛИЧНЫЕ СОБЫТИЯ для каждого объекта вызывают разные проблемы. Например,
Единственное решение, которое работает для меня, это написать код для сброса размера/текста для каждого события объекта, которое вызывало случайное изменение размера. Вот так...
Где MaterialNum - это имя поля ввода, а MouseDown - это событие...
Private Sub MaterialNum_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
' Reset the size, font style, and size
With Worksheets("QuoteForm").Shapes("MaterialNum")
.Height = 21
.Width = 101.25
.Left = 972.75
.Top = 87
With .DrawingObject.Object.Font
.Name = "Arial"
.Size = 12
End With
End With
End Sub
Кроме того, мне пришлось изменить несколько параметров в управлении форматами (щелкните правой кнопкой мыши объект> Управление форматами):
Кроме того, в панели свойств объекта (щелкните правой кнопкой мыши объект> Свойства) я установил для TakeFocusOnClick значение false
Да, это отнимает много времени и утомительно, поскольку это должно быть сделано с каждым объектом, но это единственное исправление, которое работает для меня (и это, кажется, быстрее, чем ожидание Microsoft, чтобы это исправить !!!). Надеюсь, это поможет другим.
Я надеюсь, что другие находят это полезным
Я заметил, что ни один из этих ответов не привязывает элемент управления к определенной строке и столбцу. Для меня это сработало довольно чисто, поскольку строки/столбцы, как правило, более предсказуемы, чем разрешение мониторов.
Приведенный ниже пример в основном "измеряет", куда должен идти объект, а затем устанавливает его там в коде 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
Результат будет выглядеть так, как показано ниже:
Это очень странно. Свойства Width и Height не сжимаются при запросе (либо в коде или с использованием листа свойств), но, видимо, они меняются.
Я заметил, что если я использую лист свойств и изменяю ширину от стандартного 15 до, скажем, 14, а затем BACK до 15, он исправляет его.
Код ниже работает для меня (и имеет забавный визуальный эффект на листе: вы нажимаете, он сжимается, экран мерцает, и он расширяется).
MY SOLUTION в коде (в событии клика для флажка):
Dim myCtrl As OLEObject
For Each myCtrl In ActiveSheet.OLEObjects
myLab = myCtrl.Name
myCtrl.Height = 14 ' to "wake up" the property.
myCtrl.Height = 15 ' to reset it back to normal
myCtrl.Width = 12 ' just making sure
Next myCtrl
После поиска в сети наилучшим решением является сохранение файла как .xlsb(двоичный), а не .xlsm
То, что я начал делать некоторое время назад, состояло в том, чтобы иметь единственный элемент, который задает размер всех моих элементов управления. Затем я могу запустить этот юг из любой точки кода, где элементы управления растут или сжимаются. Иногда бывает много лишней работы, но он не позволяет моим кнопкам съесть мою таблицу.
Я не тестировал это, но я предполагаю, что это имеет отношение к свойству масштабирования (возможно, добавьте activewindow.Zoom = false
).
Также можно сделать цикл для форм, определяющих .Placement = xlMove
в workbook_open и window_activate, чтобы предотвратить изменение размеров фигур с помощью ячеек (но будет перемещаться вместе с ними).
Я использую excel 2013 и никогда не имел этой проблемы, также я никогда не использую его удаленно..., просто пытаясь помочь с небольшими идеями.
Возможно, я нашел исправление: " убедитесь, что все фигуры на листе имеют уникальные имена" (включая флажки/переключатели (элементы управления OLE), а также изображения и другие типы фигур... )
Поскольку проблема прерывистая, я не могу этого гарантировать. У меня есть две формы, которые теперь отлично работают с этим исправлением, но "два" - это очень маленький набор образцов, и это может быть просто совпадение. Тем не менее, это шаги, которые я предпринял:
Я перечислил все фигуры в лист проблем (wsForm) на чистый лист (Sheet1):
Sub ListShapes()
Dim spShape As Shape
Dim intRow As Integer
Sheet1.Range("A1:F1") = Array("Name", "Left", "Top", "Width", "Height", "Bottom Right Cell")
intRow = 2
For Each spShape In wsForm.Shapes
Sheet1.Cells(intRow, 1).Value = spShape.Name
Sheet1.Cells(intRow, 2).Value = spShape.Left
Sheet1.Cells(intRow, 3).Value = spShape.Top
Sheet1.Cells(intRow, 4).Value = spShape.Width
Sheet1.Cells(intRow, 5).Value = spShape.Height
Sheet1.Cells(intRow, 6).Value = spShape.BottomRightCell.Address
intRow = intRow + 1
Next
End Sub
Затем я подсчитал каждое имя формы в столбце A, используя формулу в столбце G:
= СЧЕТЕСЛИ ($ A $2: $A $120, А2)
Очевидно, отрегулируйте диапазон, чтобы соответствовать... Затем вы можете фильтровать все фигуры, которые не имеют "1" в этом столбце. "Нижняя правая ячейка" помогает вам найти форму на вашем листе: переименуйте, выбрав фигуру, а затем введите новое уникальное значение в поле имени/ссылки в левом верхнем углу Excel.
Этот список фигур также помог найти некоторые "мертвые" фигуры (0 height или 0 width), которые были давно забыты и не использовались.
Я надеюсь, что это сработает для вас! В этом отношении... Надеюсь, это работает для ME для будущих случаев...
Если вы хотите не показывать кнопку перемещения вперед и назад, вы можете поместить исходное место в свой код, а затем просто проверить на них. Отключайте обновление экрана при нажатии кнопки, проверьте, не отличается ли место размещения от элемента управления, измените его, если необходимо, снова включите обновление экрана
DP
После того, как вы попытались найти множество решений на этой и связанных с ними сообщениях, я обнаружил, что решение другой проблемы, которую Microsoft разместило, также надежно работало над этой конкретной проблемой при ее применении определенным образом, по крайней мере, в контексте, который я работающих внутри. Я столкнулся с этими проблемами в разрешении, имеющем отношение к ноутбукам, которые у нас есть здесь и на ПК, когда я переключался на неродное разрешение. А именно, загрузка кнопок при большем, чем обычно, размере, увеличивается при нажатии, а текст и изображения в этих кнопках сокращаются (и, по крайней мере, настройка для текста осталась прежней, поэтому я не мог видеть, как можно программно изменить ее или в противном случае.) В моем случае это были нерегулярные проблемы. У меня были нерегулярные проблемы, хотя после использования предварительного просмотра, который опубликовал Microsoft для здесь. Я пробовал это и, похоже, работает.
Решение. Для Excel закройте приложение и удалите файл MSForms.exd с C:\Users{UserName}\AppData\Local\Temp\Excel8.0
в то время, когда вы разрешите просмотр кнопок. Вы также можете искать другие .exd файлы в локальном приложении AppData\Temp для других приложений Office.
Как я уже упоминал, это решение, предложенное Microsoft для другой проблемы - когда кнопки перестают работать после установки обновлений Dec'14. Здесь ссылка на эту статью. В этом случае это одноразовое исправление. Здесь вам может понадобиться делать это каждый раз, когда вы меняете разрешения.
Группировка элементов управления работает для меня. Я бы поднял или прокомментировал, но я не позволю. Обратите внимание, что эта проблема часто возникает, если вы используете масштабирование дисплея W8 и имеете ноутбук с высоким разрешением и более старый монитор.
Я нашел эту проблему для всех объектов (кнопок, текстовых полей и т.д.). Когда я печатаю/распечатываю несколько листов, все листы, кроме первого в последовательности, перемещают или изменяют размер объектов. После долгих испытаний самое простое решение для увеличения или уменьшения страницы и возврата к исходной настройке.
У меня также была проблема с списками ActiveX, и я нашел следующее в другом месте, и, похоже, это работает до сих пор, и это кажется также самым простым решением, которое передается вместе с передачей электронной таблицы кому-то еще:
"В то время как ListBox имеет свойство IntegralHeight, побочный эффект которого имеет значение FALSE, будет держать этот элемент управления в заданном порядке, а в то время как командные кнопки обладают такими свойствами, как перемещение/размер с ячейками и т.д., другие элементы управления не так грациозны."
И у них есть еще несколько советов: http://www.experts-exchange.com/articles/5315/Dealing-with-unintended-Excel-Active-X-resizing-quirks-VBA-code-simulates-self-correction.html
Я обнаружил, что проблема возникает только при включении режимов замораживания, которые обычно включаются в большинстве приложений, так как вы размещаете свои командные кнопки и т.д. в том месте, где они не прокручиваются вне поля зрения.
Решение, которое сработало, состояло в том, чтобы сгруппировать элементы управления, но также обеспечить, чтобы группа выходила за пределы области стоп-кадра. Я делаю это, добавляя элемент управления вне области замороженных окон, добавляя его в группу, но также скрывая элемент управления, чтобы вы его не видели.
Теперь, используя Excel 2013, это происходит каждый раз, когда я расширяю свой экран во время работы Excel (и каждый раз, когда я удаляю расширение).
Исправление, которое я начал внедрять, - это использовать гиперссылки вместо кнопок, а один - открыть пользовательскую форму со всеми другими элементами управления ActiveX.
Добавьте этот код в REG файл. Дважды щелкните и подтвердите. Перезапустите Excel.
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\options]
"LegacyAnchorResize"=dword:00000001
[HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Common\Draw]
"UpdateDeviceInfoForEmf"=dword:00000001
Попробуйте изменить настройку масштабирования на 100%, используя нижний слайдер правой руки. Исправлено это для меня на обоих мониторах разных размеров.
Я нашел исправление, которое работает, и решает проблему для одного пользователя. Если вы не хотите читать мою небольшую написание, вы можете перейти прямо к решению.
RANT:
Я испытывал эту тупую проблему, так как динозавры. Тем временем у Microsoft было много ресурсов для выпуска бесчисленных крупных обновлений для пакета Office, но эта проблема остается без внимания. Это абсолютно бесит. У меня нет никакой причины обновляться, если такие базовые вещи не работают. Разумеется, кто-то из MS использует элементы управления ActiveX в Excel прямо на дисплее с высоким разрешением, не?
Я не испытывал этой проблемы на своем настольном ПК, не знаю, почему, но на моем Surface Pro 4 мои элементы ActiveX управляют бананами всякий раз, когда я нажимаю на них.
Сегодня я решил разобраться в этом. Я искал высоко и низко, пробовал каждое решение, предлагаемое на разных форумах (ни один из них не работает, кстати). Не имеет значения, сгруппированы ли элементы управления или нет, заблокированы или нет, исправлено исправление или нет.
Вчера у меня возникла еще одна проблема с вещами, которые плохо себя ведут в другом приложении под названием Traktor (программное обеспечение DJ), где элементы управления могли бы прыгать, когда масштабирование экрана было установлено на значение, которое не было точным кратным 100%. Пользователь нашел решение для редактирования режима совместимости для этого приложения. Поэтому я сделал то же самое для Excel, и это сработало! Теперь мои элементы управления остаются включенными, независимо от разрешения экрана и масштабирования.
РЕШЕНИЕ:
(убедитесь, что Excel не запущен)
Теперь Excel будет работать с собственным разрешением, а элементы управления ActiveX не будут ошибочными. Единственным недостатком является то, что Excel не будет реагировать на масштабирование экрана, поэтому все может выглядеть немного меньше, чем хотелось бы. На моем Surface Pro 4 более чем приемлемо
ПРИМЕЧАНИЯ:
1) Шаги 2 и 6 требуются с Excel 2016, потому что диалоговое окно свойств для EXCEL.EXE не предлагает вкладку Compatibility. После переименования вкладка становится доступной.
2). Это решение работает только на основе одного пользователя. То есть, если вы отправляете файл Excel с элементами управления ActiveX своим коллегам, элементы управления ActiveX не будут отображаться правильно в их системе, если они не изменят настройки режима совместимости.
3) После применения этого взлома ранее поврежденные файлы Excel, по-видимому, исправляются при их открытии, при этом все элементы управления восстанавливают свои первоначальные предполагаемые размеры.
Прошу протестировать и прокомментировать, я надеюсь, что это может помочь кому-то, ура!
У меня такая же проблема. В моем случае я мог бы воспроизвести его на 100% в одном файле, но это было непоследовательно в практически идентичном файле. Я также обнаружил, что ошибка размера не была постоянной - я мог сохранить и снова открыть файл, чтобы восстановить внешний вид кнопки. Я также мог бы создать новое окно, а затем сбросить поврежденное окно. Я использую конфигурацию одного монитора.
Для меня кнопка изменилась, когда я обратился к листу HPageBreaks. Я смог избежать проблемы, временно изменив вид окна следующим образом:
ActiveWindow.View = xlPageBreakPreview
' do pagination stuff using HPageBreaks
ActiveWindow.View = xlNormalView