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 :

Remplacer contenu d'une cellule


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 129
    Par défaut Remplacer contenu d'une cellule
    Bonjour,

    J'ai essayé de m'inspirer de codes que j'ai trouvés sur ce forum mais sans succès. Je cherche à remplacer le contenu des cellules d'une base de donnée avec une condition:

    Dans la colonne D, lorsque le contenu est "Toto" et que le contenu de la cellule d'après est "R3101", je souhaite remplacer "Toto" par "Tata".

    J'ai donc mis ce code:

    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
     
     
    Sub Test
     
        Dim Plage As Range
        Dim Cel As Range
     
        With ActiveSheet
     
            Set Plage = Range("D:D")
     
        End With
     
        For Each Cel In Plage
     
            If Cel.Value = "Toto" And Cel.Offset(, 1).Value = "R3101" Then ActiveCell.Value = "Tata"
     
        Next Cel
     
    End Sub
    Mais ma macro fait scotcher le pc et au bout du compte, les cellules en question ne sont même pas remplacées. Je suppose que le pc met longtemps à appliquer la condition à chaque cellule de la colonne, mais je ne vois pas ce qui pourrait aller plus vite et surtout qui ce qui marcherait!

    Merci par avance pour vos réponses

  2. #2
    Membre expérimenté
    Homme Profil pro
    développeur
    Inscrit en
    Février 2013
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : développeur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 123
    Par défaut
    Bonjour,

    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
    Sub Test
     
        Dim Plage As Range
        Dim Cel As Range
     
        With ActiveSheet
     
            Set Plage = Range("D1:D" & Range("D" & Rows.Count).End(xlUp).Row)
     
        End With
     
        For Each Cel In Plage
     
            If Cel.Value = "Encadrement Centre gestion experts" And Cel.Offset(0, 1).Value = "R3101" Then ActiveCell.Value = "CGE Toulouse"
     
        Next Cel
     
    End Sub
    Ca donne quoi comme ça?

  3. #3
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 128
    Par défaut
    Quand tu dis
    cellule d'après
    tu parles celle juste en dessous de la cellule active, ou celle à sa droite ?

    Car tu fais et dans ce cas tu regardes la cellule à droite, pas celle juste en dessous, qui serait plutôt Slooby

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 129
    Par défaut
    Merci pour le premier retour.
    Il s'agit bien de la cellule de droite, juste après.
    J'ai essayé le code de MacKay77 mais ça ne donne rien de plus. La macro ne plante pas mais la valeur ne change pas.

  5. #5
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    ça ne peut pas fonctionner car tu écris toujours la même valeur dans la même cellule : la cellule qui est sélectionnée sur la feuille

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Then ActiveCell.Value = "CGE Toulouse"
    remplacer ActiveCell par ta variable Cel


    ta procédure est doublement longue :

    - tu n'a pas désactivé le rafraichissement d'écran (Application.ScreenUpdating) durant le traitement
    - tu traites TOUTE la colonne D, au lieu de traiter uniquement la partie de ta colonne qui contient des données, il faut mieux définir ta plage (en utilisant UsedRange par exemple .... tout dépend du contexte de ton fichier et de l'agencement des données)


    Par ailleurs, tu gagnerais encore en performance en utilisant un filtre automatique (Autofilter) appliqué en colonne D (condition = "toto") et en colonne E (condition = "R3101") pour ensuite faire un remplacement de valeurs uniquement sur les lignes filtrées

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour,
    une "légèreté" et une erreur dans le code de MacKay77
    corriger ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim Plage As Range
        Dim Cel As Range
     
        With ActiveSheet
     
            Set Plage = Range("D1:D" & Range("D" & Rows.Count).End(xlUp).Row)
     
        End With
     
        For Each Cel In Plage.cells ' ne pas être léger. Préciser cells
     
            If Cel.Value = "Encadrement Centre gestion experts" And Cel.Offset(0, 1).Value = "R3101" Then cel.Value = "CGE Toulouse" ' car c'est cette cellule cel, que l'on veut modifier
     
        Next Cel

  7. #7
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    J'ajoute que le bloc "With ActiveSheet" est totalement superflu pour deux raisons :

    - le Range du bloc n'y est pas rattaché, il manque le point ;
    - si on avait mis le point ... ben ça sert à rien de toute façon puisqu'on est sur la feuille active quoi qu'il arrive, même si le point est omis


    donc le bloc peut être supprimé, ou alors modifié pour spécifier la feuille (par son nom, son codename, son index, par variable etc...) autrement qu'un objet actif


    Et quitte à pousser l'optimisation, la variable Plage est inutile, on ne l'utilise qu'une fois

    au lieu de faire un Set Plage = Range(MonTruc) pour ensuite faire un For Each Cel in Plage.Cells .... autant directement faire For Each Cel in Range(MonTruc).Cells
    Et pour conclure, je reviens sur le filtre automatique, solution reine pour ton problème

  8. #8
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonsoir,
    cellule à droite "Offset(0,1)", je confirme

    Quant à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For Each Cel In Plage
     
            If Cel.Value = "Encadrement Centre gestion experts" And Cel.Offset(0, 1).Value = "R3101" Then ActiveCell.Value = "CGE Toulouse"
     
        Next Cel
    C'est quoi " ActiveCell.Value"
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

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

Discussions similaires

  1. Remplacer le contenu d'une cellule par une valeur sous condition
    Par zoocoral dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 13/11/2015, 06h50
  2. Remplacer le contenu d'une cellule par d'autres
    Par yezispam dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/04/2015, 15h05
  3. [XL-2007] Remplacer contenu d'une cellule en se basant sur une liste pré-établie
    Par Unbreakable72 dans le forum Excel
    Réponses: 2
    Dernier message: 27/11/2013, 15h54
  4. remplacer le contenu d'une cellule par un autre avec une macro
    Par valentin31 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/11/2012, 09h02
  5. Importer le contenu d'une cellule Excel vers Access
    Par deaqu1 dans le forum Access
    Réponses: 7
    Dernier message: 05/11/2005, 15h26

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