[Excel VBA] Probleme avec un type utilisateur

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

  1. Contributeur
    Bonjour,
    erreur, excusez moi
    0
    1. 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
      1. 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
      2. Contributeur
        @hummmmaaaaaahhhHuma, 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
    2. Contributeur
      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
      1. 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