Сортировать значения в выпадающем списке по алфавиту - PullRequest
1 голос
/ 14 мая 2009

У меня есть выпадающий список в форме пользователя для Excel. Какой самый простой способ сортировки по алфавиту? Значения для него жестко закодированы в vba, а новые просто добавляются внизу, поэтому они уже не в каком-либо порядке.

Пользовательская форма в настоящее время используется, чтобы наши пользователи могли импортировать данные из нашей базы данных в Excel. Здесь есть поле со списком, чтобы они могли указать, какие данные клиента импортировать.

Ответы [ 5 ]

2 голосов
/ 08 июля 2016

Это может быть легко следующим образом:

Sub fill_combobox()
Dim LastRow, a, b As Long, c As Variant
ComboBox1.Clear
LastRow = Sheets("S1").Cells(Rows.Count, 2).End(xlUp).Row

For x = 2 To LastRow
ComboBox1.AddItem Cells(x, 2).Value
Next
  For a = 0 To ComboBox1.ListCount - 1
  For b = a To ComboBox1.ListCount - 1
        If ComboBox1.List(b) < ComboBox1.List(a) Then
c = ComboBox1.List(a)
    ComboBox1.List(a) = ComboBox1.List(b)
    ComboBox1.List(b) = c
       End If
  Next
  Next
End Sub

Я использовал в этом шаблоне: Добавить товары в поле со списком пользователей в алфавитном порядке введите описание изображения здесь

2 голосов
/ 16 июля 2010

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

For X = 0 To COMBOBOX.ListCount - 1
  COMBOBOX.ListIndex = X
  If NEWVALUE < COMBOBOX.Value Then
     COMBOBOX.AddItem (NEWVALUE), X
     GoTo SKIPHERE
     End If
Next X
        COMBOBOX.AddItem (NEWVALUE)
SKIPHERE:
2 голосов
/ 15 мая 2009

Создание массива для сортировки не так сложно, как вы думаете. См. Список сортировки многоколонок . Вы можете поместить свойство List прямо в тип Variant, отсортировать его как массив и сбросить этот массив Variant обратно в свойство List. Все еще не замечательно, но это лучшее, что есть в VBA.

1 голос
/ 14 мая 2009

При этом используется библиотека ADO, которая, я думаю, будет доступна на большинстве компьютеров (с установленным Excel).


Sub SortSomeData()
Dim rstData As New ADODB.Recordset
rstData.Fields.Append "Name", adVarChar, 40
rstData.Fields.Append "Age", adInteger

rstData.Open

rstData.AddNew
rstData.Fields("Name") = "Kalpesh"
rstData.Fields("Age") = 30
rstData.Update

rstData.AddNew
rstData.Fields("Name") = "Jon"
rstData.Fields("Age") = 29
rstData.Update

rstData.AddNew
rstData.Fields("Name") = "praxeo"
rstData.Fields("Age") = 1
rstData.Update

MsgBox rstData.RecordCount
Call printData(rstData)

Debug.Print vbCrLf & "Name DESC"
rstData.Sort = "Name DESC"
Call printData(rstData)

Debug.Print vbCrLf & "Name ASC"
rstData.Sort = "Name ASC"
Call printData(rstData)

Debug.Print vbCrLf & "Age ASC"
rstData.Sort = "Age ASC"
Call printData(rstData)

Debug.Print vbCrLf & "Age DESC"
rstData.Sort = "Age DESC"
Call printData(rstData)
End Sub

Sub printData(ByVal data As Recordset)
    Debug.Print data.GetString
End Sub


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

1 голос
/ 14 мая 2009

VBA не имеет встроенной функции сортировки для таких вещей. К сожалению.

Один дешевый способ, который не требует самостоятельной реализации / использования одного из популярных алгоритмов сортировки, - это использование ArrayList класса .NET Framework через COM:

Sub test()
  Dim l As Object
  Set l = CreateObject("System.Collections.ArrayList")

  ''# these would be the items from your combobox, obviously
  ''# ... add them with a for loop
  l.Add "d"
  l.Add "c"
  l.Add "b"
  l.Add "a"

  l.Sort

  ''# now clear your combobox

  Dim k As Variant
  For Each k In l
    ''# add the sorted items back to your combobox instead
    Debug.Print k
  Next k

End Sub

Сделать эту процедуру частью UserForm_Initialize. Это, конечно, не удастся, если фреймворк не установлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...