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

  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.

  10. #10
    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
    Re,
    je suppose que c'est surement la version Mac d'excel 2011 qui produit ce problème, quoi qu il en soit ci-joint le xlsx
    - Sur BDD F4:M105 plage de donnée avec Formule (ici je les ai enlevées) - la BDD (volatile) vient d'un fichier externe normalement, par commodité je l'ai mis dans une feuille nommé BDD
    - Feuil1 formule récupérant les donnée de la BDD
    - Feuil2 Extraction permettant la constitution d'un BDD définitive avec bouton vba d'enregistrer sous avec nommage auto du nom de fichier du nom de la feuille (nom mis dans cellules) et forcer l'enregistrement en xls (le choix du chemin se fait par l'utilisateur)

    PS : j'ai appliqué démo2 sur feuil2 et en faisant Pomme flèche bas sur mac (sur pc je suppose que c'esp peut être Ctrl flèche bas) je m'arrete sur une cellule vide (ligne 61) et quand je réapplique Demo2 (non fait ici) je me retrouve avec une ligne vide entre la dernière réf et la nouvelle réf
    TEST.xlsx

    Merci d'avance

    Marc-L,
    j'ai refait des test sur un nouveau fichier et j'ai pas le pbm, je vais re-vérifier mon fichier source
    j'ai aussi fait le Range.End sur mon fichier source il m' a bien trouvé le décalage
    ça doit surement venir de mon fichier source

    dans tous les cas

    Docmarti,
    j'ai bien fait la modif mais j'ai encore une erreur
    donc je continue à regarder pour ne plus avoir l'erreur
    je vous tiens au courant pour la suite
    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 ;)

  11. #11
    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




    Une cellule peut apparaître vide tout en contenant une formule ou un espace …
    Il y a bien "quelque chose" dans la cellule A61 du classeur TEST, en la sélectionnant et en appuyant sur la touche Suppr, c'est réglé …
    Elle gênait pour les propriétés Range.End et CurrentRegion.

    Dans ce classeur TEST, est-ce toujours une copie de Feuil1 vers Feuil2 ?

  12. #12
    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
    Bonjour Marc-L,
    oui c'et tjs une copie de feuil1 vers feuil2

    la feuil2 est un enregistrer sous de mon fichier source pour montrer le résultat qd le vba demo2 est appliqué
    j'ai rajouter feuil1 et BDD par la suite pour montrer le principe avec les formules sur feuil1
    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 ;)

  13. #13
    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

    Sans corriger le problème de la cellule pas vraiment 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
    15
    16
    Sub Demo1()
        Dim Rc As Range, Rw As Range
        Application.ScreenUpdating = False
     
        With Feuil1.Cells(1).CurrentRegion
            For Each Rw In .Rows("1:" & .Columns(1).Find("*", , , , , xlPrevious).Row)
                With Feuil2.Cells(1).CurrentRegion.Columns(1)
                    Set Rc = .Find(Rw.Cells(1).Value)
                     If Rc Is Nothing Then Set Rc = .Find("*", , , , , xlPrevious).Offset(1)
                        Rc.Resize(, Rw.Cells.Count).Value = Rw.Value
                End With
            Next
        End With
     
        Set Rc = Nothing
    End Sub

  14. #14
    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
    Bonjour Marc-L et Docmarti,

    J'ai de nouveau la connection internet

    Marc-L:
    J'ai testé votre nouveau Code (Demo1) et sur Mac il me fait un bug dans le sens ou il m'a changé des données (TOTO1 disparait et j'ai 2 fois TOTO)
    Ci-joint 2 fichiers, avant (Ref copier.xls) et après avec Demo1 appliqué (Ref Demo1.xls) :Ref copier.xls - Ref Demo1.xls
    Pour l'instant j'utilise tjs votre code Demo2 avec une lègère modif sur la fin pour erradiquer le pb :
    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
    Sub Demo2()
        Dim Rw As Range
        Application.ScreenUpdating = False
     
        With Feuil2
            With .Cells(1).CurrentRegion
                C& = .Columns.Count
                MsgBox C
                R& = .Rows.Count
                MsgBox R
            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
     
        Worksheets(2).Activate
        DerL = Worksheets(2).Cells(Rows.Count, 2).End(xlUp)(2).Row
        Range("A" & DerL & ":" & "H" & DerL + 10).ClearContents
     
    End Sub
    Docmarti :
    Tu aurais dû placer le Next I avant Exit Sub
    J'avais testé mais je me suis retrouvé avec une nouvelle erreur
    Donc je suis reparti de zéro et maintenant c'est ok (code nettement amélioré ):
    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
    Sub Add_Replace()
    Dim i As Integer
    Dim Num_Ligne As Integer
     
    Application.ScreenUpdating = False
     
        If Worksheets(3).Cells(Rows.Count, 6).End(xlUp)(1).Row <> Worksheets(3).Range("F4").End(xlDown).Row Then
        MsgBox "xxxxxxx"
        Exit Sub
        End If
     
        R1a = Worksheets(1).Cells(1).CurrentRegion.Rows.Count
        R1b = WorksheetFunction.CountBlank(Worksheets(1).Range("A1:A" & R1a))
        R1 = R1a - R1b
     
        For i = 1 To R1
     
        R2 = Worksheets(2).Cells(1).CurrentRegion.Rows.Count
     
        On Error GoTo NewRef
     
        Num_Ligne = Application.Match(Worksheets(1).Cells(i, 1), Worksheets(2).Range("A1:A" & R2), 0)
     
        If Worksheets(1).Cells(i, 1) = Worksheets(2).Cells(Num_Ligne, 1) Then
        Worksheets(2).Range("A" & Num_Ligne & ":" & "H" & Num_Ligne).Value = Worksheets(1).Range("A" & i & ":" & "H" & i).Value
        End If
     
        Next i
     
        Exit Sub
     
    NewRef:
        R = R2 + 1
        Worksheets(2).Range("A" & R & ":" & "H" & R).Value = Worksheets(1).Range("A" & i & ":" & "H" & i).Value
     
        Resume Next
     
    End Sub
    Marc-L, Docmarti :
    Pouvez-vous tester svp mon nouveau code sur PC pour savoir si tout est OK
    Y a t-il moyen d'obtenir "R1" directement sachant que les cellules de Feuil1 contiennent des formules excel qui renvoient du vide ou des valeurs?

    Merci d'avance
    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 ;)

  15. #15
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    J'utiliserais FIND pour trouver la dernière ligne sans tenir compte des formules.
    Et j'utiliserais On Error Resume Next pour vérifier le résultat de la commande MATCH.

    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
    Sub Add_Replace2()
    Dim i As Long
    Dim Num_Ligne As Long
    Dim Nom As Variant
     
     
    If Worksheets(3).Cells(Rows.Count, 6).End(xlUp)(1).Row <> Worksheets(3).Range("F4").End(xlDown).Row Then
         MsgBox "xxxxxxx"
        Exit Sub
    End If
     
    Set f = Worksheets(1).Columns(1)
    Set rg = f.Find(What:="*", After:=f.Cells(1, 1), LookIn:=xlValues, LookAt:=xlPart, SearchFormat:=False, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False)
    If rg Is Nothing Then R1 = 0 Else R1 = rg.Row
     
    For i = 1 To R1
     
    Nom = Worksheets(1).Cells(i, 1).Value
     
     On Error Resume Next
     Num_Ligne = Application.Match(Nom, Worksheets(2).Columns(1), 0)
     If Err <> 0 Then
      Set f = Worksheets(2).Columns(1)
      Set rg = f.Find(What:="*", After:=f.Cells(1, 1), LookIn:=xlValues, LookAt:=xlPart, SearchFormat:=False, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False)
      If rg Is Nothing Then Num_Ligne = 2 Else Num_Ligne = rg.Row + 1
     End If
     On Error GoTo 0
     
     Worksheets(2).Range("A" & Num_Ligne & ":" & "H" & Num_Ligne).Value = Worksheets(1).Range("A" & i & ":" & "H" & i).Value
     
    Next i
     
    End Sub

  16. #16
    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




    Ou encore sans l'instruction On Error en utilisant une variable de type Variant et la fonction IsError

    Sinon ma procédure Demo1 fonctionne bien de mon côté sur Windows avec le classeur joint dans le post #14 !

  17. #17
    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
    Bonjour,
    He oui tjs au taquet

    Docmarti,
    je n'ai jamais utilisé "Find" en vba donc il va falloir que je regarde ça de plus près. Merci
    J'ai testé ton code mais il me fait une erreur 448 sur la ligne 13 du post #21:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rg = f.Find(What:="*", After:=f.Cells(1, 1), LookIn:=xlValues, LookAt:=xlPart, SearchFormat:=False, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False)
    Marc-L,
    j'ai cherché à utliser IsError comme conseillé, et voilà le 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
    Sub Add_Replace2()
    Dim i As Integer
    Dim Num_Ligne As Integer
     
    Application.ScreenUpdating = False
     
        If Worksheets(3).Cells(Rows.Count, 6).End(xlUp)(1).Row <> Worksheets(3).Range("F4").End(xlDown).Row Then
        MsgBox "xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx"
     
        Exit Sub
        End If
     
        R1a = Worksheets(1).Cells(1).CurrentRegion.Rows.Count
        R1b = WorksheetFunction.CountBlank(Worksheets(1).Range("A1:A" & R1a))
        R1 = R1a - R1b
     
        For i = 1 To R1
     
        R2 = Worksheets(2).Cells(1).CurrentRegion.Rows.Count
     
        If IsError(Application.Match(Worksheets(1).Cells(i, 1), Worksheets(2).Range("A1:A" & R2), 0)) Then
        R = R2 + 1
        Worksheets(2).Range("A" & R & ":" & "H" & R).Value = Worksheets(1).Range("A" & i & ":" & "H" & i).Value
        Else
        Num_Ligne = Application.Match(Worksheets(1).Cells(i, 1), Worksheets(2).Range("A1:A" & R2), 0)
        Worksheets(2).Range("A" & Num_Ligne & ":" & "H" & Num_Ligne).Value = Worksheets(1).Range("A" & i & ":" & "H" & i).Value
        End If
     
        Next i
     
        Exit Sub
     
    End Sub
    PS : N'hésitez pas à me corriger sur l'écriture du IsError qui a des chances de ne pas être parfait

    Petite question : Sur un MsgBox ya t-il un moyen de mettre un texte à rallonge sur plusieurs lignes au lieu d'une dans le code? (cf Code ci-dessus exemple que je n'aimerai pas faire avec un MsgBox sur une ligne)

    Cordialement
    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 ;)

  18. #18
    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




    Lignes n° 21 & 25 : deux fois le même Match, c'est un peu ballot !
    Comme déjà précisé, affecter Match à une variable de type Variant puis l'utiliser dans ces lignes là …

    C'est la constante vbLf pour passer à la ligne dans un MsgBox.

  19. #19
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rg = f.Find(What:="*", After:=f.Cells(1, 1), LookIn:=xlValues, LookAt:=xlPart, SearchFormat:=False, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False)
    L'erreur 448 est causée par l'argument nommé SearchFormat: qui n'existe pas sur MAC.
    Il faut donc l'omettre sur MAC.

    Ce qui me donne 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
    21
    22
    23
    24
    25
    26
    27
    28
    Sub Add_Replace()
    Dim i As Long
    Dim Num_Ligne As Variant
     
    If Worksheets(3).Cells(Rows.Count, 6).End(xlUp)(1).Row <> Worksheets(3).Range("F4").End(xlDown).Row Then
         MsgBox "xxxxxxx"
        Exit Sub
    End If
     
    Set f = Worksheets(1).Columns(1)
    Set rg = f.Find(What:="*", After:=f.Cells(1, 1), LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False)
    If rg Is Nothing Then R1 = 0 Else R1 = rg.Row
     
    For i = 1 To R1
     
     Num_Ligne = Application.Match(Worksheets(1).Cells(i, 1).Value, Worksheets(2).Columns(1), 0)
     
     If IsError(Num_Ligne) Then 'Suggestion de Marc-L avec Num_Ligne déclaré As Variant
      Set f = Worksheets(2).Columns(1)
      Set rg = f.Find(What:="*", After:=f.Cells(1, 1), LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False)
      If rg Is Nothing Then Num_Ligne = 2 Else Num_Ligne = rg.Row + 1
     End If
     
     Worksheets(2).Range("A" & Num_Ligne & ":" & "H" & Num_Ligne).Value = Worksheets(1).Range("A" & i & ":" & "H" & i).Value
     
    Next i
     
    End Sub
    Bonjour Marc-L

    Le fait de ne pas spécifier xlPart/xlWhole dans cette ligne cause problème.
    Citation Envoyé par Marc-L Voir le message
    Set Rc = .Find(Rw.Cells(1).Value)
    [/CODE]
    Si le dernier appel à FIND a utilisé xlPart et non xlWhole, le résultat de ce code est que si je cherche TOTO et que TOTO1 se trouve avant TOTO, les valeurs de TOTO seront attribuées à TOTO1.

  20. #20
    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




    Merci je le sais bien ! Comme cela fonctionne bien tel quel avec le classeur joint du post #14 …

    Et puis c'est formateur : cela laisse au demandeur le loisir de consulter l'aide VBA de cette méthode !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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