Сортировка listbox vba excel

Обновлено: 06.07.2024

I'd like to sort the items in my ListBox and have no clue how to do that. Can anyone help me?

Thanks in advance

Answers

Try the following.

Private Sub CommandButton3_Click()
'Sorts ListBox List
Dim i As Long
Dim j As Long
Dim temp As Variant

All replies

Try the following.

Private Sub CommandButton3_Click()
'Sorts ListBox List
Dim i As Long
Dim j As Long
Dim temp As Variant

Thank You OssieMac!

Would you mind looking at the question I posted earlier, which you could find at:

I was also trying to copy the entire ListBox1 into ListBox2 and could not figure out how.

Would you mind helping me?

Have answered your other question on MultiSelect.

The following code will copy the ListBox1 list to the ListBox3 list.

As a little additional information, .List is actually an array and is treated as an array when addressing the elements. As an alternative in the sort you can actually use the array properties of LBound and UBound for the first and last elements in the loop like the example below. Note that because UBound is actually the index number of the last item, only need to subtract 1 for the sort. (The reason for the sort loop being one less than the total number of elements is because the code continually compares to the next element so need to stop at second last element because the last loop then compares the second last element with the last element.)

Private Sub CommandButton4_Click()
'Sorts ListBox List (Addressing .List as an array)
Dim i As Long
Dim j As Long
Dim temp As Variant

Hello here an update for a multi column listbox.

Can anyone explain what the variable "j" is for in the above code snippets? As far as I can tell it is redundant.

The 2 nested loops are required to complete the sort. Without the j loop the data will only be partially sorted and some of the elements can still be out of sorted order.

The code actually goes through the array and rearranges the data using the i variable for as many times as there are elements in the array less one element. Reason for less one element is that it always needs to compare to the next element and can't compare to an element that does not exist after the last element.

Brilliant, thank you. I was trying to make this work with a 2 column listbox and couldn't get it right. I thought that might have been the issue, but a quick change based on your explanation has fixed it. Very relieved.

Like a picture is worth a 1000 words, the same can be said for using an example to explain the code. Therefore, I thought that it might be worthwhile to post a code example that displays what I said about the sorting.

A MsgBox displays the initial array elements.

For each of the j loops there a MsgBox that displays the updated array elements after the i loop.

Note that initially 5 is the first element and it moves to the last position on the first i loop. This is because each time it is moved to the next position, on the next iteration of the i loop, it is greater than the following element and gets moved down again and therefore at the last element position after the first run of the i loop. However, because 1 is the smallest number, it takes all 4 loops to get to the first position.

Note that the List property of a ComboBox is in fact an array and Lbound and Ubound functions can be used with it just as with any other array.

Sub SortArray()
Dim arrSamp()
Dim i As Long
Dim j As Long
Dim temp As Variant
Dim c As Long
Dim strMsge As String

arrSamp() = Array(5, 2, 4, 3, 1)

strMsge = "Before any sorting" & vbCrLf
For c = 0 To 4
strMsge = strMsge & arrSamp(c) & vbCrLf
Next c
MsgBox strMsge

Next i
strMsge = ""
For c = 0 To 4
strMsge = strMsge & arrSamp(c) & vbCrLf
Next c
MsgBox strMsge
Next j

И снова здравствуйте.
Поставил для себя задучу разобраться и ответить на насущные вопросы по работе с элементом ListBox.
Есть данный объект, в который программно заносятся данные в 2 и более столбцов (у меня до 7-и). Данные берутся с таблицы(объекта листа) через .AddItem в цикле от 1 до "Количество строк в таблице" (Rows.Count) . Всё отрабатывает корректно.
Далее создана динамическая форма которая содержит ниименование заголовков таблицы, и ,определив тип данных столбцов, выводит Text и Combo боксы по заданным критериям. Тут тоже всё хорошо.
В этой форме хочу задавать параметры отбора создаваемого фильтра для данных в ListBox, причём задаются дополнительные признаки "как искать?" =, <, > для текстовых полей "Полное соответствие", "Содержит", "Не содержит"

