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. 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
    0
    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.
      0
      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
        0
        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
          0
          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.
            0
            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.
              0
              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
                0