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

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

Когда у вас будет больше элементов в списке, который можно отобразить, появится панель scoll. В определенных условиях, однако, прокручивая планку до конца списка и отпуская ее, "прыгнет" на планку надреза вверх, и вы не сможете увидеть последний элемент в списке. Это проиллюстрировано здесь: Can't scroll all the way down

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

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

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

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

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

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

Ответ 1

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

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

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

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

Workaround worked

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

Ответ 2

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

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

Ответ 3

With lstbox

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

End With

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

Ответ 4

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

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

Enjoy.

Ответ 5

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

Ответ 6

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

Я обнаружил следующую проблему, связанную с высотой ListBox при изменении размера, что она изменилась непредсказуемым образом в зависимости от начальной высоты. Измененная высота была другой, когда отображалась на другой машине с 125% масштабированием текста. Например, если я устанавливаю высоту между 358 и 370, высота с измененным размером равна 370,65 или 371,4 на моей машине, но на машине с 125% масштабированием текста это 360,1, 370,25 или 380,45. С такой большой изменчивостью результатом было то, что ListBox мог скрывать другие элементы управления под ним.

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

    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

Ответ 7

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

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

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

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

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

если размер вашего шрифта равен 6-10 (arial, regular), высота списка увеличивается с краткими 12.75 (бит мой стиль списка: 1: ListStyle, 1-fmListStyleOption. Он может отличаться от стиля 0)

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

в случае размера шрифта 12 (arial, regular), он умножает на 13.55

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

Ответ 8

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

Application.ScreenUpdating = False

'save the current Excel zoom
intZoom = ActiveWindow.Zoom

With Worksheets("Sheet1").LstBox1

'prevent error of ActiveX list box not showing the last item
ActiveWindow.Zoom = 100
.IntegralHeight = False
.Height = 420
.IntegralHeight = True
.MultiSelect = fmMultiSelectSingle
.MultiSelect = fmMultiSelectExtended

End With

'restore the previous Excel zoom
ActiveWindow.Zoom = intZoom

Application.ScreenUpdating = True

Наконец, последний элемент отображается независимо от текущего уровня масштабирования окна.

Ответ 9

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

Ответ 10

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