2017-07-10 2 views
1

J'ai eu un problème avec les variantes "casting" d'objets définis. Au moment de l'exécution, ma variable variant est de type "Variant/Object/Listbox", que je veux définir comme une variable ListBox pour l'acheminer en tant que paramètre vers une autre fonction (GetSelected) nécessitant un objet Listbox.vba cast variant listbox/Objets

Mais j'obtiens l'erreur 13: types incompatibles sur la commande "Set lst = v".

Des idées pour le faire fonctionner?

code:

Function GetEditableControlsValues(EditableControls As Collection) As Collection 
'Gibt die Werte der editierbaren Felder zurück. 
Dim v As Variant 
Dim coll As New Collection 
Dim lst As ListBox 

For Each v In EditableControls 
    If TypeName(v) = "ListBox" Then 
     Set lst = v  'Fehler 13: Typen unverträglich. v zur Laufzeit: Variant/Object/Listbox. 
     coll.Add GetCollectionString(GetSelected(lst)) 
    Else 
     coll.Add v.Value 
    End If 
Next 
End Function 
+0

Pouvez-vous également ajouter une capture d'écran de la zone de liste? Je me demande si c'est sur un formulaire ou sur une feuille de travail. – Vityata

+1

C'est sur un MSForm. J'ai également essayé de définir la variable d'exécution sur Control comme "Dim ctl as control" au lieu de "Dim v as variant", mais la même erreur. – BruceWayne

+0

Comment appelez-vous la fonction et à quoi ressemble la collection de EditableControls? – Vityata

Répondre

0

C'est ce que j'ai jusqu'à présent:

Imaginez que vous avez un module avec le code suivant dans le:

Option Explicit 

Public Sub TestMe() 

    Dim colInput  As New Collection 
    Dim colResult  As Collection 
    Dim lngCount  As Long 
    Dim ufMyUf   As UserForm 

    Set ufMyUf = UserForm1 

    Set colInput = GetListBoxObjects(ufMyUf) 

    For lngCount = 1 To colInput.Count 
     Debug.Print colInput(lngCount).Name 
    Next lngCount 

End Sub 

Function GetListBoxObjects(uf As UserForm) As Collection 

    Dim colResult As New Collection 
    Dim objObj  As Object 
    Dim ctrCont  As Control 

    For Each ctrCont In uf.Controls 
     If LCase(Left(ctrCont.Name, 7)) = "listbox" Then 
      Set objObj = ctrCont 
      colResult.Add objObj 
     End If 
    Next ctrCont 

    Set GetListBoxObjects = colResult 

End Function 

Si vous exécutez TestMe, vous obtiendrez une collection des objets ListBox. Quoi qu'il en soit, je ne sais pas comment les transmettre à la fonction de collection, j'ai donc décidé d'itérer sur l'UserForm et donc de vérifier tous les objets qui s'y trouvent.

À la votre!