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 :

Code VBA remplacement automatique par une liste de mots [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 16
    Par défaut Code VBA remplacement automatique par une liste de mots
    Bonjour tous le monde,

    Je suis très contente d'être sur ce forum et j'espère que cela me permettra de m'améliorer en VBA...

    Je viens vers vous car toutes mes recherches se sont révélées infructueuses..

    En fait j'ai plusieurs fichier excel composer d'une dizaine/vingtaine de feuille. Dans ces feuilles se trouve des BDD et des tableaux récapitulatifs. Mon soucis est que dans les différentes feuilles de base de données, je n'ai pas les mêmes intitulés de poste pour la même chose.

    C'est a dire que j'ai Infirmière (colonne B) devant Mme Jouland (Collone A) sur une feuille et Inf. (colonne B) devant Mme Jouland (Colonne A) également sur une autre feuille. Alors que cela signifie la même chose.
    Et mes tableaux récapitulatif sont des Somme si matricielle qui se base au nom du poste... donc comme les intituler sont différents cela ne prend pas touts en compte.

    La fonction Rechercher-Remplacer fonctionne niquel et c'est ce que j'aimerai automatiser car j'ai environ 180 abréviations différentes...

    Pour cela j'ai déjà créer un tableau qui récapitule toutes mes abréviations et qui les fait correspondre au bon nom dans une feuille:

    Colonne A     Colonne b
    Inf.          Infirmier
    Infirmière    Infirmier
    IDE           Infirmer 
    ...
    Je pensais utiliser texte et replace mais je ne sais pas comment faire avec une liste ..

    J'espère que vous pourrez m'aider,
    Car je ne comprend pas le code qu'il y a déjà sur une autre page du forum qui est trop compliquer a modifier pour mon niveau je pense.
    Merci d'avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Bonjour,

    Tu ne peux pas faire de rechercher/remplacer sur une liste mais tu peux faire un rechercher/remplacer par éléments de ta liste, il suffit de faire une boucle.

    Pour commencer active l'enregistreur de macro et fait un remplacement puis ferme le et poste le code.
    Donne aussi l'emplacement de ta liste.

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 16
    Par défaut
    Bonjour,

    J'ai essayer en enregistrant une macro mais ca ne fonctionne pas comme j'aimerai car il ne répète pas la manip à chaque ligne de mes bases de données.

    Voici un fichier type si vous souhaitez.

    Merci pour votre réponse en tout casClasseur1.xlsx

    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
    Sub Macro1()
    '
    ' Macro1 Macro
    '
     
    '
        Range("F2").Select
        Selection.Copy
        Sheets("Info.complémentaires").Select
        Range("B4").Select
        Application.CutCopyMode = False
        Selection.Copy
        Sheets("Données").Select
        Cells.Replace What:="Adjoint administratif", Replacement:= _
            "Adjoint administratif", LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase _
            :=False, SearchFormat:=False, ReplaceFormat:=False
    End Sub

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Il faut que tu fasses deux boucles.
    Une première boucle "For to" qui va scruter l'ensemble des lignes de ta liste pour récupérer le texte à chercher et le texte de remplacement.
    Une seconde boucle "For Each" qui va scruter chaque feuille de ton classeur pour y lancer le remplacement.

    Malheureusement, la méthode Replace ne semble pas pouvoir s'appliquer (étrangement) à un objet Workbook pour lancer un remplacement sur un classeur entier comme on peut le faire à la main.

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 16
    Par défaut Merci
    Merci beaucoup pour votre réponse.

    J'ai réussi a obtenir un code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Option Explicit
    Sub Valeurs_remplacer()
        Application.ScreenUpdating = False
        Dim c As Range
        Application.ScreenUpdating = False
        For Each c In Sheets("Feuil1").Columns(1).SpecialCells(xlCellTypeConstants)
            Sheets("Feuil2").Columns(6).Replace c, c(1, 2), xlWhole
            Sheets("Feuil3").Columns(7).Replace c, c(1, 2), xlWhole
        Next
        Application.ScreenUpdating = True
    End Sub
    Maintenant j'aimerai que cela se fasse à chaque changement dans la feuille, mais c'est des copier coller vous pensez qu'il verra le changement?

  6. #6
    Membre très actif
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Mai 2014
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 393
    Par défaut
    Si tu veux que ton code s'exécute à chaque changement dans une feuille, alors il faut que dans chaque feuille tu fasses appel à cette fonction, à mettre à chaque fois dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
        Call Valeurs_remplacer
    End Sub
    Attention par contre à la récurrence qui risque d'être infinie. Je n'ai pas encore réfléchi à comment la contourner

  7. #7
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Si tu as plus de deux onglets à modifier, il vaudrait mieux faire une boucle For Each sur la collection WorkSheets de ActiveWorkbook pour faire tourner ton Replace.
    Mais c'est vrai qu'avec seulement deux onglets, ça ne vaut pas le coup.

    Citation Envoyé par summerfllore Voir le message
    Maintenant j'aimerai que cela se fasse à chaque changement dans la feuille, mais c'est des copier coller vous pensez qu'il verra le changement?
    C'est possible avec une macro évènementielle Change appliquée à chaque feuille de calcul ou dans le SheetChange de Workbook.
    https://msdn.microsoft.com/fr-fr/lib.../ff839775.aspx
    https://msdn.microsoft.com/fr-fr/lib.../ff196611.aspx
    Mais je te le déconseille car ça risque de rendre ton fichier très lourd à utilisé (à chaque saisie, il lancera toute la série des Replace).

    Je te conseille plutôt de mettre cette macro dans un évènement moins fréquent comme Workbook_Open (la modification sera faite à chaque ouverture du fichier) ou Workbook_SheetDeactivate (macro lancée chaque fois qu'on change de feuille).
    https://msdn.microsoft.com/fr-fr/lib.../ff196215.aspx
    https://msdn.microsoft.com/fr-fr/lib.../ff838589.aspx
    Comme ça, ça ne modifiera pas le confort de saisie mais le fichier sera quand même régulièrement et automatiquement nettoyé.

  8. #8
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    En supposant que ta liste de correspondance est en Feuil1.

    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
    Option Explicit
    Sub Valeurs_remplacer()
        Dim c As Range
        Dim Onglet As Worksheet
     
        Application.ScreenUpdating = False
     
        For Each Onglet In ActiveWorkbook.WorkSheets
            If Onglet.Name <> "Feuil1" Then
                For Each c In Sheets("Feuil1").Columns(1).SpecialCells(xlCellTypeConstants)
                    Onglet.UsedRange.Replace c, c(1, 2), xlWhole
                Next c
            End If
        Next Onglet
     
        Application.ScreenUpdating = True
     
    End Sub
    Pour rendre les modifications automatiques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Source As Range) 
        Dim c As Range
        For Each c In Sheets("Feuil1").Columns(1).SpecialCells(xlCellTypeConstants)
            Target.Replace c, c(1, 2), xlWhole
        Next c
    End Sub

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

Discussions similaires

  1. [WD-2007] Remplacement automatique d'une liste de mots
    Par Pyanepsion dans le forum Word
    Réponses: 11
    Dernier message: 02/05/2012, 07h56
  2. Réponses: 1
    Dernier message: 13/08/2007, 22h59
  3. [VBA] remplacer null par une chaine de caractère
    Par Bernard123 dans le forum VBA Access
    Réponses: 8
    Dernier message: 20/04/2007, 16h35
  4. [VBA-E]Mise à jour de cellule alimentée par une liste
    Par moritan dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/01/2007, 06h11
  5. [Debutant]Remplacer une liste de valeur par une liste de val
    Par Sebbo dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 31/03/2006, 12h15

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