Excel VBA Userform ListBox ширина автоматически изменяется

У меня есть UserForm в проекте Excel VBA. Эта форма включает среди других элементов два объекта ListBox рядом с двумя кнопками между ними для перемещения элементов между списками.

В дизайнере форм я нарисовал списки именно там, где я их хочу, и оба имеют одинаковые размеры.

Поскольку оба списка ListBox должны быть многостолбцовыми, после извлечения данных из базы данных я использую слегка измененную версию JKP ListBox AutoSize, чтобы получить ширину столбцов, выработать количество столбцов и, наконец, заполнить список данными.

Фрагмент кода VBA, выполняющий эту задачу,

' GetColumnWidths is my modified version of JKP's Autosize code ' vaData is a 2 dimensional variant array containing the data ' LISTBOX_WIDTH is a constant width value (my attempt to stop this behaviour) With lbxList .ColumnWidths = GetColumnWidths(vaData) .ColumnCount = UBound(vaData, 2) + 1 .List = vaData .Width = LISTBOX_WIDTH End With 

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

Извиняюсь за редактирование моего мусора, но это содержит потенциально коммерчески чувствительную информацию, не говоря уже о том, что это не имеет значения для целей этого вопроса.

Форма выглядит так, когда она загружает initiallly: Начальная загрузка

После того, как пользователь выбирает элемент из ComboBox, списки заполняются элементами. Обратите внимание, что полосы прокрутки правого списка выглядят слегка растянутыми и нечетными. После выбора пользователем элемента из ComboBox

После того, как пользователь щелкнет элемент в правом списке, размер внезапно изменится! После того, как пользователь нажмет элемент в правом списке ListBox

Единственный способ вернуть размер в нормальное состояние – переместить элемент в левый список, а затем обратно. Как только вы это сделаете, они стабилизируются и прекрасны, пока вы не закрываете и не открываете форму снова.

Для чего это стоит, мы используем 32-разрядную версию Excel 2010.

Я немного поработал над тестированием, и кажется, что изменение свойства ColumnWidths влияет на свойство Width, но установка Width возвращается к тому, что было изначально после этого, чтобы теоретически решить проблему, но это кажется только до тех пор, пока вы на самом деле не нажмете на ListBox.

Теперь, по моему вопросу … знает ли кто-нибудь, что здесь происходит? У меня было два человека, которые смотрели на это, и все царапали их головы! Это не шоушоппер или что-то еще, но это определенно довольно странно. Я искал высоко и низко для чего-либо, даже отдаленно связанного с этим, и не мог найти ничего, поэтому я решил опубликовать его здесь.

Чтобы обойти это, я добавил событие MouseDown в каждый ListBox и принудительно изменил Width. Он не останавливает его перерисовку уже, но он правильно устанавливает ширину.

Благодаря!

У меня также была та же проблема – изменение размера списка без видимых причин. Вот как я нашел этот пост.

Я сделал, чтобы переписать размер списка в конце суб. Как это:

 With ThisWorkbook.Worksheets(tbl_input.Name) .lbTabsA.Width = 131 .lbTabsA.Height = 350 end with 

Вероятно, это автоматическое изменение является ошибкой в ​​Excel.

Контринтуитивное решение, которое сработало для меня:

  • поместите строку, которая устанавливает ширину столбцов в конце (после загрузки данных)

Ниже пример:

 With Me.ListBox2 .ColumnCount = 13 If Not rst.EOF Then .Column = rst.GetRows() rst.Close Else rst.Close GoTo CleanUp End If .ColumnWidths = "3 cm;1 cm;1 cm;1 cm;1 cm;1 cm;1 cm;1 cm;1 cm;1 cm;1 cm;1 cm;0 cm" End With 
  • Необходимо создать флаг, основанный на столбце даты и сегодняшней дате
  • Закрыть, затем открыть книгу
  • FilterData Macro
  • Динамически сгенерированный массив с MODE.MULT для значений серии диаграмм приводит к сбою Excel 2010
  • Мне нужно знать, как отображать текст на основе текста в другой ячейке
  • Как избежать предупреждения об ошибках в динамической диаграмме, если мы используем нулевые значения и # N / A?
  • COUNTIF с несколькими критериями для возврата разных результатов
  • Необходимо изменить цвета на сводной диаграмме с помощью VBA
  • Запретить печать для определенного листа, если конкретная ячейка пуста
  • VBA - Как настроить значение, если есть два или более одинаковых подряд?
  • VBA для сортировки таблицы и игнорирования общей строки
  • Давайте будем гением компьютера.