Как исправить список Excel, который не может прокрутить последний элемент в поле зрения

#excel #vba #user-interface #listbox

#excel #vba #пользовательский интерфейс #список

Вопрос:

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

Когда в списке будет больше элементов, которые можно отобразить, появится панель прокрутки. Однако при определенных условиях прокрутка строки до самого низа списка и ее отпускание приведет к «скачку» строки на ступеньку вверх, и вы не сможете увидеть последний элемент в списке. Это проиллюстрировано здесь: Не удается прокрутить весь путь вниз

Есть много сообщений на форуме, в которых описывается эта проблема, и решение всегда было «Установите для свойства integral height значение false, а затем снова установите для него значение true». Что это делает, так это слегка изменяет размер списка, так что его высота округляется до высоты одной строки, и тогда никакие элементы не остаются скрытыми.

 With lstbox
    .IntegralHeight = False
    .Height = myHeight
    .IntegralHeight = True
End With
  

Однако есть определенные случаи, когда это не работает. Если вы:

  1. Программная настройка высоты вашего списка
  2. НЕ используется простой выбор списка (fmMultiSelectSingle)

Тогда простое присвоение целой высоте значения false, а затем значения true после или между изменениями высоты приведет к корректировке высоты вашего списка, но когда вы перейдете к прокрутке вниз, проблема останется — последний элемент не будет виден.

Ключ к этому разочаровывающему вопросу заключается в том, что, хотя все остальные в Интернете подтверждают, что решение «integralHeight» работает для них, эти особые случаи расстроены, задаваясь вопросом, почему это не работает для них. Итак, как они получают свое исправление?

Комментарии:

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

Ответ №1:

Кое-что, что мне пришлось открыть для себя, и чего нельзя найти нигде больше (именно поэтому я публикую это здесь), заключается в том, что эта проблема имела дополнительное измерение зависимости от метода выбора. Хотя я не могу понять, как способ работы полосы прокрутки связан не только со свойством height и integral height, но и с .Свойство MultiSelect, я обнаружил, что это так.

Когда .Метод IntegralHeight, показанный выше, не работает, следующий метод каким-то образом работает:

 With lstbox
    .IntegralHeight = False
    .Height = myHeight
    .IntegralHeight = True
    .MultiSelect = fmMultiSelectSingle
    .MultiSelect = fmMultiSelectExtended
End With
  

Простым изменением .Свойство MultiSelect в fmMultiSelectSingle, а затем восстановить его обратно в желаемом стиле выделения, высота списка будет автоматически скорректирована с помощью .Высота свойства IntegralHeight немного отличается от высоты, когда эти действия не выполняются — разница приводит к правильной работе полосы прокрутки:

Сработал обходной путь

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

Ответ №2:

я знаю, что это очень старый пост. но я прошел через многое, чтобы решить эту проблему, поэтому я просто хочу поделиться своим советом. 🙂

прежде всего, метод integralheight не работает, когда уровень масштабирования листа не равен 100%.

это изменит высоту и ширину listbox, местоположение и т.д. (даже если вы установили свойство объекта «не перемещать и не изменять размер ячейки»)

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

мой совет прост. существует комбинация между размером шрифта и высотой списка.

если ваш размер шрифта 6-10 (arial, обычный), высота списка хорошо сочетается с кратными 12,75 (кстати, мой стиль списка — 1: ListStyle, 1-fmListStyleOption. это может отличаться от стиля 0)

пока высота одинакова с этими кратными 12,75, проблем не будет.

в случае размера шрифта 12 (arial, обычный), он кратен 13,55

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

Комментарии:

1. Вау… Я искал ответ в течение 2 месяцев.. это было слишком просто и, наконец, сработало.. престижность

2. Wow….It работает. Большое вам спасибо. Вы спасаете жизни …… 🙂

3. Изменил высоту моего LB на 102 (кратно 12,75) вместо 105, и теперь он работает без скрытых строк, не уверен, что расчет точен, поскольку 103 также работает, а 104 — нет. Размер шрифта начинается с 8pt Times New Roman, но у меня есть кнопка изменения размера, и, похоже, она работает для всех размеров, по крайней мере, после загрузки.

Ответ №3:

Мне пришлось привязать позицию, так как мой список перемещался по странице:

 With ListBox1 
 .IntegralHeight = False
 .IntegralHeight = True
 .Height = 45
 .Width = 69
 .Top = 0
 .Left = 1255.5
End With
  

Ответ №4:

With lstbox

 `.Height = myHeight`
`.MultiSelect = fmMultiSelectExtended`
`.MultiSelect = fmMultiSelectSingle`
  

End With

У меня это сработало. Нет необходимости устанавливать свойство Integral height

Комментарии:

1. Это работает, ТОЛЬКО если для IntegralHeight уже установлено значение True.

Ответ №5:

В моем случае решением был этот метод:

 with listbox
   .IntegralHeight = False
   .Height = myHeight
   .Width = myWidth
   .IntegralHeight = True
   .Height = myHeight
   .Width = myWidth
end with
  

Наслаждайтесь.

Ответ №6:

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

Комментарии:

1. В принятом ответе написано, что регулировка высоты не помогла. Не могли бы вы предоставить более подробную информацию?

Ответ №7:

Спасибо, Ален. Ваше исправление хорошо сработало для меня.

Я обнаружил последующую проблему, связанную с высотой списка при изменении размера, которая непредсказуемым образом менялась в зависимости от начальной высоты. Измененная высота снова отличалась при отображении на другом компьютере с масштабированием текста на 125%. Например, если я установлю высоту между 358 и 370, измененная высота на моем компьютере будет равна 370.65 или 371.4, но на компьютере с масштабированием текста 125% она равна 360.1, 370.25 или 380.45. С такой большой вариативностью результатом было то, что список мог скрывать другие элементы управления под ним.

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

     Hmax = 372      'Target Height 
    H1 = Hmax
    With SteelForm.Controls.Item("ListBox1")
        Do
            H1 = H1 - 1
            .IntegralHeight = False
            .Height = H1
            .IntegralHeight = True
            .MultiSelect = fmMultiSelectSingle
            .MultiSelect = fmMultiSelectExtended
            DoEvents
        Loop Until .Height < Hmax
    End With
  

Ответ №8:

Что я видел в прошлом на форумах, так это просто добавление дополнительной пустой строки в ваш список. Это должно сработать.

Комментарии:

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

Ответ №9:

Просто установите для свойства Integral Height значение True

Комментарии:

1. В задаче и решении, опубликованном в прошлом году, четко указано, что этого недостаточно.