[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
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
A voir également:
- Vba inputbox type
- Clear type - Guide
- Incompatibilité de type vba ✓ - Forum VB / VBA
- Vba ouvrir un fichier excel avec chemin ✓ - Forum VB / VBA
- Find vba - Astuces et Solutions
- Incompatibilité de type ✓ - Forum VB / VBA
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 310
12 nov. 2009 à 11:00
12 nov. 2009 à 11:00
Bonjour,
erreur, excusez moi
erreur, excusez moi
Bidouilleu_R
Messages postés
1181
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
12 juillet 2012
293
12 nov. 2009 à 13:45
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+
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 :-)
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 310
>
hummmmaaaaaahhh
12 nov. 2009 à 19:58
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
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
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 310
12 nov. 2009 à 15:24
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
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
Bidouilleu_R
Messages postés
1181
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
12 juillet 2012
293
13 nov. 2009 à 15:37
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
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