[Excel VBA] Probleme avec un type utilisateur
hummmmaaaaaahhh
-
Bidouilleu_R Messages postés 1181 Date d'inscription Statut Membre Dernière intervention -
Bidouilleu_R Messages postés 1181 Date d'inscription Statut Membre Dernière intervention -
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
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
A voir également:
- Vba inputbox type
- Clear type - Guide
- Type de ram - Guide
- Excel compter cellule couleur sans vba - Guide
- Faiblesse type spectre ✓ - Forum Jeux vidéo
- Comment changer le type de fichier - Guide
4 réponses
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+
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+
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 :-)
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 :-)
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
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
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
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
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
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