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 :

instruction get() let()


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2012
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2012
    Messages : 136
    Par défaut instruction get() let()
    Bonjour,

    Je dois lire plusieurs enregistements et chaque fois que le montant est à zéro je dois le conserver dans une collection d'objet.

    Je pensais utiliser get et let pour conserver l'information tous ou long de ma lecture d'enregistrement

    Mais je ne sais pas comment utiliser cette fonction s'y j'ai plusieurs items à conserver.

    Merci

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    Par défaut
    il y a plusieurs manières de faire : collection ou tableau, objet ou structure de données.

    Mais avant tout, il faut être précis sur le quoi : tu parles d'enregistrement, mais ça peut être tout et n'importe quoi. Ca peut être juste un montant, ça peut être une ligne complète lue dans un fichier, ça peut être une série de donnée(structurée ou non), etc...

    Ensuite, on pourra regarder éventuellement des solutions.

    Toutefois, si tu te contentes d'avoir une collection dans ta procédure principale, tu n'auras pas vraiment besoin de get-set(sauf éventuellement pour l'objet enregistrement); la syntaxe ressemble à :

    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
     
        dim lSides as collection
        dim mySide as Side
        dim finalSide as Side
        (.../...)
        Set lSides = new collection
        (.../...)
        'boucle de lecture des objets mySide
            lSides.Add Item:=mySide
        'fin de boucle de lecture des objets mySide
        (.../...)
        'quand on doit les lire à nouveau
        for each finalSide in lSides
            'traitement d'un élément de la collection
        next finalSide
    Evidemment, il faut avoir défini la classe Side. La mienne ressemble à :
    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
    Private myName as string
    Private myMoney as Currency
     
    Property get Name() as string
        Name = myName
    End Property
    Property get Money() as string
        Name = myMoney
    End Property
     
    Property Let Name(rName as string)
        myName = rName
    End Property
    Property Let Money(rMoney as Currency)
        myMoney = rMoney 
    End Property
    ...mais j'ai simplifié(des let-get comme ça, sans contrôle, sans rien, ça ne sert pas à grand chose, autant mettre directement la propriété en "public").

  3. #3
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2012
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2012
    Messages : 136
    Par défaut
    Merci beaucoup

    Bonjour,

    J'ai crée une requête SQL, je lis chaque enregistrement que j'écris sur feuille.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     osheet.Range("A" & i) = rsDonnees.Fields("xfo_fab")
                osheet.Range("B" & i) = rsDonnees.Fields("revision")
                osheet.Range("C" & i) = rsDonnees.Fields("id_xfo")
                osheet.Range("D" & i) = rsDonnees.Fields("term_date")
                osheet.Range("E" & i) = vMois
                osheet.Range("F" & i) = CLng(varDonnees.Fields("std-cost-total"))
    Je dois vérifier si std-cost-total est à zéro si oui je dois conserver l'information du xfo_fab et une fois le traitement des mes données terminé je dois dans une nouvelle feuille inscrire tous les xfo_fab que j'aurai inscrit dans ma collection d'objet.

    Merci

    C'est comment créer une collection d'objet que j'ai de la difficulté

    Merci de votre aide

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    Par défaut
    pour moi, sur un problème comme celui-ci, passer par l'objet est plus compliqué. Je préfère une solution du genre tableau. Mais puisque tu y tiens.....

    il te faut donc un module de classe, qu'on va appeller Champ. (insérer un module de classe, mettre "Champ" dans Name). Même pas besoin de Let et de Get, on va juste mettre des variables publiques(les get et un set sont utiles quand on veut maitriser le contenu des propriétés. Ici, pas besoin).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Option Explicit
     
    public xfo_fab as String
    public revision as String
    public id_xfo as String
    public term_date as String
    public vMois as String
    public xfo_fab as Long
    Sans information, j'ai supposé que les 5 premières variables sont des chaines de caractères. a toi d'adapter.

    Le code proprement dit, une fois que to osheet est rempli(le code que tu nous a mis à l'air honnête, je suppose que ton i vient d'un for, si c'est un wend ou autre chose, tu adaptes) :

    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
     
    Dim osheet as WorkSheet, fsheet as Worksheet
    Dim Ligne as integer
    Dim lEnregsVides as collection
    Dim myChamp as Champ
     
    (.../...)
    Set lEnregsVides = new collection
    For i = 1 to ?????
                osheet.Range("A" & i) = rsDonnees.Fields("xfo_fab")
                osheet.Range("B" & i) = rsDonnees.Fields("revision")
                osheet.Range("C" & i) = rsDonnees.Fields("id_xfo")
                osheet.Range("D" & i) = rsDonnees.Fields("term_date")
                osheet.Range("E" & i) = vMois
                osheet.Range("F" & i) = CLng(varDonnees.Fields("std-cost-total"))
                If osheet.Range("F" & i) = 0 Then
                    set myChamp = new Champ
                    myChamp.xfo_fab = osheet.Range("A" & i)
                    myChamp.revision= osheet.Range("B" & i)
                    myChamp.id_xfo = osheet.Range("C" & i)
                    myChamp.term_date = osheet.Range("D" & i)
                    myChamp.vMois = osheet.Range("E" & i)
                    myChamp.xfo_fab = 0
                    lEnregsVides.Add Item:=myChamp
                End If
    Next i
     
    For i = 1 to lEnregsVides.Count
        Set myChamp = lEnregsVides.Item(i)
        fsheet.Range("A" & i) = myChamp.xfo_fab 
        fsheet.Range("B" & i) = myChamp.revision
        fsheet.Range("C" & i) = myChamp.id_xfo
        fsheet.Range("D" & i) = myChamp.term_date 
        fsheet.Range("E" & i) = myChamp.vMois
        fsheet.Range("F" & i) = myChamp.xfo_fab
    Next i
     
    Set lEnregsVides = Nothing
    Set myChamp = Nothing
    Il y a bien plus simple pour ton problème, mais au moins tu a un exemple de collection. Les Set...= nothing à la fin ne sont pas obligatoires, mais j'ai eu avec certaines versions des surprises avec le ramasse-miettes, et j'ai pris l'habitude de tout désallouer moi-même. en théorie, ça ne sert à rien. En pratique, dans certains cas, ça limite l'impact mémoire APRES execution du programme.

Discussions similaires

  1. Question sur l'instruction GET
    Par beuzy dans le forum SAP
    Réponses: 6
    Dernier message: 13/04/2011, 11h14
  2. Problème de lecture: instruction gets
    Par fomazou dans le forum Bibliothèque standard
    Réponses: 2
    Dernier message: 03/01/2008, 21h12
  3. Probleme avec les get/ let de ma classe : je ne comprends pas l'erreur
    Par EvaristeGaloisBis dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 22/07/2007, 12h05
  4. Active X, Property Get, Let pour Icone
    Par avigeilpro dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 27/04/2007, 15h27
  5. comprend pas get/let
    Par totoche dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 17/07/2006, 15h42

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