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 :

Ecrire une fonction qui renvoie une structure de données (type)


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Ecrire une fonction qui renvoie une structure de données (type)
    Bonjour j'essais en vain de creer une fonction vba-excel qui renvoie un type 'user defined'

    Je definis le type sous la forme :
    '--------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Public Type my_type
        label As Integer
        x As Double
    End Type
    '--------------------------------
    mon test de fonction sous la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Function build(var1) As my_type
     
    ReDim Preserve build(1) As my_type
    my_type(1).label = 1
    my_type(1).x = 2 * var1
     
    ReDim Preserve build(2) As my_type
    my_type(2).label = 2
    my_type(2).x = 3 * var1
     
    End Function
    '-----------------------------------------

    et j'essaye d'appeler la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Sub main()
     
    Dim toto As my_type
     
    toto = build(10)
     
    End Sub
    Si quelqu'un peut m'aider ?

  2. #2
    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
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour,

    Voilà un exemple de comment "ça marche" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Type my_type
      a As String
      b As String
    End Type
     
     
    Private Sub Command1_Click()
      MsgBox faire("aa").a & vbCrLf & faire("aa").b
    End Sub
     
    Private Function faire(b As String) As my_type
      faire.a = "bonjour" & b
      faire.b = "hola" & b
    End Function

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut compléments
    merci de la réponse, en fait mon besoin est un peu plus compliqué.

    Je souhaite lire des données dans un fichier texte, comme par exemple dans un fichier input.txt qui contiendrait :
    ------------------------------
    pierre 20
    paul 43
    jacques 21

    Et je souhaite ranger les données dans une structure de données de type carnet, la structure doit contenir plusieurs fiches contenant les infos name et age. Du coup je ne comprends pas (d'un point de vue syntaxte ) comment on différencie l'index de la fiche et la variable d'entrée de la fonction.

    Je déclare mon type ainsi, je pense que c'est bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Public Type carnet
        name As String
        age As Integer
    End Type
    Mon ébauche de fonction ressemblerait à ça : (mais ca marche pa)
    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
     
    Function lire(filename) As carnet
     
    Open filename For Input As 1
    Do While Not EOF(1) ' Loop until end of file.
        i = i + 1
        Line Input #1, TextLine
     
        ReDim Preserve lire(i) As carnet
        lire(i).name = Mid(texline, 1, 8)
        lire(i).age = Mid(texline, 9, 8)
     
    Loop
    Close #1
     
    End Function
    Et j'appelle la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Sub main()
     
    Dim mon_carnet() As carnet
     
    mon_carnet = lire("input.txt")
     
    End Sub

  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
    Points : 5 537
    Points
    5 537
    Par défaut
    Re,

    Il s'agit là de toute autre chose : un fichier texte structuré en base de données.
    Ce type de fichier utilise en effet une structure et est lu en l'ouvrant en mode Random en utilisant l'instruction Get !
    Ouvre donc ton aide en ligne sur le mot Get. tu y trouveras un exemple on ne peit plus parlant et clair.

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    oui ca à l'air pas mal cette fonction get

    merci beaucoup

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Re fonction get
    Bonjour,

    Je m'excuse de revenir à la charge avec mes soucis.

    Mais je ne parviens pas à utiliser la fonction get.

    je me suis inspiré de l'exemple de l'aide en ligne mais ca ne marche pas, le fichier test.txt contient une liste de noms et d'ages.

    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
     
    Public Type carnet
        name As String
        age As Integer
    End Type
     
    Sub main()
    filename = "test.txt"
     
    Dim mon_carnet As carnet, position
     
    Open filename For Random As #1 Len = Len(mon_carnet)
     
    position = 1
    Get #1, position, mon_carnet   
    MsgBox mon_carnet.name
    Close #1    ' Ferme le fichier.
     
    End Sub

  7. #7
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Citation Envoyé par dinosaure Voir le message
    mais ca ne marche pas
    Tant que tu ne nous diras pas ce qui ne marche pas (Message d'erreur? Sur quelle ligne?), on ne pourra te répondre que des généralités.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  8. #8
    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
    Points : 5 537
    Points
    5 537
    Par défaut
    Je ne sais pas ce que tu fabriques !...

    Un fichier texte structuré en base de données et lisible par Get doit avoir été écrit par Put. La structure utilisée pour son écriture doit être rigoureusement identique à celle utilisée pour sa lecture.
    Il te faut donc nécessairement en connaître sa structure exacte pour pouvoir le lire ...

    Fais ce petit projet et tu vas comprendre :

    Tout en haut du code de ta userform :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Type mon_type
        nom As String * 15
        prenom As String * 30
    End Type
    Dans l'évènement click d'un bouton de commande : on va écrire des données structurées dans le fichier c;\essai.txt


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim enregistrement As mon_type, unnumero
    Open "c:\essai.txt" For Random As #1 Len = Len(enregistrement)
        For unnumero = 1 To 5
          enregistrement.nom = "un nom" & unnumero
          enregistrement.prenom = "un prenom" & unnumero
          Put #1, unnumero, enregistrement
       Next unnumero
    Close #1
    dans l'évènement click d'un autre bouton de commande :
    on va maintenant lire le fichier structuré créé, en utulisant la même structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim enregistrement As mon_type, unnumero
    Open "c:\essai.txt" For Random As #1 Len = Len(enregistrement)
        For maposition = 1 To 5
          Get #1, maposition, enregistrement
          MsgBox "enregistrement n° " & maposition & vbCrLf & _
          "nom = " & enregistrement.nom & vbCrLf & "prénom = " & enregistrement.prenom
        Next maposition
    Close #1
    Voilà ... ti as compris ?

  9. #9
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Salut à tous,

    Salut Ucfoutu,

    sauf si je n'ai pas compris, j'ai bien l'impression que le fichier texte en input n'est pas structuré, et donc que Get ne soit pas utilisable.
    Il me semble qu'il veut structurer par après.

    Mais je déraille peut_être.
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  10. #10
    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
    Points : 5 537
    Points
    5 537
    Par défaut
    Salut, Godzestla,
    Il est vain de tenter de structurer "après".
    La structure est la structure et elle doit donc :
    1) être définie avant l'écriture
    2) être utilisée à l'identique pour la lecture.

    Si, maintenant, il cherche à "établir" la structure qu'il ne connait pas d'un fichier structuré en base de données, il va lui falloir aller "à tâtons" et il n'est alors pas sorti de l'auberge... et ses tâtonnements seront d'autant plus nombreux (en progression géométrique) que le sera le nombre des champs de données !!!

Discussions similaires

  1. Réponses: 10
    Dernier message: 05/02/2015, 14h47
  2. Réponses: 6
    Dernier message: 28/04/2011, 14h19
  3. Fonction qui renvoi une structure (requette)
    Par mael94420 dans le forum ASP.NET
    Réponses: 6
    Dernier message: 05/07/2007, 13h43
  4. [9i] PLS-00320 avec une fonction qui renvoi un curseur
    Par hoaxpunk dans le forum Oracle
    Réponses: 5
    Dernier message: 09/02/2006, 17h04
  5. [VB6] Comment faire une fonction qui renvoie 2 résultats
    Par tazarine dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/01/2004, 00h13

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