Macro excel

Fermé
pluschaud Messages postés 8 Date d'inscription jeudi 2 septembre 2010 Statut Membre Dernière intervention 9 septembre 2010 - 2 sept. 2010 à 14:36
pluschaud Messages postés 8 Date d'inscription jeudi 2 septembre 2010 Statut Membre Dernière intervention 9 septembre 2010 - 9 sept. 2010 à 11:30
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.
A voir également:

7 réponses

gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 712
Modifié par gbinforme le 6/09/2010 à 09:52
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
pluschaud Messages postés 8 Date d'inscription jeudi 2 septembre 2010 Statut Membre Dernière intervention 9 septembre 2010
8 sept. 2010 à 15:24
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
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 712
Modifié par gbinforme le 8/09/2010 à 22:38
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
pluschaud Messages postés 8 Date d'inscription jeudi 2 septembre 2010 Statut Membre Dernière intervention 9 septembre 2010
9 sept. 2010 à 09:29
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 712
9 sept. 2010 à 10:53
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
pluschaud Messages postés 8 Date d'inscription jeudi 2 septembre 2010 Statut Membre Dernière intervention 9 septembre 2010
9 sept. 2010 à 11:05
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
pluschaud Messages postés 8 Date d'inscription jeudi 2 septembre 2010 Statut Membre Dernière intervention 9 septembre 2010
9 sept. 2010 à 11:30
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