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 :

Mettre à jour un tableau Excel en fonction d'un autre [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Par défaut Mettre à jour un tableau Excel en fonction d'un autre
    Bonsoir,

    J'utilise un évènement Worksheet_Change sur une feuille de mon classeur.
    Même si c'est contradictoire, je souhaiterais pouvoir affecter le code associé à cet évènement à un bouton.
    Je ne pense pas que ce soit faisable, étant donné qu'il faudrait "mémoriser" l'ensemble des évènements "Worksheet_Change" tant que le bouton n'aura pas été actionné..

    Ma question est simple : existe-t-il une astuce pour réussir à faire cela ?

    Merci d'avance.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Bonsoir,

    Je souhaiterais pouvoir affecter le code associé à cet évènement [Worksheet_Change] à un bouton.
    Si le but est d'appeler le même code lorsqu'on clic sur un bouton que lorsqu'on change d'onglet, le plus simple est de :
    - copier le code de Worksheet_Change, dans une fonction personnalisée.
    - appeler cette fonction personnalisée dans :
    * le gestionnaire d'évènement du bouton CommandButton1_Click().
    * le gestionnaire Worksheet_ChangeEn théorie, il est même possible d'appeler directement Worksheet_Change() dans le même onglet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CommandButton1_Click()
         Worksheet_Change ([A1])
    End Sub
    Mais pour une meilleure compréhension, l'utilisation d'une fonction intermédiaire est préférable.

  3. #3
    Membre éclairé Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Par défaut
    Bonsoir,

    Le but n'est pas d'effectuer une action lorsqu'on change de feuille, mais lorsqu'une modification est effectuée sur une feuille.

    Du coup, ta réponse reste-t-elle valable ?

    Pour donner une idée plus précise de ce que je cherche à obtenir, voici un exemple : je souhaite qu'à chaque modification d'une cellule par l'utilisateur, une action s'effectue dans un autre classeur (écriture d'un texte dans une cellule dépendant directement de la cellule modifiée dans le premier classeur). Seulement, et là est la difficulté que je rencontre, je voudrais que ces actions s'effectuent uniquement une fois l'ensemble des modifications de cellules effectué, sous l'action de l'utilisateur via un bouton.

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Bonjour,

    Le but n'est pas d'effectuer une action lorsqu'on change de feuille, mais lorsqu'une modification est effectuée sur une feuille.
    Le gestionnaire Worksheet_Change est bien appelé lorsqu'une cellule du classeur change de valeur.
    voir FAQ sur les évènements de feuille de calcul

    Je voudrais que ces actions s'effectuent uniquement une fois l'ensemble des modifications de cellules effectué, sous l'action de l'utilisateur via un bouton.
    Pour cela suffit d'exécuter le code lorsque l'utilisateur clique sur un bouton <mise à jour>.

    Je ne vois pas bien à quoi servirait un code réagissant à chaque changement de cellule, s'il faut attendre que toutes les cellules soient modifiées
    pour exécuter l'action.
    Est-ce qu'il faut garder une trace des cellules qui ont été modifiée, pour les distinguer de celle qui ne l'ont pas été, de façon exécuter une action spécifiques sur les cellules modifiée ?
    Dans ce cas une solution est peut être de lister les modifications dans une nouvelle feuille du classeur à partir de Worksheet_Change:
    - Col A : n° ligne de la cellule modifiée ; ColB : n° colonne de la cellule modifiée ; Col C : Nouvelle Valeur.
    - sur le clic du bouton, on parcours ces modifications pour les envoyer vers le classeur cible.
    - on efface les actions de modifications qui ont été envoyé au classeurs cible, pour le pas les refaire au prochain clic de bouton.

  5. #5
    Membre éclairé Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Par défaut
    Bonjour,

    Merci pour ta réponse. Avant d'aller plus loin, autant que j'explique clairement ce que je souhaite réaliser afin de comprendre mes intentions et voir si je peux utiliser ce que tu m'as proposé.

    J’ai un fichier constituant une base, et un fichier plus léger contenant une partie des infos présentes dans la base. Mon but est le suivant : lorsque l’utilisateur change certains paramètres du fichier léger, je souhaite que ces changements se répercutent également dans la base, une fois toutes les modifications effectuées, au moyen d’un bouton. Mon idée première était de faire des boucles For pour passer en revue l’ensemble des lignes des fichiers afin de repérer sur quelles lignes les changements ont eu lieu, puis effectuer les changements. La méthode fonctionne, mais étant donné que la base comporte plusieurs milliers de lignes, et que la plupart du temps, seules quelques modifications seront effectuées (2 à 3 à chaque fois), le temps d’exécution du code est relativement long. J’ai donc voulu optimiser le code, en ne cherchant pas à parcourir à chaque fois toutes les lignes, mais en allant directement à l’essentiel, là où les modifications ont eu lieu.

    Mes intentions sont-elles plus claires ?

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Bonjour,

    La méthode présentée précédemment peu fonctionner.

    - un onglet contient la vu partielle de la base de donnée.
    - un onglet contient la liste des modifications faite par l'utilisateur depuis la dernière mise à jour de la base.
    - un onglet (normalement dans un autre classeur contient la base de donnée complète).

    Pour copier l'ensemble des changements de valeur faites par l'utilisateur, ajouter ce code dans l'onglet contenant la vue partielle de la base,
    en changeant la couleur de fond des lignes modifiées :

    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_Change(ByVal Target As Range)
        If Target Is Nothing Then Exit Sub
     
        Dim r As Range
        Dim nextline As Integer
        nextline = Worksheets("log des changements").[A65000].End(xlUp).Row + 1
     
        Application.ScreenUpdating = False
        For Each r In Target
            With Worksheets("log des changements")
                .Cells(nextline, 1).Value = r.Row
                .Cells(nextline, 2).Value = r.Column
                .Cells(nextline, 3).Value = r.Value
            End With
     
            r.Interior.ColorIndex = 35
            nextline = nextline + 1
        Next r
        Application.ScreenUpdating = True
    End Sub
    Lorsque l'utilisateur souhaite envoyer ses modifications vers la base complète, il clique sur un bouton.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub CommandButton1_Click()
        Worksheets("log des changements").SendLog2Base
    End Sub
    La fonction SendLog2Base qui envoie les données vers l'onglet "base complète" (représentant ici la base complète),
    se trouve dans l'onglet contenant la liste des modifications utilisateurs. (onglet "log des changements").
    La couleur de fond des cellules mises à jour reprend l'état pas de couleur.

    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
    Option Explicit
     
    Sub SendLog2Base()    
        Dim wsDB As Worksheet
        Set wsDB = Worksheets("base complète")
        Dim wsSmallDB As Worksheet
        Set wsSmallDB = Worksheets("base partielle")
     
        Application.ScreenUpdating = False
        Dim r As Long
        r = 2
        With Worksheets("log des changements")
            Do While (.Cells(r, 1).Value <> "")
                wsDB.Cells(.Cells(r, 1).Value, .Cells(r, 1).Offset(0, 1).Value).Value = .Cells(r, 1).Offset(0, 2).Value
                wsSmallDB.Cells(.Cells(r, 1).Value, .Cells(r, 1).Offset(0, 1).Value).Interior.ColorIndex = 0
                r = r + 1
            Loop
        End With
     
        Worksheets("log des changements").[A2].CurrentRegion.Offset(1).ClearContents
     
        Application.ScreenUpdating = True
    End Sub
    Exemple ci-joint.
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. Lancement d'un script pour mettre à jour un tableau HTML
    Par Goltar dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 29/06/2011, 13h39
  2. mise à jour automatique tableau excel par macro
    Par fredo49 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 22/04/2011, 11h37
  3. Mettre à jour un tableau excel
    Par plonglet dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 13/11/2009, 13h37
  4. Réponses: 4
    Dernier message: 08/05/2008, 20h25
  5. mettre à jour un document Excel openXml
    Par maa dans le forum C#
    Réponses: 6
    Dernier message: 08/07/2007, 14h01

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