Listbox vba excel полоса прокрутки
В приведенном ниже примере у меня есть ListBox с десятками названий шрифтов.
Я бы подумал, что на нем автоматически будет вертикальная полоса прокрутки, чтобы вы могли выбрать ЛЮБОЙ шрифт, а не только первые в списке, но это не так.
Итак, я добавил «ScrollViewer», который помещает «область полосы прокрутки» справа, но в области полосы прокрутки нет полосы прокрутки, так что вы можете прокручивать (!).
Почему не работает автоматическая полоса прокрутки и как заставить ее иметь полосу прокрутки?
Проблема с вашим решением заключается в том, что вы помещаете полосу прокрутки вокруг ListBox, где вы, вероятно, хотите поместить ее внутри ListBox.
Если вы хотите принудительно использовать полосу прокрутки в ListBox, используйте присоединенное свойство ScrollBar.VerticalScrollBarVisibility.
Установка этого значения в Auto будет вызывать всплывающую полосу прокрутки по мере необходимости.
В моем случае я тоже положил ListBox внутрь, ScrollViewer и ListBoxItems они растягивались настолько широко, насколько хотели, за пределы размера ListBox . Удаление ScrollViewer и установка ScrollViewer.VerticalScrollBarVisibility="Visible" и ScrollViewer.HorizontalScrollBarVisibility="Disabled" сделали свое дело. Спасибо за помощь!ListBox уже содержит ScrollViewer . По умолчанию ScrollBar будет отображаться, когда содержимого больше, чем места. Но некоторые контейнеры изменяют размер, чтобы вместить их содержимое (например StackPanel ), поэтому «содержимого больше, чем места» не бывает. В таких случаях ListBox всегда предоставляется столько места, сколько необходимо для содержимого.
Размер должен быть известен, чтобы вычислить условие наличия большего количества содержимого, чем пространства. Убедитесь, что у вас ListBox ограниченный размер, задав размер явно в самом ListBox элементе или на главной панели.
В случае, если основная панель вертикальная, StackPanel и вы хотите, VerticalScrollBar вы должны установить высоту ListBox сама по себе. Для других типов контейнеров, например Grid , контейнер ListBox может быть ограничен. Например, вы можете изменить исходный код, чтобы он выглядел так:
Обратите внимание, что важен не только непосредственный контейнер. В вашем примере непосредственным контейнером является a Grid , но поскольку Grid он содержится в a StackPanel , внешний StackPanel расширяется для размещения своего непосредственного дочернего элемента Grid , так что этот дочерний элемент может расширяться для размещения своего дочернего элемента ( ListBox ).
Если вы ограничите высоту в любой точке - установив высоту ListBox , установив высоту внутреннего Grid или просто сделав внешний контейнер a Grid - тогда вертикальная полоса прокрутки появится автоматически каждый раз, когда есть слишком много элементов списка для вписывается в контроль.
Я хотел бы добавить горизонтальную полосу прокрутки в VBA ListBox.
Похоже, что встроенный ListBox не добавляет горизонтальную полосу прокрутки автоматически. У меня есть несколько полей, содержимое которых превышает ширину ListBox и, таким образом, нечитаемо для пользователя.
Я нашел эту статью, однако код не удается из-за доступа к hwnd из ListBox (который, по-видимому, недоступен в VBA). Я бы предпочел не писать родную DLL, чтобы это сделать, поскольку я подозреваю, что есть лучший способ.
Любая идея о том, как добавить горизонтальную полосу прокрутки в VBA ListBox?
Я открыт для использования альтернативного элемента управления, а не для его работы с ListBox.
Вы пытались использовать свойство ColumnWidths? У меня есть список с горизонтальной полосой прокрутки. Мне просто нужно было добавить свойство ColumnWidths.
Например, у меня есть
т e.Listbox1.Columnwidts ="0.5 in;0.2 in;1.5 in;0.75 in;0.5 in"
Доступ автоматически добавит горизонтальную полосу прокрутки, если ширина столбца превышает ширину списка. ОДНАКО, если вы используете несколько столбцов, первый столбец не может быть установлен в 0. У вас должно быть хотя бы некоторое значение, даже если оно всего лишь 0,1. Надеюсь, что это поможет.
Если я что-то не упустил, список VBA автоматически получит горизонтальную полосу прокрутки, если общее ее свойство ColumnWidths превышает свою собственную ширину.
Нет свойств, которые я знаю об этом, влияют на это поведение, то есть я не знаю, как заставить или отключить отображение горизонтальной полосы прокрутки.
В этой статье единственной причиной получения ScaleMode является установка ширины горизонтальной полосы прокрутки. Вам не обязательно это делать.
где 800 - ширина пикселя, которую вы хотите, чтобы окно списка могло прокручиваться вправо.
Вам все равно понадобится hWnd. Лучше всего использовать внешнюю DLL (написанную на VB), которая может перечислить через дочерние окна вашего процесса, пока не найдет класс Windows для списка (вам нужно будет найти способ однозначно идентифицировать его родителя, например окно название/текст или что-то еще). Эта же DLL могла бы также вызвать вызов SendMessage выше, чтобы установить горизонтальный объем текста (возможно, он также мог измерять ширину содержащихся элементов списка).
Обращение к блоку списка можно получить следующим образом: -
Dim ListHwnd As Integer lstboxName.SetFocus ListHwnd = GetFocus()
Используйте этот ListHwnd в качестве первого параметра функции sendmessage.
Нам нужно предоставить декларацию ниже: поскольку функция GetFocus отсутствует в VBA по умолчанию
Элемент управления ScrollBar предназначен в VBA Excel для ввода пользователем числовых данных, которые ограничены минимальным и максимальным значениями. Увеличение или уменьшение значения полосы прокрутки осуществляется с указанным шагом при помощи ползунка или кнопок.
Визуально, элемент управления ScrollBar состоит из полосы прокрутки и двух кнопок, работающих аналогично кнопкам элемента управления SpinButton. Ориентация может быть горизонтальной или вертикальной в зависимости от настроек.
Полоса прокрутки в VBA Excel используется в паре с элементом управления TextBox или Label. Вспомогательный элемент необходим, чтобы отобразить текущее значение ScrollBar на пользовательской форме.
Свойства элемента ScrollBar
Свойство | Описание |
---|---|
BackColor | Цветовое оформление элемента управления. |
Delay* | Время между последовательными событиями при удержании кнопки. |
ControlTipText | Текст всплывающей подсказки при наведении курсора на полосу прокрутки. |
Enabled | Возможность взаимодействия пользователя с элементом управления. True – взаимодействие включено, False – отключено (цвет стрелок становится серым). |
Height | Высота элемента управления. |
Left | Расстояние от левого края внутренней границы пользовательской формы до левого края элемента управления. |
Max | Максимальное значение свойства Value. |
Min | Минимальное значение свойства Value. |
Orientation** | Задает горизонтальную или вертикальную ориентацию элемента управления ScrollBar. |
SmallChange | Шаг изменения значения свойства Value. |
TabIndex | Определяет позицию элемента управления в очереди на получение фокуса при табуляции, вызываемой нажатием клавиш «Tab», «Enter». Отсчет начинается с 0. |
Top | Расстояние от верхнего края внутренней границы пользовательской формы до верхнего края элемента управления. |
Visible | Видимость элемента ScrollBar. True – элемент отображается на пользовательской форме, False – скрыт. |
Width | Ширина элемента управления. |
* По умолчанию свойство Delay равно 50 миллисекундам. Это означает, что первое событие (SpinUp, SpinDown, Change) происходит через 250 миллисекунд после нажатия кнопки, а каждое последующее событие – через каждые 50 миллисекунд (и так до отпускания кнопки).
** По умолчанию включена автоматическая ориентация, которая зависит от соотношения между шириной и высотой элемента управления. Если ширина больше высоты – ориентация горизонтальная, если высота больше ширины – ориентация вертикальная.
В таблице перечислены только основные, часто используемые свойства полосы прокрутки. Все доступные свойства отображены в окне Properties элемента управления ScrollBar.
Продолжим рассмотрите элементов управления, и следующий элемент, который мы разберем, — «Полоса прокрутки». Сразу перейдем к разработке интерфейса очередного примера. Откроем новую книгу и на листе расположим две полосы прокрутки и два текстовых окна (рис. 1.40). Левая полоса прокрутки вместе с левым текстовым окном предназначена для отображения показателей работы одного из менеджеров (для определенности — Петрова), а аналогичные правые элементы — для отображения показателей работы другого (Сидорова). Передвижением ползунка левой либо правой полосы прокрутки руководитель может установить показатель работы менеджера. Это будет числовое значение от 0 до 100. Одновременно с этим текстовое окно по вертикали займет соответствующее положение.
Рис. 1.40. Пример использования полосы прокрутки
Для левого текстового окна выберем Petrov в качестве значения свойства Name, а у левой полосы прокрутки для аналогичного свойства установим значение Scroll Petrov. Соответственно, у правого текстового окна свойство Name Sidorov, а у правой полосы прокрутки Name — ScrollSidorov.
У полосы прокрутки часто используются следующие свойства:
- Value — значение, соответствующее положению движка (ползунка) на полосе прокрутки;
- Мах — значение, соответствующее нижнему (или право му при горизонтальной полосе прокрутки) положению движка;
- Min — значение, соответствующее верхнему (или левому при горизонтальной полосе прокрутки) положению движка;
- SmallChange — значение, соответствующее изменению значения Value при щелчках на стрелке полосы прокрутки;
- LargeChange — значение, соответствующее изменению значения Value при щелчках на полосе прокрутки.
У текстового окна (как у любого другого элемента) есть свойство Тор, которое определяет положение элемента по вертикали, начиная от верхнего края листа. А при изменении положения движка левой полосы прокрутки автоматически выполняется процедура ScrollPetrov_Change() , для правой полосы, соответственно, ScrollSidorov_Change() .
Теперь более точно сформулируем задачу для программной разработки. Будем считать, что у нас в подчинении работают два менеджера и необходимо ежедневно сопоставлять результаты их работы. Скажем, количественная оценка каждого сотрудника изменяется в интервале от 0 до 100 баллов. Технически для отражения результата работы менеджера руководителю необходимо передвинуть движок соответствующей линейки прокрутки. В этом случае текстовое окно должно синхронно перемещаться на листе по вертикали, а в самом окне отображаться количество баллов. При этом, когда движок в верхнем положении, текстовое окно должно располагаться на уровне верхней границы полосы прокрутки. Соответственно, при нижнем положении движка текстовое окно должно располагаться на уровне нижней границы полосы прокрутки. Для реализации этого в окне свойств для полос прокрутки установим значения Min, равные 0, а значения Мах и Height равными 100. Установим также для этих элементов: SmallChange = 1 и LargeChange = 5 . Теперь можно написать процедуры, которые выполняются при передвижении движков левой (листинг 1.23) и правой (листинг 1.24) полос прокрутки.
' Листинг 1.23. Процедура, выполняемая при перемещении движка левой линейки Private Sub ScrollPetrov_Change() Petrov.Top = ScrollPetrov.Value + ScrollPetrov.Top Petrov.Text = "Петров " + CStr(ScrollPetrov.Value) Inten = 155 + ScrollPetrov.Value - ScrollPetrov.Min Petrov.ForeColor = RGB(Inten, Inten, Inten) Petrov.BackColor = RGB(0, Inten, 0) End Sub
' Листинг 1.24. Процедура, выполняемая при перемещении движка правой линейки Private Sub ScrollSidorov_Change() Sidorov.Top = ScrollSidorov.Value + ScrollSidorov.Top Sidorov.Text = "Сидоров " + CStr(ScrollSidorov.Value) Inten = 155 + ScrollSidorov.Value - ScrollSidorov.Min Sidorov.ForeColor = RGB(Inten, Inten, Inten) Sidorov.BackColor = RGB(inten, 0, 0) End Sub
После этого в следующих трех строках производится изменение фонового и основного цветов текстового окна. Как уже ранее отмечалось, интенсивность цвета меняется от 0 до 255. В результате выполнения этих строк максимальная интенсивность зеленого цвета для фона обеспечивается при нижнем крайнем положении движка. Для основного цвета интенсивность также будет максимальной. При другом крайнем положении движка интенсивности устанавливаются равными 155. Зеленый фон в этом случае станет более бледным, а цвет букв серым.
Продолжим рассмотрите элементов управления, и следующий элемент, который мы разберем, — «Полоса прокрутки». Сразу перейдем к разработке интерфейса очередного примера. Откроем новую книгу и на листе расположим две полосы прокрутки и два текстовых окна (рис. 1.40). Левая полоса прокрутки вместе с левым текстовым окном предназначена для отображения показателей работы одного из менеджеров (для определенности — Петрова), а аналогичные правые элементы — для отображения показателей работы другого (Сидорова). Передвижением ползунка левой либо правой полосы прокрутки руководитель может установить показатель работы менеджера. Это будет числовое значение от 0 до 100. Одновременно с этим текстовое окно по вертикали займет соответствующее положение.
Рис. 1.40. Пример использования полосы прокрутки
Для левого текстового окна выберем Petrov в качестве значения свойства Name, а у левой полосы прокрутки для аналогичного свойства установим значение Scroll Petrov. Соответственно, у правого текстового окна свойство Name Sidorov, а у правой полосы прокрутки Name — ScrollSidorov.
У полосы прокрутки часто используются следующие свойства:
- Value — значение, соответствующее положению движка (ползунка) на полосе прокрутки;
- Мах — значение, соответствующее нижнему (или право му при горизонтальной полосе прокрутки) положению движка;
- Min — значение, соответствующее верхнему (или левому при горизонтальной полосе прокрутки) положению движка;
- SmallChange — значение, соответствующее изменению значения Value при щелчках на стрелке полосы прокрутки;
- LargeChange — значение, соответствующее изменению значения Value при щелчках на полосе прокрутки.
У текстового окна (как у любого другого элемента) есть свойство Тор, которое определяет положение элемента по вертикали, начиная от верхнего края листа. А при изменении положения движка левой полосы прокрутки автоматически выполняется процедура ScrollPetrov_Change() , для правой полосы, соответственно, ScrollSidorov_Change() .
Теперь более точно сформулируем задачу для программной разработки. Будем считать, что у нас в подчинении работают два менеджера и необходимо ежедневно сопоставлять результаты их работы. Скажем, количественная оценка каждого сотрудника изменяется в интервале от 0 до 100 баллов. Технически для отражения результата работы менеджера руководителю необходимо передвинуть движок соответствующей линейки прокрутки. В этом случае текстовое окно должно синхронно перемещаться на листе по вертикали, а в самом окне отображаться количество баллов. При этом, когда движок в верхнем положении, текстовое окно должно располагаться на уровне верхней границы полосы прокрутки. Соответственно, при нижнем положении движка текстовое окно должно располагаться на уровне нижней границы полосы прокрутки. Для реализации этого в окне свойств для полос прокрутки установим значения Min, равные 0, а значения Мах и Height равными 100. Установим также для этих элементов: SmallChange = 1 и LargeChange = 5 . Теперь можно написать процедуры, которые выполняются при передвижении движков левой (листинг 1.23) и правой (листинг 1.24) полос прокрутки.
' Листинг 1.23. Процедура, выполняемая при перемещении движка левой линейки Private Sub ScrollPetrov_Change() Petrov.Top = ScrollPetrov.Value + ScrollPetrov.Top Petrov.Text = "Петров " + CStr(ScrollPetrov.Value) Inten = 155 + ScrollPetrov.Value - ScrollPetrov.Min Petrov.ForeColor = RGB(Inten, Inten, Inten) Petrov.BackColor = RGB(0, Inten, 0) End Sub
' Листинг 1.24. Процедура, выполняемая при перемещении движка правой линейки Private Sub ScrollSidorov_Change() Sidorov.Top = ScrollSidorov.Value + ScrollSidorov.Top Sidorov.Text = "Сидоров " + CStr(ScrollSidorov.Value) Inten = 155 + ScrollSidorov.Value - ScrollSidorov.Min Sidorov.ForeColor = RGB(Inten, Inten, Inten) Sidorov.BackColor = RGB(inten, 0, 0) End Sub
После этого в следующих трех строках производится изменение фонового и основного цветов текстового окна. Как уже ранее отмечалось, интенсивность цвета меняется от 0 до 255. В результате выполнения этих строк максимальная интенсивность зеленого цвета для фона обеспечивается при нижнем крайнем положении движка. Для основного цвета интенсивность также будет максимальной. При другом крайнем положении движка интенсивности устанавливаются равными 155. Зеленый фон в этом случае станет более бледным, а цвет букв серым.
Читайте также: