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 :

[VBA Excel] différentes plages sur différentes feuilles


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 183
    Par défaut [VBA Excel] différentes plages sur différentes feuilles
    Bonjour,

    Je travaillais jusqu'ici sur une seule feuille nommée "Listes". J'ai réalisé un module de classe qui automatise certains traitement sur des objets range. Chacun de ces modules à un et seulement un objet range. L'objet range est une simple plage qui n'appartient qu'à une seule feuille.

    Mais voilà, sur la dernière ligne droite de mon appli j'ai besoin de travailler sur une deux feuilles. La première c'est "Listes" et l'autre "Releves". Pour la feuille "Releves" j'ai eu besoin d'instancier un module de classe pour obtenir un range.

    Dès le moment ou j'ai lancé l'appli cela n'a plus marché. Je suis certain que le problème ne vient pas de mon module de classe que j'ai testé et retesté sans arrêt.

    Je me suis donc dis qu'il fallait d'abord activer la feuille sur laquelle on travaille, mais rien n'y a fait, ça refuse de fonctionner.

    Message d'erreur :

    Erreur d'execution '1004':

    Erreur définie par l'application ou par l'objet



    Phase de test :

    Il s'est trouvé que le bug ne survenait pas toujours au même endroit, ce qui semble totalement illogique. En fait, lorsque la feuille excel qui est ouverte n'est pas la même que celle avec laquelle je travaille avec l'objet range, c'est la que ça plante.


    Je remercie de bien vouloir m'aider sur ce problème délicat.

  2. #2
    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 : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Sans ton code, on ne pourra te donner que des réponses théoriques... ou à côté de la question.
    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!

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 183
    Par défaut
    Voici l'initialisation de la form qui doit travailler sur 2 feuilles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub UserForm_Initialize()
     
            ' On initialise les plages en fonction des données de la feuille excel
     
        Call intialisationPlages
     
            ' On initialise la liste des noms des sites existants
     
        Call definirListe(zl_sites, plageSite.getPlage("nomSite"))
     
    End Sub
    Maintenant voici la procédure sur laquelle l'erreur se produit (elle se trouve dans un module) :

    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
    Option Explicit
     
     
    Public plageSite As New C_Plage
     
    Public plageSalle As New C_Plage
     
    Public plagePiege As New C_Plage
     
    Public plageDate As New C_Plage
     
    Public plageReleve As New C_Plage
     
     
     
    Public Sub intialisationPlages()
     
             ' Le bug survient ici si la feuille "Releves" est actuellement visionnée
        Call plageSite.definirPlage(1, 2, "Listes")
        Call plageSalle.definirPlage(4, 3, "Listes")
        Call plagePiege.definirPlage(8, 3, "Listes")
        Call plageDate.definirPlage(12, 3, "Listes")
     
             ' Le bug survient ici si la feuille "Listes" est actuellement visionnée
        Call plageReleve.definirPlage(1, 7, "Releves")
     
    End Sub
    Maintenant voici une partie du module de classes (avec les données et la méthode definirPlage() ) :

    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
    Option Explicit
     
            ' Données privées
     
    Private yDebut As Integer
     
    Private nbLignes As Integer
    Private nbColonnes As Integer
     
    Private maPlage As range
    Private maFeuille As String
     
            ' Méthodes publiques
     
    Public Sub definirPlage(ByVal y As Integer, ByVal colonnes As Integer, ByVal feuille As String)
     
        Dim i As Integer
        i = 2
     
        maFeuille = feuille
        yDebut = y
        nbColonnes = colonnes
     
            ' Tant que la cellule n'est pas vide on incrémente et on teste la suivante
        Do While Not IsEmpty(Worksheets(maFeuille).Cells(i, y))
            i = i + 1
        Loop
     
        nbLignes = i - 1
     
        Set maPlage = Worksheets(maFeuille).range(Cells(1, y), Cells(nbLignes, y + nbColonnes - 1))
     
     
    End Sub

  4. #4
    Membre Expert Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Par défaut
    Et si, avant les 4 appels à "definirPLage" de la feuille "Listes", tu fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ActiveWorkbook.WorkSheets("Listes").Activate
    et que juste avant le 5è, sur l'onglet "Releves", tu mets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ActiveWorkbook.WorkSheets("Releves").Activate
    ?
    L'erreur persiste?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 183
    Par défaut
    Et non j'y ai pensé, mais y'a rien à faire VBA veut ma mort.

  6. #6
    Membre Expert Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Par défaut
    Et la fonction "definirListes", elle est où? Si on avait le code...
    J'essaie de reproduire chez moi.

  7. #7
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Salut
    J'ai deux questions :
    - A quoi te sert la variable "yDebut" ? J'ai pas vu où tu t'en sert
    - Pourquoi dans ton module de classe tu déclares tes variables en privé ?

    c'est juste pour comprendre merci

    Igloobel

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 183
    Par défaut
    - Pourquoi dans ton module de classe tu déclares tes variables en privé ?
    On appelle cela l'encapsulation. C'est pour empêcher le développeur d'accéder n'importe comment aux données. Si on doit tout de même permettre à l'utilisateur d'accéder à certaines données, on crés des méthodes ascesseurs et pour les modifier des méthodes mutateurs.

    Et la fonction "definirListes", elle est où? Si on avait le code...
    Ca ne t'avancerais pas plus, l'erreur se produit avant son appel.

    - A quoi te sert la variable "yDebut" ? J'ai pas vu où tu t'en sert
    Dans la méthode definirPlage, je me sers directement de y qui est une variable locale (puisque passée en paramètres de la méthode). Par la suite, dans les autres méthodes, puisque je n'y ait plus accès j'utilise yDebut.


    C'est un problème bien étrange qui ne devrait normallement pas se produire. Je pensais avoir pris les dispositions pour changer de feuille à loisir, apparement ce n'est pas le cas.

    Je vous remercie en tout cas pour l'aide que vous m'apportez.

  9. #9
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    OK OK

    Je suis plutôt novice en POO merci pour ton explication

    Igloobel

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 183
    Par défaut
    Voici tout de même la fonction definirListe. Elle se trouve dans un module normal et est donc accécible de partout :

    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
    Public Sub definirListe(ByVal monControle As Control, ByVal laPlage As range)
     
        Dim i As Integer
        Dim nb As Integer
     
        If Not (laPlage Is Nothing) Then
     
            nb = laPlage.Count
     
            For i = 1 To nb
                monControle.AddItem laPlage.Item(i)
            Next
     
        End If
     
    End Sub

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 183
    Par défaut
    Megaxel : Toutes mes escuses, il semblerait que le problème vienne de cette fonction puisque lorsque je la désactive, l'initialisation marche à merveille.

    Merci encore pour tout

  12. #12
    Membre Expert Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Par défaut
    Juste au hasard, ce n'est pas une histoire de "je met Call ou je ne met pas Call" à l'appel de ma procédure, ou de "Je mets des parenthèses ou je n'en met pas autour de mes paramètres?

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 183
    Par défaut
    Non non ce n'est pas du tout ça. C'est que lorsque je fais appel à une méthode de mon module de classe, celle-ci utilise quasi tout le temps l'objet range. Et donc puisque à l'initialisation la dernière feuille activée est "Releves", et que lorsque je rempli la liste modifiable je vais chercher des données de la plage site qui se trouve dans "Listes", ça boggue.

    Pour résoudre le problème, chaque méthodes de mon module de classe active la feuille dont celui-ci dépend.

    Un problème de fou !!

    Merci et bonne continuation.

  14. #14
    Membre Expert Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Par défaut
    Bon, ben du coup, on n'a pas fait grand-chose...
    Mais si ça marche, alors je suis content!

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 183
    Par défaut
    Sisi grâce à toi j'ai pu comprendre d'où venait l'erreur et plus rienque le fait de mettre le problème par écrit m'a permit de mieux l'assimiler.

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

Discussions similaires

  1. VBA Excel:Mettre en lien 2 feuilles Excel de classeurs différents
    Par patelsa dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/05/2008, 13h09
  2. [VBA-Excel] - protection plage de cellule sur i feuilles
    Par Chewi dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 01/02/2007, 16h52
  3. [Vba-Excel] Récupérer événement sur une cellule
    Par steps5ive dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/04/2006, 20h27
  4. [VBA][EXCEL]Goto a travers différent module
    Par Ania dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 19/12/2005, 09h32
  5. [excel] même code sur plusieurs feuilles
    Par sabotage dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/11/2005, 12h23

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