Далее продумываю несколько вариантов осуществления запланированной задачи.

1. Можно по данным установленых значений своего фильтра, отфильтровать исходную таблицу на листе Excel используя его фильтры или автофильтры. Однако тут необходимо каждую строку проверять на свойство видимости, и если Да, тогда отправлять строку в лист бокс.
2. Можно добавить вспомогательную колонку в таблице с формулой на проверку соответствия данных заданным критериям, и загружать в ListBox строки по признаку вспомогательной колонки, к примеру по положительному результату формулы "+".
3. Можно пункт 2 реализовать программно, но тут есть ограничения на вложения вункции If..then
4. И наверно самый простой, а значит наиболее "Mb-занимающий" и "книгозасоряющий" по моему мнению вариант - выводить данные таблицы в сводную таблицу на текущем или отдельном листе, на сводную таблицу устанавливать заданные фильтры, и просто брать результат сводной таблицы в листбокс.

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

Интересует Ваше мнение по поводу правильности предложенных ввариантов симбиоза VBA и Excel в рамках обозначенной задачи. Уверен что далеко не все варианты решения этого вопроса мне известны, но хотелось бы воспользоваться наиболее изящным способом. Вот тут и прошу Вашей консультации..

Сортировка таблицы по столбцу
Привет всем! Подскажите, пожалуйста, какой SQL-командой можно отсортировать некоторую таблицу.

Сортировка по столбцу таблицы DataGrid
Мне необходимо, что бы при создании таблицы DataGrid строки сортировались по 1 столбцу. Как это.

Сортировка по столбцу таблицы Ворд
Вся сложность в том, что имеется 6 столбцов, в 1 м номер по порядку, надо отсортировать данные 2 го.

Возьми сeбе за правило ставить в начале каждого модуля Option Explicit
и определись с переменными для начала.
Во вторых: такие сортировки лучше делать в двухмерном массиве, чем со множеством массивов.
Честно говоря даже не представляю простого способа организивать сортировку по выбранному столбцу.
Либо загонять всё в двухмерный, либо делать кучу If или Select Case что бы привязать выбранный столбец к нужному массиву (V1, V2. ).
Попробую привязать

Добавлено через 34 минуты
И зачем промежуточные назначения? В результате этих назначений-переназначений ты теряешь первое значение столбца. Так как при обработке:

Ничего не замечаешь? после 4 должно быть 5, а не 1

Добавлено через 1 минуту
И, наверное, всё-таки:

Ведь флагом является p, а не b

Добавлено через 5 минут

Столько много Case 3 тоже ни к чему хорошему не приведут!
Надо повнимательней относится к копипасту!

Добавлено через 6 минут
Этот блок вообще не нужен:

Добавлено через 7 минут
Зачем делать в одной процедуре по несколько раз

Достаточно в начале With ListBox1 и в конце процедуры End With

В процедуре Sub writelist(N As Integer) зачем каждый раз форматировать колонки и переписывать названия?

достаточно перенести непосредственно к заполнению таблицы данными

Копирование файла по выбранному итему в listbox
Доброго дня Что-то не могу реализовать. Имеются 2 ListBox, заполняются именами фалов из.

Сортировка по выбранному полю
Здравствуйте Мне нужно что бы при нажатии на название поля(колонки) проходила сортировка по этому.

Отображает список значений и позволяет выбирать одно или несколько значений.

Примечания

Если ListBox привязан к источнику данных, ListBox сохраняет выбранное значение в этом источнике данных.

ListBox может отображаться как список, так и как группа элементов управления OptionButton или CheckBox.

Свойство по умолчанию для ListBox — это свойство Value.

Событие по умолчанию для ListBox — событие Click.

В раскрывающийся элемент ListBox невозможно поместить текст.

Стили элемента ListBox

Вы можете выбрать любой из двух стилей представления элемента ListBox. Это выражается свойством ListStyle. Каждый из них реализует собственный способ выбора элементов в списке.

Если стиль 0, каждый элемент находится в отдельной строке; пользователь выбирает элемент, выделяя одну или несколько строк.

