Macro excel

Bonjour, je ne m'y connais pas en VB et les syntaxes m'echappent encore. J'ai quelques notion en programmation C. J'ai deux fichiers excel à ma disposition. J'aimerais comparer deux colonnes données entre les deux fichiers. Ensuite faire une copie. Donc pour vous donner plus de détail:
- comparer colonne D du fichier "Base" à la colonne X du fichier "extration"
- Si par exemple D1 = X3 alors, copier G1 du fichier "Base" et coller dans Y3 du fichier "extraction".
- L'opération doit se faire pour toutes les lignes du fichier "Base"

J'ai en tête une double boucle for comme on le ferait en C mais ici je sais pas dutout comment m'y prendre. Aidez moi s'il vous plaît.

7 réponses

  1. bonjour

    Tu as un problème tout bête car ta colonne B est précédée d'un espace et donc il n'y a pas de correspondance.

    Soit tu supprimes l'espace initial.

    Soit tu remplaces xlWhole par xlPart mais dans ce cas, si tu recherches BOIS tu vas trouver :
    BOISBAN
    BOISCERF
    BOISDAVAUX
    BOISGENOUD
    BOISGENTIL
    BOISMERMET
    BOISSONNET
    donc ce n'est pas très fiable


    oK.TU AS éTé RAPIDE. comme mentionné dans mon precedant message, j'avais vu le problème. J'ai supprimé les espaces, et j'ai changé la dernière sondition If.

    Merci Beaucoup pour ta promtitude
    1. Rebonjour,

      ca marche. J'ai trouvé mon erreur. En fait c'est les espaces qui se trouvaient avant les termes que je recherchais qui empêchaient la boucle de fonctionner. Si tu regardes le fichier tu comprendras.

      J'ai aussi modifié la dernière condition du If. Merci pour ton coup de main.
      1. Contributeur
        bonjour

        Tu as un problème tout bête car ta colonne B est précédée d'un espace et donc il n'y a pas de correspondance.

        Soit tu supprimes l'espace initial.

        Soit tu remplaces xlWhole par xlPart mais dans ce cas, si tu recherches BOIS tu vas trouver :
        BOISBAN
        BOISCERF
        BOISDAVAUX
        BOISGENOUD
        BOISGENTIL
        BOISMERMET
        BOISSONNET
        donc ce n'est pas très fiable.
        1. Bonjour,

          Merci déja pour ton aide.
          Je crois que je vais m'arracher les cheveux de la tête. J'ai essayé le code sur tes fichers et ca marche.

          Chez moi le problème est le même. Je joins les fichiers. Tu peux aller regarder . Je passe sûrement à côté d'un truc bête. Je comprends pas.Je veux copier la correspondance ID_pere dans la colonne C de extract. Une fois encore Merci

          http://www.cijoint.fr/cjlink.php?file=cj201009/cijJOOl0FL.zip
          1. Contributeur
            bonjour,

            Ta première question a compliqué un peu le problème mais tu as parfaitement adapté le code.

            Pour moi cela fonctionne, j'ai adapté les classeurs à ta macro modifiée et pour moi c'est correct comme résultat. Je te joins les 2 fichiers avec ta macro dans le fichier base pour comprendre pourquoi tu n'as pas de résultat.

            http://www.cijoint.fr/cjlink.php?file=cj201009/cijF60CFXn.zip

            Toujours zen
            1. Salut gbinforme

              J'ai essayé de comprendre et de compiler le code que tu as ecris. Je l'ai adapté à mes deux fichiers. J'ai ceci:

              Sub Macro_compare_et_copie()
              Dim lig As Long
              Dim col As Integer
              Dim b_sel As Range
              Dim e_sel As Range
              Dim wb As Worksheet
              Dim we As Worksheet
              Set wb = Workbooks("base.xls").Sheets("Feuil1") ' classeur base
              Set we = Workbooks("extract.xls").Sheets("cellules") 'classeur extraction
              col = 2    ' colonne comparée B = 2
              For Each b_sel In wb.UsedRange.Columns("B").Cells
                  lig = 1
                  Set e_sel = we.Columns(col).Cells.Find(What:=b_sel.Value, After:=we.Cells(lig, col), LookIn:=xlValues, LookAt:=xlWhole)
                  While Not e_sel Is Nothing And b_sel.Value <> ""
                      we.Cells(e_sel.Row, col + 1).Value = b_sel.Offset(0, -1).Value 'maj colonne Y
                      lig = e_sel.Row
                      Set e_sel = we.Columns(col).Cells.Find(What:=b_sel.Value, After:=we.Cells(lig, col), LookIn:=xlValues, LookAt:=xlWhole)
                      If e_sel.Row < lig Then Set e_sel = Nothing
                  Wend
              Next b_sel
              End Sub


              En fait les deux colonnes que je compare sont les colonnes B. Je copie ensuite dans la colonne C (laissée vide) de extract ce que je récupère dans A du fichier de Base.

              Je constate qu'il n'y a rien qui se passe. On ne rentre pas dans la boucle While. La condition n'est pas remplie puisque e_sel toujours=Nothing. Je me familiarise encore avec les syntaxes et je suis un peu perdu.

              Help please.

              Merci pour le temps que tu as consacré à ce code gbinforme.
              1. Contributeur
                bonjour

                Voici un exemple de macro que tu peux mettre en place pour réaliser ton projet :

                Public Sub compare_copie() 
                Dim lig As Long 
                Dim col As Integer 
                Dim b_sel As Range 
                Dim e_sel As Range 
                Dim wb As Worksheet 
                Dim we As Worksheet 
                Set wb = Workbooks("base.xls").Sheets("f_base") ' classeur base 
                Set we = Workbooks("extraction.xls").Sheets("extrac") ' classeur extraction 
                col = 24    ' colonne comparée X = 24 
                For Each b_sel In wb.UsedRange.Columns("D").Cells 
                    lig = 1 
                    Set e_sel = we.Columns(col).Cells.Find(What:=b_sel.Value, After:=we.Cells(lig, col), LookIn:=xlValues, LookAt:=xlWhole) 
                    While Not e_sel Is Nothing And b_sel.Value <> "" 
                        we.Cells(e_sel.Row, col + 1).Value = b_sel.Offset(0, 3).Value 'maj colonne Y 
                        lig = e_sel.Row 
                        Set e_sel = we.Columns(col).Cells.Find(What:=b_sel.Value, After:=we.Cells(lig, col), LookIn:=xlValues, LookAt:=xlWhole) 
                        If e_sel.Row < lig Then Set e_sel = Nothing 
                    Wend 
                Next b_sel 
                End Sub 
                

                à toi d'adapter les noms des onglets et des classeurs bien sûr :)

                ps : le fait d'utiliser UsedRange implique qu'il ne doit pas y avoir de colonne vide avant D dans ta base.

                Toujours zen