[Excel VBA] Probleme avec un type utilisateur

Fermé
hummmmaaaaaahhh - 12 nov. 2009 à 00:06
Bidouilleu_R Messages postés 1181 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 12 juillet 2012 - 13 nov. 2009 à 15:37
Bonjour a tous

En introduction, je vous propose mon code:

Public Type SpecificationInformation2
Division As Integer
SpecificationNumber As Integer
Title As String
End Type

Option Explicit

Public Function UserInput2() As Collection
Dim Counter As Integer, file_names As Variant, Triplet As SpecificationInformation2
file_names = Application.GetOpenFilename("All Files (*.*),*.*", , "Select Specification Files", , True)

If IsArray(file_names) Then
For Counter = LBound(file_names) To UBound(file_names)
Triplet.Title = Replace(file_names(Counter), CurDir() & "\", "")
UserInput2.Add Triplet
Next Counter

End If
End Function

Cette fonction est censee extraire le titre de chaque fichier et les mettre dans une collection speciale d'un type que j'ai cree et qui possede 3 attributs.

Probleme: j'ai le message d'erreur suivant

Only public user defined types defined in public object modules can be used as parameters or return types for public procedures of class modules or as fields of public user defined types

Et apperemment ca bloque sur le mot Triplet au niveau de la ligne: UserInput2.Add Triplet

J'ai regarde des FAQ qui me disent de bien faire attention sur la portee de mon type utilisateur mais le fait est que je l'ai bien defini au niveau "public".

Voila je n'arrive pas a trouver la solution

Merci d'avance pour votre aide

4 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
12 nov. 2009 à 11:00
Bonjour,
erreur, excusez moi
0
Bidouilleu_R Messages postés 1181 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 12 juillet 2012 288
12 nov. 2009 à 13:45
bonjour,
Et apperemment ca bloque sur le mot Triplet au niveau de la ligne: UserInput2.Add Triplet

je pense que ça bloque avant...

Only public user defined types defined in public object modules can be used as parameters or return types for public procedures of class modules or as fields of public user defined types

Cela veut dire que la variable est définie mais pas initialisée.

Deplus tu ne montre pas comment tu appelles cette fonction
un exemple

sub test()

montruc=mafonction(x,y,z)

end sub

mafonction(x as integer,y as integer, z as integer) as boolean
mafonction=true
end function

cela n'est pas simple ...
mais je remarque ceci

*********************************************
dans la fonction....
Dim Counter As Integer, file_names As Variant, Triplet As SpecificationInformation2
file_names = Application.GetOpenFilename("All Files (*.*),*.*", , "Select Specification Files", , True)

If IsArray(file_names) Then
For Counter = LBound(file_names)</gras> To UBound(file_names)
Triplet.Title = Replace(file_names(Counter), CurDir() & "\", "")
UserInput2.Add Triplet
Next Counter

End If

le problème est que tu utilises une variable de type variant et que tu la passe à un tableau qui porte le même
nom d'ailleurs et excel te dit c'est pas possible....
"Seuls les types définis et qui sont définis dans les modules d'objets public peuvent être convertis depuis ou vers variant
ou passés à des fonctions à liaison tardives."

tu as définis ton variant dans la fonction et tu l'utilise comme tableau dans la fonction.
je te propose de redéfinir tes variables. une par ligne

et puis bon code....
A+
0
hummmmaaaaaahhh
12 nov. 2009 à 18:57
Merci Bidouilleur pour ta contribution. Je croyais avoir saisi le probleme mais je dois dire que certaines de tes explications me laissent encore dans l'ombre... Desole mais je ne comprends pas bien:

Only public user defined types defined in public object modules can be used as parameters or return types for public procedures of class modules or as fields of public user defined types

Cela veut dire que la variable est définie mais pas initialisée.


"Initialisee" cela veut dire quoi plus concretement? J'ai oublie une ligne de code?

le problème est que tu utilises une variable de type variant et que tu la passe à un tableau qui porte le même nom d'ailleurs et excel te dit c'est pas possible....

file_names est defini comme un variant
il recoit le tableau venant de GetOpenFilename qui est constitue de string
Je ne vois pas vraiment ce que tu veux dire par passer un variant a un tableau...

Mais je vais chercher :-)
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303 > hummmmaaaaaahhh
12 nov. 2009 à 19:58
Huma, Excusez moi d'avoir dérangé; vous avez eu raison d'ignorer ma proposition

si j'ose quand m^me dire un petit quelque chose:

ma macro fonctionne, et avec file_names déclaré en variant. Pourquoi? peut-^tre que vous savez mieux, tout les2...j'espère que vous pourrez y répondre car si je vous fait perdre du temps en me lisant, si tout du moins vous me liser, moi, j'ai perdu le lien en essayant de vous aider

encore une fois, Excusez moi
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
12 nov. 2009 à 15:24
re huma, bonjour bidouilleu_r

j'avais regardé ce matin mais...

en fait la variable de type "type" est peu compatible avec une variable "collection" car si il ya olusieurs variables dans l'index de la collection, celle ci va réclamer un array d'où le refus actuel dans la fonction de huma

ma proposition est donc de créer un array de 3 lignes (division,specif, titre) et de "n" colonnes remplacant la variable type" type" suivant le nombre de fichier sélectionnés dans file_names

Public Function UserInput()
Dim file_names As Variant, dummy As Variant
file_names = Application.GetOpenFilename("All Files (*.*),*.*", , "Select Specification Files", , True)
ReDim dummy(UBound(file_names) - 1, 2)
For Counter = 0 To UBound(dummy)
    dummy(Counter, 2) = Replace(file_names(Counter + 1), CurDir() & "\", "")
Next
UserInput = dummy
End Function

Sub test()
triplet = UserInput
'sort le titre du 1° fichier sélectionné
Range("B2") = triplet(0, 2)
' rentre la division
triplet(0, 1) = 134
'restitue
Range("B3") = triplet(0, 1)
End Sub

0
Bidouilleu_R Messages postés 1181 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 12 juillet 2012 288
13 nov. 2009 à 15:37
bonjour huma, michel_m

hier je n'ai pas eu le temps de plus me pencher sur ce code.
Merci michel pour ton code qui marche.

et pourquoi il marche ... parce que dans ton code tu ne fais pas référence à une collection
comme huma

En analysant le code de Huma excel dit :
Vous avez tenté d'utiliser un type public défini par l'utilisateur comme paramètre ou comme type renvoyé pour une procédure publique d'un module de classe, ou comme champ d'un type public défini par l'utilisateur. Seuls les types publics définis par l'utilisateur dans un module d'objet public peuvent être utilisés de cette façon

il y a peut-être un moyen de contourner le probleme.
mais la solution la plus simple c'est celle de michel.
Bon week end
0