Если стиль 1, в начале каждой строки появляется OptionButton или CheckBox. В этом случае для выбора элемента пользователь нажимает кнопку или устанавливает флажок. Флажки отображаются только тогда, когда свойство MultiSelect является True.

События

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

Методы

Имя Описание
AddItem Для одного столбца ListBoxметод AddItem добавляет элемент в список. Для многоуровневого ListBox этот метод добавляет строку в список.
Clear Удаляет все записи в списке в ListBox.
RemoveItem Удаляет строку из списка в ListBox.

Свойства

Имя Описание
BackColor Возвращает или задает длинный, который указывает фоновый цвет объекта. Для чтения и записи.
BorderColor Возвращает или задает long, который указывает пограничный цвет объекта. Для чтения и записи.
BorderStyle Возвращает или задает набор integer, который указывает тип границы управления. Для чтения и записи.
BoundColumn Возвращает или задает вариант, определяя источник данных в многоуровневом ListBox. Для чтения и записи.
Column Возвращает или задает вариант, представляющие одно значение, столбец значений или двухмерный массив для загрузки в ListBox. Для чтения и записи.
ColumnCount Возвращает или задает long, представляют число столбцов, отображаемого в поле списка. Для чтения и записи.
ColumnHeads Возвращает или задает boolean, который указывает, отображается ли одна строка заголовков столбцов. Для чтения и записи.
ColumnWidths Возвращает или задает строку, которая указывает ширину каждого столбца в многослойном ListBox. Для чтения и записи.
Enabled Возвращает или задает boolean, который указывает, может ли управление получать фокус и реагировать на события, созданные пользователем. Для чтения и записи.
ForeColor Возвращает или задает длинный, который указывает цвет переднего плана объекта. Для чтения и записи.
IMEMode Возвращает или задает integer, который указывает режим времени работы по умолчанию редактора метода ввода (IME) для управления. Для чтения и записи.
IntegralHeight Возвращает или задает boolean, который указывает, отображает ли ListBox полные строки текста в списке или частичные строки. Для чтения и записи.
Список Возвращает или задает вариант, представляющие указанную запись в ListBox. Для чтения и записи.
ListCount Возвращает длинный, который представляет количество записей списка в области управления. Только для чтения.
ListIndex Возвращает или задает вариант, представляющие выбранный в настоящее время элемент в ListBox. Для чтения и записи.
ListStyle Возвращает или задает набор integer, который указывает визуальное появление списка в ListBox. Для чтения и записи.
Locked Возвращает или задает boolean, который указывает, можно ли изменить управление. Для чтения и записи.
MatchEntry Возвращает или задает набор integer, который указывает, как ListBox выполняет поиск своего списка в качестве типов пользователей. Для чтения и записи.
MouseIcon Возвращает строку, которая представляет полное имя пути настраиваемого значка, назначенного для управления. Только для чтения.
MousePointer Возвращает или задает набор integer, который указывает тип указателя, отображаемого при позиционировании пользователя мыши над определенным объектом. Для чтения и записи.
MultiSelect Возвращает или задает набор integer, который указывает, разрешает ли объект несколько выборов. Для чтения и записи.
Selected Возвращает или задает boolean, который указывает состояние выбора элементов в ListBox. Для чтения и записи.
SpecialEffect Возвращает или задает набор integer, который указывает внешний вид объекта. Для чтения и записи.
Text Возвращает или задает строку, которая указывает текст в ListBox, изменяя выбранную строку в области управления. Для чтения и записи.
TextAlign Возвращает или задает набор integer, который указывает, как текст выравнивается в области управления. Для чтения и записи.
TextColumn Возвращает или задает вариант, который идентифицирует столбец в ListBox для отображения пользователю. Для чтения и записи.
TopIndex Возвращает или задает длинный, представляютельный индекс элемента списка, отображаемого в верхней позиции в списке. Для чтения и записи.
Значение Возвращает или задает вариант, который указывает значение в BoundColumn выбранных в настоящее время строк. Для чтения и записи.

Поддержка и обратная связь

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

Читайте также: