2009-05-13 6 views
1

Excel 용 userform에 콤보 박스가 있습니다. 알파벳 순으로 정렬하는 가장 쉬운 방법은 무엇입니까? 그것의 값은 vba에 하드 코딩되어 새로운 것들은 아무런 순서없이 이미 바닥에 추가됩니다.콤보 상자 값을 알파벳 순으로 정렬하십시오.

우리의 사용자가 우리 데이터베이스의 데이터를 Excel로 가져올 수 있도록 userform이 현재 사용되고 있습니다. 콤보 박스가 있으므로 가져올 클라이언트 데이터를 지정할 수 있습니다.

+0

이이 분야의 목록입니다 및/또는 테이블? 데이터베이스의 스키마를 사용하여 하드 코드 된 목록이 아닌 목록 상자를 채우는 것을 고려 했습니까? – Fionnuala

+0

목록은 아마도 어떤 식 으로든 나에게 올 것이므로 좋은 지적이다. 내가 볼 수있는 유일한 문제는 보안 및 성능 문제입니다. 제안 해 주셔서 감사합니다. –

답변

0

VBA에는 이러한 것들을위한 내장 정렬 기능이 없습니다. 운수 나쁘게. 자신이 COM을 통해 .NET 프레임 워크의 ArrayList 클래스를 사용하는 것입니다 인기 정렬 알고리즘 중 하나를 사용하여/구현 포함되지 않습니다

싸게 방법 :

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의 일상적인 부분을 확인합니다. 프레임 워크가 설치되지 않은 경우 물론 실패합니다.

+0

답변 주셔서 감사합니다. 그러나이 기능은 다른 사람들의 컴퓨터에서 엑셀 추가 기능으로 구현됩니다. 닷넷 프레임 워크를 사용하기는하지만 그들이 가지고있는 것을 확신 할 수있는 방법은 없습니다. –

+0

예. 이 경우 VBA에서 사용할 수있는 많은 정렬 솔루션 중 하나를 사용해야합니다. 다음은 Heapsort를 사용하여 Google을 통해 발견 한 무작위입니다. http://www.source-code.biz/snippets/vbasic/1.htm – Tomalak

+0

아마도 최소한의 거품 덩어리로도 성능이 저하 될 수 있지만, 콤보 상자 항목 중. 코드가 적습니다. – Tomalak

0

이것은 Excel이 설치된 대부분의 컴퓨터에서 사용할 수있는 ADO 라이브러리를 사용합니다.

 

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 

 

희망 사항은 시작하기에 충분한 배경을 제공합니다.
FYI - 이것은 연결이 끊긴 레코드 세트입니다 (메모리 테이블에 대한 .net 데이터 세트의 간단한 버전).

2

정렬 할 배열을 만드는 것은 생각만큼 어렵지 않습니다. Sorting Mulicolumn Listbox을 참조하십시오. List 속성을 Variant 형식에 넣고 배열로 정렬 한 다음 Variant Array를 List 속성으로 다시 덤프 할 수 있습니다. 그래도 대단한 것은 아니지만 VBA가 최고입니다.

2

추가 할 때 이미 콤보 상자에있는 값과 비교하십시오. 귀하가 만난 품목보다 적 으면 품목을 교체하십시오. 이보다 작지 않은 경우 항목이 적을 때까지 계속 이동하십시오. 항목을 찾을 수없는 경우 끝에 추가하십시오.

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: 
0

다음과 같이 쉽게 될 수있다 :이 템플릿에 사용했다

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 

: 은 알파벳 순서로 정의 폼 콤보 상자 속으로 항목을 추가 enter image description here

관련 문제