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 :

Problème d'un rechercher/remplacer spécifique (!PC et MAC!) [XL-MAC 2011]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Bonsoir,
    Pouvez vous m'aider sur le problème suivant (je tourne en rond, en rond…) : je cherche à faire un rechercher/remplacer/ajouter :

    - J'ai une feuille1 avec des Réf. en col A et une feuille 2 aussi avec des Réf. tjs en col A; pour chacune des références sur les feuiles 1 et 2 j'ai des infos qui leurs corresponds qui vont de col B à H
    Exemple : Feuil1 —> REF_A | INFO_1 | INFO_2 | INFO_3 | INFO_4 | INFO_5 | INFO_6 | INFO_7
    Exemple : Feuil2 —> REF_A | INFO_8 | INFO_9 | INFO_7 | INFO_2 | INFO_6 | INFO_5 | INFO_1

    - Mon code scan chaque ligne de la col A de la feuille 1 une à une pour retrouver la même Réf. en Feuil2 de la col A
    - Si les réfs correspondent entre la feuil1 et la feuil2, je copie colle les infos de la feuil1 de A&i:H&i (i étant la ligne scanée) sur la feuil2 de A&Num_ligne:H&Num_ligne (Num_ligne étant le N° de ligne de la feuil2)
    - Dans le cas où il n y a pas de réf correspondante entre la feuil1 et la feuil2 j'ai une erreur; dans ce cas la réf de la feuil1 est copié aprés la derniere réf de la feuil2 et ca la ou ca me pose problème

    Pouvez vous m'aidez aussi a optimisé mon code svp.

    PS : soyez indulgent ça fait qu'une semaine que je viens de commencer le vba et à intermittence.
    Bref de blabla le 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Sub Remplace()
    Dim i As Integer
     
    Application.ScreenUpdating = False
     
    DerNum_Ligne_A = Worksheets(1).Range("A" & Rows.Count).End(xlUp).Row
    Plage_A_Col = Worksheets(1).Range("A1:A" & DerNum_Ligne_A)
     
    DerNum_Ligne_B = Worksheets(2).Range("A" & Rows.Count).End(xlUp).Row
    Plage_B_Col = Worksheets(2).Range("A1:A" & DerNum_Ligne_B)
     
    For i = 1 To DerNum_Ligne_A
     
          On Error GoTo ErrorHandler
     
          MaRef_A = Worksheets(1).Cells(i, 1).Value
     
          Num_Ligne = Application.Match(MaRef_A, Plage_B_Col, 0)
     
          MaRef_B = Worksheets(2).Cells(Num_Ligne, 1).Value
     
          Worksheets(1).Activate
          Set Plage_A = Range("A" & i & ":" & "H" & i)
          Plage_A.Select
          Selection.Copy
     
          Worksheets(2).Activate
          Set Plage_B = Range("A" & Num_Ligne & ":" & "H" & Num_Ligne)
          Plage_B.Select
          Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
          False, Transpose:=False
     
          Exit Sub
     
          ErrorHandler:
     
          Worksheets(1).Range("A" & i & ":" & "H" & i).Select
          Selection.Copy
          Worksheets(2).Cells(Rows.Count, 1).End(xlUp)(2).Select
          Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
          False, Transpose:=False
     
          Resume Next
     
     Next i
     
    End Sub
    le premier code que j'ai retourné dans tous les sens avant d'arriver a ce résultat
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    Sub Boucle()
    Dim i As Integer
     
    Application.ScreenUpdating = False
     
    DernLigne1 = Worksheets(1).Range("A" & Rows.Count).End(xlUp).Row
    MaPlage1 = Worksheets(1).Range("A1:A" & DernLigne1)
     
    DernLigne2 = Worksheets(2).Range("A" & Rows.Count).End(xlUp).Row
    MaPlage2 = Worksheets(2).Range("A1:A" & DernLigne2)
     
    For i = 1 To DernLigne1
          MaRef = Worksheets(1).Cells(i, 1).Value
     
          Ligne = Application.Match(MaRef, MaPlage2, 0)
     
          MsgBox Ligne, vbOKOnly, "Numéro de ligne"
     
          MaRef2 = Worksheets(2).Cells(Ligne, 1).Value
     
          If MaRef = MaRef2 Then
     
          Worksheets(1).Activate
          Set REFA = Range("A" & i & ":" & "H" & i)
          REFA.Select
          Selection.Copy
     
          Worksheets(2).Activate
          Set REFB = Range("A" & Ligne & ":" & "H" & Ligne)
          REFB.Select
          Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
           False, Transpose:=False
     
           Else
     
           Worksheets(1).Range("A" & i & ":" & "H" & i).Select
           Selection.Copy
           Worksheets(2).Cells(Rows.Count, 1).End(xlUp)(2).Select
           Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
           False, Transpose:=False
     
           End If
     
     Next i
     
    End Sub
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Bonjour,

    je n'ai pas cherché à corriger le code dépassant vingt lignes pour une simple copie !

    Même si la logique est bonne, un code pur VBA est bien moins efficace (car interprété)
    que celui conçu autour des fonctionnalités internes d'Excel (pré-compilées elles !) …

    En respectant la règle TBTO, démonstration testée sur une version Windows
    avec des données contigües (bloc sans ligne ni colonne vide) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Demo()
        Dim Rc As Range, Rw As Range
        Application.ScreenUpdating = False
     
        For Each Rw In Feuil1.Cells(1).CurrentRegion.Rows
            With Feuil2.Cells(1).CurrentRegion.Columns(1)
                    Set Rc = .Find(Rw.Cells(1).Value)
                     If Rc Is Nothing Then Set Rc = .Cells(.Rows.Count).Offset(1)
                Rw.Copy Rc
            End With
        Next
     
        Set Rc = Nothing
    End Sub
    Un bon code n'utilise pas de Select ni d'Activate surtout au sein d'une boucle ! Sinon ralentissement …

    _____________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

    _____________________________________________________________________________________________________
    Je suis Charlie - Je suis Bardo


    Désolé, je n'avais pas vu l'utilisation de la fonction de feuille de calculs EQUIV et la copie des valeurs uniquement …

    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 Demo2()
        Dim Rw As Range
        Application.ScreenUpdating = False
     
        With Feuil2
            With .Cells(1).CurrentRegion
                C& = .Columns.Count
                R& = .Rows.Count
            End With
     
            For Each Rw In Feuil1.Cells(1).CurrentRegion.Rows
                V = Application.Match(Rw.Cells(1).Value, .Cells(1).Resize(R), 0)
                If IsError(V) Then R = R + 1: V = R
                .Cells(V, 1).Resize(, C).Value = Rw.Value
            Next
        End With
    End Sub
    La variable V est de type Variant afin de ne pas déclencher d'erreur …

    _____________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

  3. #3
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    Marc-L , il est incroyable ton code
    dire que ca fait plusieur jours que je me retourne le pbm
    c'est vaiment efficace
    j'ai loin d'avoir ton niveau
    est il possible d'avoir des annotations pour mieux comprende ton code??
    j'étais sur la bonne piste avec le On Error… ??

    en tout cas merci

    il faut que je teste avec mon fichier principal car la feuille 1 les valeurs sont données par des formules excel

    je crois que nos messages sont decalé lol

    c'est pas grave en tout cas merci pour tes réponses rapide
    Désolé, je n'avais pas vu l'utilisation de la fonction de feuille de calculs EQUIV et la copie des valeurs uniquement …
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  4. #4
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Voir ma Demo2 : pas besoin d'instruction On Error avec une variable de type Variant


    Afin de comprendre, voici la méthode la plus efficace (qui me sert encore) :
    positionner dans le code le curseur sur une instruction, appuyer sur la touche puis consulter l'aide VBA !

    Je te laisse donc faire l'effort de la rétro-analyse car c'est bien plus formateur …


    Et ne pas oublier :
    _____________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

    _____________________________________________________________________________________________________
    L'effort fait les forts …

  5. #5
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut
    C'est vrai tu as raison, c'est plus formateur
    d'ailleurs c'est comme ca que j'ai fait mon code en analysant les codes, les définitions sur internet et aussi sur mes connaissances des formules sur exel
    d'ou le choix de Equiv qui me parraissait bien plus judicieux quand je l'ai fait

    Par contre j'aimerais bien savoir ou j'ai foiré avec le On error GoTo … je pensais l'avoir compris
    mais je pense que j'étais pas loin du résultat (attention j'adopte entièrement ton code) mais j'aime bien aller au bout des choses et comprendre mes erreurs

    Sinon c'est passé nickel sur mon fichier source

    grand merci

    Re, je n'ai pas encore réussi à comprendre mon erreur sur le "On error…" PS : je suis tjs preneur pour que l'on m'explique
    Par contre j'ai corrigé ma 1ere version avec le : "If IsError" que j'ai vu dans le code de Marc-L; c'est sur l'écriture est loin d'être parfaite mais c'est comme ca que l'on apprend.

    Mon code avec le "If …" :
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    Sub Boucle()
    Dim i As Integer
     
    Application.ScreenUpdating = False
     
    DernLigne1 = Worksheets(1).Range("A" & Rows.Count).End(xlUp).Row
    MaPlage1 = Worksheets(1).Range("A1:A" & DernLigne1)
     
    DernLigne2 = Worksheets(2).Range("A" & Rows.Count).End(xlUp).Row
    MaPlage2 = Worksheets(2).Range("A1:A" & DernLigne2)
     
    For i = 1 To DernLigne1
          MaRef = Worksheets(1).Cells(i, 1).Value
     
          Ligne = Application.Match(MaRef, MaPlage2, 0)
     
          If IsError(Ligne) Then
     
           Worksheets(1).Activate
           Set Copie = Range("A" & i & ":" & "H" & i)
           Copie.Select
           Selection.Copy
           Worksheets(2).Activate
           Set Range2 = Cells(Rows.Count, 1).End(xlUp)(2)
           Range2.Select
           Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
           False, Transpose:=False
     
           ElseIf MaRef = Worksheets(2).Cells(Ligne, 1).Value Then
     
          Worksheets(1).Activate
          Set REFA = Range("A" & i & ":" & "H" & i)
          REFA.Select
          Selection.Copy
     
          Worksheets(2).Activate
          Set REFB = Range("A" & Ligne & ":" & "H" & Ligne)
          REFB.Select
          Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
           False, Transpose:=False
     
           End If
     
     Next i
     
    End Sub
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  6. #6
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour

    Citation Envoyé par RyuAutodidacte Voir le message
    Re, je n'ai pas encore réussi à comprendre mon erreur sur le "On error…" PS : je suis tjs preneur pour que l'on m'explique
    Tu aurais dû placer le Next I avant Exit Sub
    comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Next i
    Exit Sub
    ErrorHandler:

  7. #7
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    Modification de la ligne n°9 de ma première démo pour copier uniquement les valeurs :

    Rc.Resize(, Rw.Cells.Count).Value = Rw.Value


    Sinon pour comprendre un souci dans un code, l'exécuter en mode pas à pas via la touche F8
    tout en contrôlant le contenu de la fenêtre des Variables locales

  8. #8
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut Demo2
    Marc-L,
    je reviens vers toi car en faisant d'autre test avec ton code (Demo2) sur mon fichier source je me suis aperçu d'un petit détail :
    le remplacement des infos à réf equivalentes de la feuil1 à la feuil2 est ok et l'ajout d'une nouvelle référence sur la feuil2 derrière la dernière réf est ok sauf que :
    La 1ère fois que je lance le script il créé sur la dernière ligne de la feuil2 une case vide considéré comme pleine (1è cellule vide rencontrée aprè la dernière Réf en Col A) donc, quand je lance une 2è fois le script avec ajout d'une nouvelle Réf, ca me fait une ligne vide entre 2 réfs (
    Et quand je relance de nouveau tout est ok par la suite pas de ligne vide

    En y réfléchissant je suppose que c'est dû peut être à ma tétiêre de ma feuil2 se trouvant sur A1:H1

    du coup pour pallier à ce détail j'ai codé à la suite de ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       DerL = Sheets("Feuil2").Cells(Rows.Count, 2).End(xlUp)(2).Row
       Range("A" & DerL & ":" & "H" & DerL).Clear
    A moins que tu es une meilleure solution

    En tout cas merci bien car c'est vraiment top et rapide
    Merci pour la modif de Demo1

    PS : Merci Docmarti je vais modifier et tester
    Tu aurais dû placer le Next I avant Exit Sub
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  9. #9
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut




    Pas reproduit de mon côté, ressemble à une ligne vide qui n'en est pas une !

    Utiliser la propriété Range.End sur la première colonne …

    Sinon joindre un classeur de données en .xlsx (sans code) pour pouvoir tester.

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

Discussions similaires

  1. [WD-2007] Pour les adeptes du Rechercher / Remplacer, problème de phrase
    Par opacho dans le forum VBA Word
    Réponses: 7
    Dernier message: 19/08/2011, 21h38
  2. [XL-2003] Problème fonction recherche / remplacer sous VBA
    Par DVano dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 01/04/2010, 12h13
  3. vbs pour rechercher-remplacer par fichier spécifique
    Par chicano dans le forum VBScript
    Réponses: 7
    Dernier message: 17/03/2009, 13h25
  4. [Excel 2003] Problème Rechercher/Remplacer
    Par damsmut dans le forum Excel
    Réponses: 10
    Dernier message: 27/07/2007, 14h22
  5. Problème sur la recherche fulltext en v4 !
    Par poppa dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/05/2004, 23h06

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