2010-06-02 6 views
1

J'ai une base de données Access dans laquelle j'utilise un contrôle Tab (sans onglets) pour simuler un assistant. Une des pages d'onglet a un contrôle MSForms.ListBox appelé lstPorts et un bouton nommé cmdAdd qui ajoute le contenu d'une zone de texte à la zone de liste. J'essaye alors de garder le contenu du ListBox trié. Toutefois, l'appel à la méthode Sort provoque une incompatibilité de type.Incompatibilité de type MSForms.ListBox dans Access

Voici le code cmdAdd_Click() derrière:

Private Sub cmdAdd_Click() 


    Dim test As MSForms.ListBox 

    lstPorts2.AddItem (txtPortName) 
    Call SortListBox(lstPorts2) 


End Sub 

Voici le SortListBox Sub:

Public Sub SortListBox(ByRef oLb As MSForms.ListBox) 

    Dim vaItems As Variant 
    Dim i As Long, j As Long 
    Dim vTemp As Variant 

    'Put the items in a variant array 
    vaItems = oLb.List 

    For i = LBound(vaItems, 1) To UBound(vaItems, 1) - 1 
     For j = i + 1 To UBound(vaItems, 1) 
     If vaItems(i, 0) > vaItems(j, 0) Then 
      vTemp = vaItems(i, 0) 
      vaItems(i, 0) = vaItems(j, 0) 
      vaItems(j, 0) = vTemp 
     End If 
     Next j 
    Next i 

    'Clear the listbox 
    oLb.Clear 

    'Add the sorted array back to the listbox 
    For i = LBound(vaItems, 1) To UBound(vaItems, 1) 
     oLb.AddItem vaItems(i, 0) 
    Next i 

    End Sub 

Toute aide là-bas? Étant donné que la routine de tri fait explicitement référence à MSForms.ListBox, la plupart des résultats de Google ne sont pas applicables.

Jason

+0

Le code comme ceci "lstPorts2.AddItem (txtPortName)" est sloppy et dangrous. Le formulaire parent doit être spécifié, c'est-à-dire, Me! LstPorts2.AddItem (MetxtPortName) ou Me.lstPorts2.AddItem (Me.txtPortName). –

+0

Pourquoi utilisez-vous un contrôle de liste de sélection étranger? Cela me semble être une erreur de conception majeure. –

Répondre

3

Vérifiez le type de lstPorts2:

Debug.Print "TypeName(lstPorts2): " & TypeName(lstPorts2) 

Votre description ressemble lstPorts2 peut effectivement être une zone de liste d'accès plutôt que d'un MSForms.ListBox ... et ce sont les différents types d'objets. Par exemple, une zone de liste Access n'a pas la méthode Clear que vous utilisez dans votre routine de tri.

Peut-être que vous pouvez convertir à une zone de liste d'accès et ont SortListBox utiliser la méthode RemoveItem pour tous les membres listbox en tant que substitut à Effacer.

Modifier: Je ne suis pas sûr de ce que TypeName dirait pour MSForms.ListBox, donc je peux être hors base ici. Encore je voudrais ouvrir le module de formulaire, tapez Me.lstPorts2. et voir si IntelliSense offre Effacer comme l'une des méthodes/propriétés.

Je suis sur un terrain instable avec MSForms. Pouvez-vous faire de lstPorts2 une liste d'accès à la place? Si oui, je pense que la révision de SortListBox à cela pourrait fonctionner:

Public Sub SortListBox(ByRef oLb As ListBox) 

    Dim vaItems As Variant 
    Dim i As Long, j As Long 
    Dim vTemp As Variant 

    'Put the items in a variant array ' 
    vaItems = Split(oLb.RowSource, ";") 

    For i = LBound(vaItems, 1) To UBound(vaItems, 1) - 1 
     For j = i + 1 To UBound(vaItems, 1) 
     If vaItems(i, 0) > vaItems(j, 0) Then 
      vTemp = vaItems(i, 0) 
      vaItems(i, 0) = vaItems(j, 0) 
      vaItems(j, 0) = vTemp 
     End If 
     Next j 
    Next i 

    'Clear the listbox ' 
    For i = (oLb.ListCount - 1) To 0 Step -1 
     oLb.RemoveItem (i) 
    Next i 

    'Add the sorted array back to the listbox ' 
    For i = LBound(vaItems, 1) To UBound(vaItems, 1) 
     oLb.AddItem vaItems(i, 0) 
    Next i 

End Sub 

En fait, la compensation d'une zone de liste d'accès dont RowSourceType est « Liste de valeurs » pourrait être plus simple:

oLb.RowSource = "" 
+0

Intéressant. Le résultat de la Debug.Print est TypeName (lstPorts2): CustomControl Dois-je attendre qu'il apparaisse comme MSForms.ListBox? – Jason

+0

IntelliSense n'offre pas Clear en tant qu'option, donc je suppose que lstPorts est juste un objet générique (qui, si je pouvais utiliser un vrai langage, je ferais juste le cast de ce dont j'avais besoin). – Jason

1

Je suppose que la commutation de retour à un régulier ListBox a travaillé.

J'avais voulu utiliser un MSForms puisque cette liste serait peuplée de données existantes, mais l'utilisateur pourrait ajouter de nouvelles données. Tout ce que l'utilisateur ajouterait aurait un identifiant de -1, et alors tous les nouveaux seraient facilement identifiables.

Oh bien. J'apprécie grandement l'aide.

+1

Je n'arrive pas à comprendre pourquoi cela ne pourrait pas être fait avec une liste de contrôle d'accès normale. Cela ne me semble pas difficile. –

Questions connexes