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 :

code qui fonctionne dans un module mais pas dans un évènement


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    code qui fonctionne dans un module mais pas dans un évènement
    Bonjour à tou(te)s
    J'ai écris, non sans mal vu mon niveau en vba, un code qui ajoute des colonnes à un tableau sur une autre feuille en fonction du contenu d'une colonne dans un premier tableau.
    Je l'ai d'abord conçu dans un module le temps de le mettre au point. Ça marche. Maintenant je veux que ça se déclenche quand je quitte la feuille. J'ai donc copier/coller le code dans un événement Worksheet_Deactivate et là rien ne va plus.Erreur d’exécution '1014 : La méthode 'Range' de l'objet '_Worksheet' a échoué. Et bien sûr j'ai besoin d'aide pour comprendre...
    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
     
    Private Sub Worksheet_Deactivate() ' dans l'événement
    'Sub transfertAP() ' dans le module
    ' Création des APs dans la feuille élèves
        Sheets("liste_AP").Name = "liste_AP"
        dernLigne = Cells(Rows.Count, 1).End(xlUp).Row
        For i = 2 To dernLigne
            If Range("A" & i).Value <> "" Then
                Valeur_Cherchee = "AP" & Range("A" & i).Value
                Set PlageDeRecherche = Sheets("eleves").Rows(1)
                Set Trouve = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole)
                If Trouve Is Nothing Then
                    Range("eleves").ListObject.ListColumns.Add.Name = Valeur_Cherchee
                End If
            End If
    'vidage des variables
        Set PlageDeRecherche = Nothing
        Set Trouve = Nothing
        Next
    End Sub

    La seule différence c'est l’entête "Sub transfertAP()" ou "Private Sub Worksheet_Deactivate()" et l'endroit où il se trouve
    merci pour votre aide.

  2. #2
    Membre habitué
    Bonjour,

    Il manques toutes tes déclarations de variables.
    A+

  3. #3
    Membre habitué
    Citation Envoyé par yalehaire Voir le message
    Ça marche
    ceci fonctionne dans ton module ?

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Range("eleves").ListObject.ListColumns.Add.Name = Valeur_Cherchee

  4. #4
    Nouveau membre du Club
    Dans le module standard tout fonctionne parfaitement (du moins pour le moment).
    En effet il manque les déclarations mais pour autant que je saches ça n'est pas indispensable même si c'est plus propre et plus performant. Je m'en occuperai quand j'aurai fini de triturer le code...
    A tout hasard j'ai ajouté les déclarations :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim Trouve As Range, PlageDeRecherche As Range
    Dim Valeur_Cherchee As String, AdresseTrouvee As String

    Ca ne change rien

  5. #5
    Membre habitué
    Citation Envoyé par yalehaire Voir le message
    Dans le module standard tout fonctionne parfaitement (du moins pour le moment).
    En effet il manque les déclarations mais pour autant que je saches ça n'est pas indispensable même si c'est plus propre et plus performant. Je m'en occuperai quand j'aurai fini de triturer le code...
    J'ai testé ton code; il ne fonctionne pas même en module standard.

    Tout programme doit reposer sur une balise solide et délimitée; c'est une des clés de la réussite = déclaration des variables. Ceci montre que tu as réfléchi à tous le tenants et aboutissants.

    A+

  6. #6
    Nouveau membre du Club
    Pourtant je te garanti que chez moi il fonctionne, sinon je n'aurais pas ouvert ce topic

  7. #7
    Membre habitué
    1/ Que souhaites-tu faire avec ça
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Range("eleves").ListObject.ListColumns.Add.Name = Valeur_Cherchee
    exactement ? On va essayer de reformuler le code.
    2/ As-tu une cellule nommée "eleves" dans ton classeur ?

  8. #8
    Nouveau membre du Club
    c'est le nom d'une feuille. c'est aussi, je sais ce n'est pas très malin, le nom du tableau qui se trouve sur la feuille du même nom. "eleves[eleves]" comme adressage ça n'aide pas à la compréhension mais jusque là ça marche...
    Dans un premier tableau "list_AP" j'ai une colonne num_AP" chaque fois que je crée un nouvel AP je dois avoir une colonne équivalente dans le tableau "eleves". Je cherche donc si la colonne existe déja et si non je l'ajoute (.ListColumns) et je la nomme (.Add.Name)
    Pour la ligne concernée oui c'est exactement la même copier/coller plus 25 vérifications

  9. #9
    Membre habitué
    Il faut alors écrire :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Sheets("eleves").Range("eleves").ListObject.ListColumns.Add.Name = Valeur_Cherchee


    et ton code fonctionnera.

    Le problème viens du fait que tu est sur la page "liste_AP" lorsque ton code s’exécute.
    "Range("eleves")." n'existe pas sur cette page.

    A+ OBO
    si ça t'a aidé

  10. #10
    Nouveau membre du Club
    Merci infiniment, ça marche
    Je vais changer les noms des tableaux dans le genre tb_eleves pour celui de la feuille eleves. ça devrais éclaircir un peu le code
    Merci aussi pour la rapidité de tes réponses.

  11. #11
    Expert éminent
    Bonjour,

    si dans ton fichier, tu n'as jamais 2 listobjects sur la même page, tu peux utiliser la collection sans avoir besoin de gérer le nom de ton tableau

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Sheets("eleves").ListObjects(1)