IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Probleme User-Defined Type/ Public Object Module


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Par défaut Probleme User-Defined Type/ Public Object Module
    Bonjour a tous

    En introduction, je vous propose mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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

  2. #2
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Par défaut Vaine tentative en remplacant la collection par un tableau
    J'ai vainement tente de remplacer la collection par un tableau en realisant le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Public Function UserInput2() As SpecificationInformation2
     
        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
     
        ReDim UserInput2(LBound(file_names) To UBound(file_names))
     
            For Counter = LBound(file_names) To UBound(file_names)
                UserInput2(Counter).Title = Replace(file_names(Counter), CurDir() & "\", "")
     
            Next Counter
     
        End If
     
    End Function
    Malheureusement, j'obtiens l'erreur suivante:

    Compile Error: Expected Array

    Incomprehensible -> normalement les tableaux dynamiques n'ont pas besoin d'etre defini, ni meme dimensionne...

    Merci d'avance pour votre aide

  3. #3
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonjour,

    on revient à ton premier message :
    SpecificationInformation2 n'étant pas une collection,mais une structure (type défini par l'utilisateur), Triplet (qui s'y conforme par sa déclaration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Counter As Integer, file_names As Variant, Triplet As SpecificationInformation2
    n'est pas non plus une collection et ne connait donc pas de méthode Add ! Triplet, de surcroît, ne peut contenir que 3 valeurs (celles de sa structure) et n'est donc pas adaptée à ce que tu cherches à faire (par ta boucle For...)

    On passe à ton second message :
    cette fois-ci, c'est carrément ta fonction que tu types comme ta structure, ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function UserInput2() As SpecificationInformation2
    alors qu'en son sein tu cherches à la traiter comme un tableau dynamique..
    ici, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim UserInput2(LBound(file_names) To UBound(file_names))
    Alors forcément ....

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Je reviens vers toi maintenant que j'ai pris mon petit-déjeuner.

    Ce que tu pourrais par contre faire, compte tenu de ce qu'est ton projet, c'est te servir d'un tableau dynamique typé comme ta structure...
    Je ne veux pas te priver du plaisir (car le développement est et doit être un plaisir) d'écrire ton code toi-même. Rien ne s'oppose par contre à ce que je te fasse comprendre par un exemple ce dont je te parle. A toi de t'en servir ensuite ...

    Exemple, donc (un userform avec un bouton de commande) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Private Type montype
      A As String
      B As Integer
      C As String
    End Type
     
     
     
    Private Sub CommandButton1_Click()
      Dim tablo(2) As montype
      tablo(0).A = "bonjour1"
      tablo(0).B = 1
      tablo(0).C = "voila1"
      tablo(1).A = "bonjour2"
      tablo(1).B = 2
      tablo(1).C = "voila2"
      tablo(2).A = "bonjour3"
      tablo(2).B = 3
      tablo(2).C = "voila3"
      MsgBox "voyons ce que tu as rentré dans ton tableau ":
      For i = 0 To UBound(tablo)
        MsgBox tablo(i).A & vbCrLf & tablo(i).B & vbCrLf & tablo(i).C
      Next
    End Sub
    Bonne étude et bonne prise de plaisir.

  5. #5
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Par défaut
    Merci ucfoutu pour tes contributions mais malheureusement, je n'arrive pas a exploiter tes reponses...

    par rapport a ta premiere reponse

    dans mon premier message

    J'utilise le type collection uniquement pour UserInput2() et c'est le type SpecificationInformation2 qui est utilise pour Triplet.
    Triplet n'etant pas une collection, je ne lui assigne aucune fonction Add (celle la est uniquement pour UserInput2)

    Ta remarque semble dire le contraire mais peut-etre me suis-je trompe?

    dans mon deuxieme message

    Je veux utiliser un tableau en le remplissant d'elements d'un type que j'ai defini

    A priori je croyais que ca se passait de la maniere suivante avec les types deja definis par Excel (exemple: String ou Integer). On fait la chose suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Tableau() As Integer
    Redim Tableau(index_bas To index_haut)
    ou pour une fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Function Tableau() As Integer
          traitements
          Redim Tableau(blablabla)
          traitements
    End Function
    Ce que je voudrais c'est donc remplacer I"Integer" dans la precedente situation par "un type que j'ai defini", mais ca ne marche po. L'erreur est peut etre ailleurs mais d'apres le message de vba ca parait focalise la dessus...

    Par rapport a ta 2e reponse

    A priori la seule difference de ton code par rapport au mien reside dans le fait que tu utilises un sub et moi une fonction...

    Je pourrais faire ca. A priori on peut toujours utiliser des procedures et jamais de fonctions: en definissant des variables a l'exterieur des procedures si bien que les procedures modifient ces valeurs qu'on a prealablement mis en argument mais ce n'est pas propre...

    N'aurais tu pas une solution avec une fonction permettant de creer un tableau avec un type utilisateur?

    Mais t'inquiete ces petites complications ne gachent pas le plaisir comme tu dis...

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    précise ta pensée, car je ne vois pas comment tu pourrais garder, sans templin à définir quelque part, le contenu déjà présent de ta fonction. Sa déclaration en public ne changerait rien !

    Preuve (exemple simple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub CommandButton1_Click()
     MsgBox toto("b")
     MsgBox toto("c")
    End Sub
     
    Public Function toto(a As String) As String
     toto = toto & a
    End Function
    Pas de concaténation, comme tu vois... Sans tremplin (qui peut être une gavriable à portée générale ou même une variable static dans la fonction ..

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub CommandButton1_Click()
     MsgBox toto("b")
     MsgBox toto("c")
    End Sub
     
    Public Function toto(a As String) As String
     Static hola As String
     toto = hola & a
     hola = toto
    End Function
    Alors : si tu chois un tremplin, c'est possible, mais je ne vois plus l'intérêt réel, dans ce cas...

  7. #7
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2017
    Messages : 5
    Par défaut
    bonjour,

    j'ai le même problème je cherche à remplir un dico avec des données présentes dans le fichier ci dessous et j'ai le message d'erreur qui s'affiche à l’écran.
    Pouvez-vous m'aider ?
    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Public Type t_reco
        titre As String
        numero As String
        classification As String
        demivie As Date
        datestand As Date
        datecrit As Date
    End Type
     
     
     
    Sub remplirdico()
    Dim var As t_reco
     
     
     
    Set recos = CreateObject("Scripting.Dictionary")
     
     
     
    For i = 2 To 17
     
        With var
     
        .titre = Range("D" & i).Value
        .numero = Range("C" & i).Value
        .classification = Range("F" & i).Value
        .demivie = Range("G" & i).Value
        .datestand = Range("H" & i).Value
        .datecrit = Range("I" & i).Value
        End With
     
     
        If reco.exist(Range("E" & i).Value) = False Then
        Set coll = New Collection
     
            recos.Add Range("E" & i).Value, var
     
        Else
        Set coll = recos.Item(Range("E" & i).Value)
        coll.Add (var)
        recos.Item(Range("E" & i).Value) = coll
        End If
     
     Next i
     
    End Sub
    je vous remercie
    edouard
    Fichiers attachés Fichiers attachés

  8. #8
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Public Type SpecificationInformation2 
    Division As Integer 
    SpecificationNumber As Integer 
    Title As String 
    End Type 
     
    Option Explicit 
     
    Public Function UserInput2() As variant 
    Dim Triplet() As SpecificationInformation2 
    redim Triplet(0)
     
     
    For Counter = LBound(file_names) To UBound(file_names) 
     
    Triplet(ubound(Triplet)).Title = Replace(file_names(Counter), CurDir() & "\", "") 
    redim preserve Triplet(ubound(Triplet)+1) 
    Next Counter 
     
    UserInput2=Triplet
    Function

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/10/2011, 13h55
  2. User-defined type not defined
    Par wajdisoft dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 20/07/2009, 19h05
  3. MouseWheel user-defined type not defined
    Par jibouze dans le forum IHM
    Réponses: 7
    Dernier message: 08/06/2006, 17h36
  4. Réponses: 5
    Dernier message: 13/03/2006, 15h51
  5. [VB]user defined type undefined???
    Par Empty_body dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 13/02/2006, 14h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo