2008-12-05 9 views
2

Une zone de liste est transmise, les données sont placées dans un tableau, le tableau est trié puis les données sont replacées dans la zone de liste. La partie qui fonctionne est de remettre les données dans la liste. C'est comme la liste est passée par valeur au lieu de par ref.VBA-Tri des données dans une zone de liste, le tri fonctionne mais les données dans la zone de liste ne sont pas modifiées

Voici le sous-tri qui fait le tri et la ligne de code qui appelle le tri de sous.

Private Sub SortListBox(ByRef LB As MSForms.ListBox) 

Dim First As Integer 
Dim Last As Integer 
Dim NumItems As Integer 
Dim i As Integer 
Dim j As Integer 
Dim Temp As String 
Dim TempArray() As Variant 

ReDim TempArray(LB.ListCount) 

First = LBound(TempArray)    ' this works correctly 
Last = UBound(TempArray) - 1   ' this works correctly 

For i = First To Last 
    TempArray(i) = LB.List(i)   ' this works correctly 
Next i 

For i = First To Last 
    For j = i + 1 To Last 
     If TempArray(i) > TempArray(j) Then 
      Temp = TempArray(j) 
      TempArray(j) = TempArray(i) 
      TempArray(i) = Temp 
     End If 
    Next j 
Next i        ! data is now sorted 

LB.Clear        ! this doesn't clear the items in the listbox 

For i = First To Last 
    LB.AddItem TempArray(i)   ! this doesn't work either 
Next i 

End Sub 

Private Sub InitializeForm() 

' There's code here to put data in the list box  

Call SortListBox(FieldSelect.CompleteList) 

End Sub 

Merci pour votre aide.

Répondre

1

Vous ne pouvez pas passer des objets par valeur. Puisque vous n'allez pas renvoyer une autre instance de listbox à l'appelant, vous devez déclarer LP comme ByVal. Cela n'affecte cependant pas le code. Cela fonctionne et la liste est triée. Je pense que vous avez omis certains détails importand.

0

Cela fonctionne pour moi sur Excel 2003 sur un formulaire très simple, avec un seul ListBox appelé ListBox1:

Private Sub UserForm_Initialize() 

ListBox1.AddItem "john" 
ListBox1.AddItem "paul" 
ListBox1.AddItem "george" 
ListBox1.AddItem "ringo" 

SortListBox ListBox1 

End Sub 

puis votre SortListBox comme écrit en dehors de fixer les trois commentaires qui commencent par! plutôt que '

La seule différence avec votre initialiseur est le nom (UserForm_Initialize vs InitializeForm). Assurez-vous d'utiliser les sélecteurs d'objet et d'événement en haut de la page de code pour le userform afin de vous assurer que les gestionnaires d'événements sont nommés correctement

0

Je ne sais pas si cela fonctionnerait pour vous mais essayez-le de cette façon.

Tout d'abord, faire un tableau de tous les éléments dans la zone de liste

passer ce tableau à votre fonction

Trier ce tableau

retourne le tableau au programme principal

clair Remplacer les éléments de la liste par le nouveau tableau