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 :

Accès à une collection via un autre module [XL-365]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Par défaut Accès à une collection via un autre module
    Bonjour,

    Je bloque sur un problème que malgré mes recherches, je n'arrive pas à résoudre.

    Je travaille actuellement sur un programme qui me permettrait de récupérer des données depuis un autre fichier pour faire des analyses statistiques.

    Je n'ai qu'une liste de données, avec un grand nombre de champs (74 pour être exact).

    J'ai donc créé une collection personnalisée avec un module de classe, pour ne travailler qu'à partir de la collection, sans avoir besoin d'importer les données dans la feuille de calcul du logiciel. Je pensais que c'était une bonne idée, mais je coince sur l'utilisation de cette collection dans d'autres modules.

    J'ai déclaré en début de module ma collection en Global, mais dès l'instant où je sors du module pour générer une liste dans un UserForm, la collection semble perdue...

    Une idée?

    A l'ouverture du fichier, je démarre automatiquement la macro qui affichera le UserForm "Principal"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Public Sub Workbook_Open()
    UF_Accueil.Show
    End Sub
    Le UserForm permet, via un bouton, l'importation des données, par le choix du fichier qui le contient. De là, on appelle la procédure Importer_Fichier_Donnees dans le module Initialisation

    En début de module, je déclare ma collection en Global

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Global Sinistres As New Collection
    La procédure au sein du module ajoute chaque donnée en tant qu'objet dans la collection comme ceci :

    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
    Set Sinistre = New clSinistre
        With Sinistre
            .Numero = wbSource.Sheets(1).Cells(i, 1)
            .APM = wbSource.Sheets(1).Cells(i, 2)
            .Analysed = (wbSource.Sheets(1).Cells(i, 3) = "O")
            .Societe = wbSource.Sheets(1).Cells(i, 4)
            .Metier = wbSource.Sheets(1).Cells(i, 5)
            .Site = wbSource.Sheets(1).Cells(i, 6)
            .Immat = wbSource.Sheets(1).Cells(i, 7)
            .ImmatRemorque = wbSource.Sheets(1).Cells(i, 8)
            .DateSinistre = wbSource.Sheets(1).Cells(i, 9)
            .Annee = wbSource.Sheets(1).Cells(i, 10)
            .HeureSinistre = wbSource.Sheets(1).Cells(i, 11)
            .LieuSinistre = wbSource.Sheets(1).Cells(i, 12)
            .Client = wbSource.Sheets(1).Cells(i, 13)
            .Declaration = (wbSource.Sheets(1).Cells(i, 14) = "O")
            .Entretien = (wbSource.Sheets(1).Cells(i, 15) = "O")
            .Circonstances = wbSource.Sheets(1).Cells(1, 16)
            .NomConducteur = wbSource.Sheets(1).Cells(i, 17)
            .PrenomConducteur = wbSource.Sheets(1).Cells(i, 18)
            .DateNaissanceConducteur = wbSource.Sheets(1).Cells(i, 19)
            .AncienneteConducteur = wbSource.Sheets(1).Cells(i, 20)
            .Exploitant = wbSource.Sheets(1).Cells(i, 21)
            .AnalysePar = wbSource.Sheets(1).Cells(i, 22)
            .NbHeures = wbSource.Sheets(1).Cells(i, 23)
            .StatutConducteur = wbSource.Sheets(1).Cells(i, 24)
            .Milieu = wbSource.Sheets(1).Cells(i, 25)
            .GenreSinistre = wbSource.Sheets(1).Cells(i, 26)
            .Conditions = TabConditions
            .PropositionConducteur = TabPropositions
            .Responsabilite = wbSource.Sheets(1).Cells(i, 65)
            .Constat = wbSource.Sheets(1).Cells(i, 66)
            .DateDeclaration = wbSource.Sheets(1).Cells(i, 67)
            .UsageTelephone = (wbSource.Sheets(1).Cells(i, 68) = "O")
            .Evitable = (wbSource.Sheets(1).Cells(i, 69) = "O")
            .RaisonsEvitable = wbSource.Sheets(1).Cells(i, 70)
            .RaisonsInevitable = wbSource.Sheets(1).Cells(i, 71)
            .Consequences = (wbSource.Sheets(1).Cells(i, 72) = "O")
            .Modification = (wbSource.Sheets(1).Cells(i, 73) = "O")
            .Commentaires = wbSource.Sheets(1).Cells(i, 74)
        End With
        Erase TabConditions
        Erase TabPropositions
        Sinistres.Add Sinistre
    On rebascule ensuite sur le UserForm principal, qui autorise l'accès à un UserForm "Analyse", dans lequel, je voudrais permettre d'appliquer des filtres éventuels avant les analyses. Dans le UserForm en question, j'aimerais, si un checkbox est sélectionné, afficher dans un listbox les différentes sociétés concernées pour permettre à l'utilisateur de choisir celles sur lesquelles doit porter l'analyse

    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
    Private Sub CheckAnalyseFiltres_Click()
    Dim NbItems As Integer
    Dim ItemExiste As Boolean
    If CheckAnalyseFiltres = True Then
    NbItems = ListBoxSocietes.ListCount
        For Each Sinistre In Sinistres
            ItemExiste = False
            For i = 0 To NbItems
                If Sinistre.Societe = ListBoxSocietes(i) Then
                    ItemExiste = True
                Else
                End If
            Next i
            If ItemExiste = False Then
                ListBoxSocietes.AddItem (Sinistre.Societe)
            Else
            End If
        Next Sinistre
    Else
    End If
    End Sub
    C'est là que le problème survient, en mettant un espion pour voir comment se comporte ma collection, je m'aperçois qu'elle est vide...

    Je pourrais importer "physiquement" les enregistrements dans une feuille de calcul, ce qui me permettrait de réinitialiser la collection dans chaque module, mais ça me paraît lourd et inutile

    Je peux envoyer le fichier si nécessaire

    Merci d'avance!

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Bonjour.

    Une manière plus propre de gérer le transfert de données d'une procédure à une autre que d'utiliser une variable globale est de retourner un résultat.

    Quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim Info as collection.
    set info=LiredInfo()
    'Ici du code pour exploiter la collection Info
    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public function LireInfo() as collection
       dim result as new collection
       'ici du code pour charger les éléments dans la collection Result
       set LireInfo=result 'Transmet la collection à l'appelant
       set result=Nothing 
    end function
    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Par défaut
    En réalité, l'erreur n'était pas là où je pensais qu'elle était, il s'agissait juste d'un problème d'utilisation de ma fenêtre d'espions.

    Comme j'avais obtenu un message d'erreur, je pensais que le problème venait de là, en réalité c'était une coquille nettement plus évidente que je n'avais pas vue.

    Cependant un grand merci pour la bonne pratique que tu m'as conseillée, ça m'a au moins permis de rendre mon code un peu meilleur...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer une valeur via un autre script
    Par Olivier Regnier dans le forum Langage
    Réponses: 2
    Dernier message: 14/11/2007, 10h12
  2. Réponses: 5
    Dernier message: 16/07/2007, 10h00
  3. pointer sur une procédure d'un autre module
    Par jeje22 dans le forum VBA Access
    Réponses: 2
    Dernier message: 13/07/2007, 11h30
  4. Acces à une page via mdp
    Par fourniey dans le forum Langage
    Réponses: 2
    Dernier message: 28/02/2007, 13h48
  5. Problème d'accès à une BD via ASP
    Par beegees dans le forum ASP
    Réponses: 2
    Dernier message: 08/06/2005, 12h38

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