Se connecter avec
S'enregistrer | Connectez-vous

Problème macro et amélioration

Dernière réponse : dans Programmation

Bonjour,
Je viens à vous car j'ai besoin d'un coup de main. Je vends des vêtements et je reçois plusieurs fois par an les fichiers de mes fournisseurs (fichiers de 1000 à 4000 lignes environ). Ces fichiers contiennent les produits existants + les nouveaux produits - les produits arrêtés.
J'ai récupéré une macro qui me permettait de mettre à jour le stock et le prix de mon catalogue. Mais ça ne fonctionne pas sur des fichiers de 3500 lignes, la même cellule est répétée.
Bref, ce que je souhaiterai c'est d'avoir dans un fichier :
- 1er onglet : moncatalogue
- 2ème onglet : fichierfournisseur
et une macro qui me permet d'inscrire dans moncatalogue les informations contenues dans fichierfournisseur (prix,stock,description...) des références existantes, mettre en rouge les lignes des produits arrêtés et ajouter en bleu les nouveaux produits.

Je vous remercie par avance de l'aide que vous m'apporterez.

Autres pages sur : probleme macro amelioration

Lassé par la pub ? Créez un compte
Expert Programmation

Bonjour Sandra,

Nous nous entraidons entre développeurs. Nous acceptons volontiers les débutants en programmation. Mais nous ne réalisons pas de travaux à la demande.

Peut-on t'aider dans ce cadre ?

Bonjour Zeb,
Merci de ta réponse.
Voilà le code qui ne fonctionne pas quand le fichier est trop long et qui répète la même cellule.

  1. Sub
  2. Dim i As Long, j As Long
  3. i = 2
  4. j = 2
  5. For i = 2 To 3574
  6. For j = 2 To 1954
  7. ' // (la référence produit est le point commun aux 2 fichiers)
  8. If Worksheets("moncatalogue").Range("R" & i).Value Like "*" & _
  9. Worksheets("fichierfournisseur").Range("B" & j).Value & "*" Then
  10. ' // (mise à jour tarif)
  11. Worksheets("moncatalogue").Range("J" & i).Value = Worksheets("fichierfournisseur").Range("I" & j).Value
  12. ' // (mise à jour stock)
  13. Worksheets("moncatalogue").Range("K" & i).Value = Worksheets("fichierfournisseur").Range("F" & j).Value
  14. End If
  15. Next
  16. j = 2
  17. Next
  18. End Sub


Je n'arrive pas à comprendre pourquoi la macro bug.
Pour mettre en couleur, je viens de trouver (il faudra que je teste).
Il me reste à afficher les nouvelles références dans moncatalogue. Je continue de chercher mais j'apprécierai si tu pouvais au fur et à mesure me valider les modifications.
Est-ce possible ?
Expert Programmation

On pourra certainement t'aider, mais pour cela, il va falloir respecter les règles de la rubrique... :whistle: 

Je te conseille donc d'utiliser les balises [code] autour de ton code. Cela le rendra plus lisible. ;) 

EDIT: trop tard! zeb a été plus rapide que moi! :D 
Expert Programmation

Si, je me permets, ce ne sont pas les fichiers de 3500 lignes mais de 3574 lignes qui posent problèmes. N'est-ce pas ?

Du coup, en lisant la lignes 5 (oh, des numéros de lignes. Tiens, c'est donc pour ça que le modo est si chiant avec ces histoires de règlement, de publication, de balise [code], etc), on se dit que la solution est triviale.

Merci Zeb, Merci Storos... J'avais utiliser "réponse rapide" donc pas d'insertion code.
Je ne le ferai plus ... promis. Ne vous prenez pas le bec (ou le groin ;) , suis novice et c'est de ma faute. Je ne suis que polie et courtoise (du moins je l'espère!).

Quel est le problème sur les lignes 5 et 6 ?
Avec des fichiers plus légers, la macro ne bug pas.

Pour les références arrêtées avec coloration de la ligne :


  1. Else if // A étant la colonne où est noté STOP pour les références arrêtées
  2. Worksheets("moncatalogue").Range("R" & i).Value Like "*" & Worksheets("fichierfournisseur").Range("B" & j).Value & "*" & Worksheets("fichierfournisseur").Range("A" & j).Value & "STOP"
  3. Then
  4. Worksheets("moncatalogue").Rows.Interior.ColorIndex=2


Maintenant il me reste les nouvelles références à incrémenter dans moncatalogue.

Je fais des progrès là, non ? ;) 
Expert Programmation

Pas mal pour la débutante que tu prétends être !
Je n'aime pas l'idée que tu n'aies pas compris le problème des lignes 5 et 6.
La boucle For de la ligne 5 permet de lire ton fichier "moncatalogue" de la ligne 2 à la ligne 3574, pas plus !
La boucle For de la ligne 6 permet de lire ton fichier "fichierfournisseur" de la ligne 2 à la ligne 1954, pas plus !

Bon je réfléchis à une solution..... (patience)

Je les ai comprises. J'ai indiqué en ligne 5 et 6 le nombre de lignes de mes 2 fichiers, il ne faut pas ?
Tu es en train de me dire que je lis et applique des informations fausses ???? grrrr le net !
Mon code est bon pour la couleur et les références arrêtées ????? (suis pas si blonde alors ! ;)  Je ne rêve pas, il doit forcément comporter des erreurs, je n'ai aucune connaissance en macro.

Je continue à réfléchir... sur les nouvelles références :

  1. Else If Worksheets("fichierfournisseur" ).Range("B" & i).Value Like "*" & Worksheets("moncatalogue" ).Range("R" & j).Value=False
  2. Then
  3. i = i+1
  4. Worksheets("moncatalogue" ).Rows.Interior.ColorIndex=5
  5. Worksheets("moncatalogue" ).Range("R" & i).Value = Worksheets("fichierfournisseur" ).Range("B" & j).Value
  6. Worksheets("moncatalogue" ).Range("J" & i).Value = Worksheets("fichierfournisseur" ).Range("I" & j).Value
  7. Worksheets("moncatalogue" ).Range("K" & i).Value = Worksheets("fichierfournisseur" ).Range("F" & j).Value


Je n'ai indiqué que la copie de 3 colonnes mais j'ajouterai la copie des autres colonnes dont j'ai besoin. Ce n'est pas compliqué, enfin je crois.
Expert Programmation

  1. Sub Macro_a_etudier()
  2. ' // Le classeur Catalogue
  3. Dim wk_catalog As Workbook
  4. Set wk_catalog = ActiveWorkbook
  5.  
  6. ' // Ouverture du classeur fournisseur
  7. ' // Copie en dernier onglet de la feuille fournisseur dans le classeur Catalogue
  8. Dim wk_fournis As Workbook
  9. Dim n As Integer
  10.  
  11. ' // --> Ouvertuyre du classeur
  12. Set wk_fournis = Workbooks.Open("classeur_fournisseur.xls")
  13. ' // --> Combien d'onglet dans catalogue ?
  14. n = wk_catalog.Worksheets.Count
  15. ' // --> On copie le premier onglet de fournisseur après le dernier onglet (n) de catalogue
  16. wk_fournis.Worksheets(1).Copy , wk_catalog.Worksheets(n)
  17. wk_fournis.Close ' // on ferme !
  18.  
  19. ' // --> La page des nouvelles fournitures, c'est dernière du catalogue
  20. Dim ws_fournis As Worksheet
  21. Set ws_fournis = wk_catalog.Worksheets(n + 1) ' // (il y en a une de plus)
  22. ws_fournis.Name = "fichierfournisseur"
  23.  
  24. ' // --> La page du catalogue, c'est celui qui s'appelle "moncatalogue"
  25. Dim ws_catalog As Worksheet
  26. Set ws_catalog = wk_catalog.Worksheets("moncatalogue")
  27.  
  28. ' // Combien de lignes dans les fournitures ?
  29. ' // --> On va dire que c'est dans la colonne 1 qu'il y a les références.
  30. ' // --> On se met dans la dernière ligne de la colonne 1 et on remonte jusqu'à ce qu'on trouve quelque chose.
  31. Dim zn_fournis As Range
  32. Set zn_fournis = Range(ws_fournis.Cells(2, 1), ws_fournis.Cells(65536, 1).End(xlUp))
  33. MsgBox "La zone utile des nouvelles fournitures est " & zn_fournis.Address(False, False)
  34.  
  35. ' // Combien de lignes dans le catalogue ?
  36. ' // --> On va dire que c'est dans la colonne 1 qu'il y a les références.
  37. ' // --> On se met dans la dernière ligne de la colonne 1 et on remonte jusqu'à ce qu'on trouve quelque chose.
  38. Dim zn_catalog As Range
  39. Dim dr_catalog As Range ' Pour mémoriser la der de la zone
  40. Set dr_catalog = ws_catalog.Cells(65536, 1).End(xlUp)
  41. Set zn_catalog = Range(ws_catalog.Cells(2, 1), dr_catalog)
  42. MsgBox "La zone utile du catalogue actuel est " & zn_catalog.Address(False, False)
  43.  
  44. ' // --> On boucle sur les nouvelles fournitures
  45. Dim cl_fournis As Range ' // cl = cellule
  46. Dim cl_catalog As Range
  47. Dim trouve As Boolean
  48. For Each cl_fournis In zn_fournis
  49. ' // Pas encore trouvé
  50. trouve = False
  51. ' // --> On boucle sur le catalogue actuel
  52. For Each cl_catalog In zn_catalog
  53. If cl_fournis.Value = cl_catalog.Value Then
  54. ' // Trouvée
  55. trouve = True
  56. ' Est-ce à mettre à jour ou à supprimer ?
  57. ' // --> On va dire que c'est dans la colonne 2
  58. If cl_fournis.Offset(0, 1).Value = "On arrête" Then
  59. cl_catalog.EntireRow.Interior.ColorIndex = 3 ' // Rouge
  60. ' // Sans doute d'autres choses à faire ici
  61. Else
  62. ' // On recopie tout de fournis --> catalog
  63. cl_fournis.EntireRow.Copy cr_catalog.EntireRow
  64. End If
  65. End If
  66. Next
  67. If Not trouve Then
  68. ' C'est donc nouveau
  69. ' // Où copier cette nouvelle ligne ?
  70. ' // Ben dans dr_catalog + 1 pardi !
  71. Set dr_catalog = dr_catalog.Offset(1, 0)
  72. cl_fournis.EntireRow.Copy dr_catalog.EntireRow
  73. dr_catalog.EntireRow.Interior.ColorIndex = 5 ' // Bleu
  74. End If
  75. Next
  76. End Sub


Tu remarqueras le nom subtil de la macro, qui me permet de continuer à dire que :
Citation :
Nous nous entraidons entre développeurs. Nous acceptons volontiers les débutants en programmation. Mais nous ne réalisons pas de travaux à la demande.

Wouahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh !!!
On est loin de ce sur quoi j'étais partie !!! Voilà une soirée bien remplie en perspective (à mon avis, le week-end aussi !)
Tout d'abord Merci Zeb. Ensuite, je vais essayer de faire honneur à ton travail et m'occuper de ce pas de cette macro. Et enfin, je reviendrai vers toi pour te donner le résultat (et te remercier à nouveau!).

Et me revoilà !

Suite à "mon étude" à chaud, j'ai quelques questions :

- Quel intérêt d'avoir un classeur classeur_fournisseur.xls ? Il me semble plus simple de copier mon catalogue dans l'onglet moncatalogue et le nouveau fichier de mes fournisseurs dans l'onglet fichierfournisseur. La question se pose quand même, il y a peut être une subtilité que je n'ai pas saisi ! Sachant qu'il faudra que je modifie l'organisation des fichiers des fournisseurs pour qu'il colle à celle de moncatalogue...

- Comment puis-je remplir la colonne 2 avec la valeur "on s'arrête" puisque je ne sais pas quels produits sont arrêtés ? Je me suis mal exprimée. Dans les fichiers fournisseur, on trouve les références en cours (anciennes et nouvelles) et les produits arrêtés n'apparaissent plus. Ne serait-il pas judicieux d'analyser les références dans moncatalogue qui sont absentes dans fichierfournisseur ?

- Dans les lignes des nouveaux produits ajoutés à moncatalogue, pourquoi certaines lignes ne sont pas en bleu ?

- J'ai fait un test en enregistrant une référence supplémentaire dans classeur_fournisseur.xls en ligne 1 puis dans l'ordre des références et cette nouvelle référence n'est pas pris en compte, elle n'apparaît pas en bleu, pourquoi ?

- Pour la mise à jour d'information (stock, prix...), est-ce bien après la ligne 56 que je dois codifier ?

Je me repencherai sur "mon étude" ce week-end, à froid ! Je te ferai part peut-être d'autres questions. Je veux bien appliquer la macro mais je veux surtout comprendre et il y a quelques lignes que je ne comprends pas. Certaines logiques de programmation m'échappent complètement.
Expert Programmation

Pleins de bonnes questions ;) 

Pourquoi un classeur pour le fournisseur ?
Ben parce que c'est toi qui a dit en recevoir un. Le programme proposé fait lui-même la copie.

Code succint :
  1. ' // --> Ouvertuyre du classeur
  2. Set wk_fournis = Workbooks.Open("classeur_fournisseur.xls" )


Code élaboré :
  1. ' // --> Ouverture du classeur
  2. Dim nm_fournis As String
  3. nm_fournis = Application.GetOpenFilename("Classeurs Excel,*.xls,Tous les fichiers (*.*),*.*", 1, "Classeurs fournisseurs", , False)
  4. If Not FileExists(nm_fournis) Then Exit Sub
  5.  
  6. Set wk_fournis = Workbooks.Open(nm_fournis)


NB: La fonction FileExists n'existe pas. Il faut la créer (ou la trouver ;) )

Ah, nous n'avons pas d'information de suppression. Si tu n'es pas mal exprimée, c'est que j'ai mal compris... Bizarre... :heink:  ... [:patch]
Donc, de la ligne 54 à la 64, on vire tout et on écrit :
  1. If cl_fournis.Value = cl_catalog.Value Then
  2. ' // Trouvé ! On recopie tout de fournis --> catalog
  3. trouve = True
  4. cl_fournis.EntireRow.Copy cl_catalog.EntireRow
  5. Exit For
  6. End If


Pour l'instant, on a parcourut zn_fournis [ligne 48], puis zn_catalog [52] pour trouver [55]. Si on ne trouve pas [67], on a fait certaines choses.

Par contre, on recherche maintenant les lignes de ton catalogue qui ne sont pas présentes dans celui du fournisseur.
Et si je te disait que c'est l'inverse de ce qu'on a déjà fait ?

Donc on ajoute à la fin ceci : on a parcourut zn_catalog, puis zn_fournis pour trouver. Si on ne trouve pas, on a fait certaines choses (mettre en rouge).
Donne-nous ce petit bout de code qu'on voit comment tu te débrouilles !

Citation :
- Dans les lignes des nouveaux produits ajoutés à moncatalogue, pourquoi certaines lignes ne sont pas en bleu ?
- J'ai fait un test en enregistrant une référence supplémentaire dans classeur_fournisseur.xls en ligne 1 puis dans l'ordre des références et cette nouvelle référence n'est pas pris en compte, elle n'apparaît pas en bleu, pourquoi ?

Que nous dit le message de la ligne 33 ? Alors pourquoi mets-tu des trucs en ligne 1, puisqu'il ne vont pas être pris en compte ?
Essaie de voir comment ligne 32, je fais expres de ne pas prendre la ligne 1 en compte.

Citation :
- Pour la mise à jour d'information (stock, prix...), est-ce bien après la ligne 56 que je dois codifier ?

Euh, non. Regarde le commentaire de la ligne 62.

Bonjour,

Je reçois un catalogue par fournisseur(j'en ai plusieurs) 2 à 4 fois par an. Les catalogues ne se présentent pas tous de la même manière. Certains peuvent avoir plusieurs onglets (prix, stock, description.....). Dans mon esprit, j'étais partie pour copier les colonnes qui m'intéressaient dans l'onglet fichierfournisseur. Voire même de mettre à la suite les différents fournisseurs pour traiter le catalogue en une seule fois (les fournisseurs n'ont pas les même type de références). Je n'avais pas songé un instant à l'ouverture et la copie automatisées mais pourquoi pas. Ce qui me chagrine, c'est mon côté feignante, c'est la manipulation des fichiers fournisseurs pour les mettre à l'identique de mon catalogue qui compte 35 colonnes !!!! Quelle est la meilleur méthode, je ne sais pas !

Il est évident que si je ne donne pas toutes les informations et toutes mes réflexions, la communication va être difficile.

Citation :
Par contre, on recherche maintenant les lignes de ton catalogue qui ne sont pas présentes dans celui du fournisseur.
Et si je te disait que c'est l'inverse de ce qu'on a déjà fait ?


Donc on ajoute à la fin ceci : on a parcourut zn_catalog, puis zn_fournis pour trouver. Si on ne trouve pas, on a fait certaines choses (mettre en rouge).



Je suppose qu'en ayant déjà fait le rapprochement entre zn_fournis et zn_catalog des références identiques, je n'ai pas à refaire la même chose, n'est-ce-pas ??? (vraiment la logique informatique me perturbe !)

  1. For Each cl_catalog In zn_catalog
  2. If cl_fournis.Value = cl_catalog.Value Then
  3. trouve = False
  4. cl_catalog.EntireRow.Interior.ColorIndex = 3 ' // Rouge
  5. End If


Pour la ligne 62, j'avais supposé supprimer les lignes 56 à 63 puisque la colonne 2 n'existait pas !

Quant à la référence ajoutée en ligne 1, toutes mes excuses, je m'exprime mal, la ligne 1 est en faite la ligne 2, je n'avais pas pris en compte la 1ère ligne d'intitulé des colonnes (en faite 1ère ligne des références produits) grrrrr !
Cela n'empêche pas le fait qu'elle ne soit pas pris en compte même si j'insère la référence 50 entre la 49 et la 51 !!!!??
Expert Programmation

Abandonnons l'idée d'ouvrir les catalogues automatiquement. Ce serait trop investir en réglage minutieux pour reproduire une action somme toute banale 4 fois par an.

Regarde mieux la ligne 61, il y a un else (sinon). Donc, comme proposé, il faut garder cette ligne. Et elle qui ajoute les nouvelles références.

Par commodité, je recopie toute la ligne (EntireRow), mais tu peux ne copier que certaines colonnes :
  1. If cl_fournis.Value = cl_catalog.Value Then
  2. ' // Trouvé ! On recopie tout de fournis --> catalog
  3. trouve = True
  4. ' // cl_fournis.EntireRow.Copy cl_catalog.EntireRow
  5.  
  6. cl_catalog.Offset(0, 2).Value = cl_fournis.Offset(0, 2).Value
  7. cl_catalog.Offset(0, 3).Value = cl_fournis.Offset(0, 4).Value
  8. cl_catalog.Offset(0, 3).Value = cl_fournis.Offset(0, 4).Value
  9. ...
  10. Exit For
  11. End If

Une petite erreur s'est glissé dans mon code, ligne 63 : la destination, c'est cl_catalog, pas dr_catalog. Toutes les confuses.


Citation :
Je suppose qu'en ayant déjà fait le rapprochement entre zn_fournis et zn_catalog des références identiques, je n'ai pas à refaire la même chose, n'est-ce-pas ??? (vraiment la logique informatique me perturbe !)

  1. For Each cl_catalog In zn_catalog
  2. If cl_fournis.Value = cl_catalog.Value Then
  3. trouve = False
  4. cl_catalog.EntireRow.Interior.ColorIndex = 3 ' // Rouge
  5. End If
  6. Next



:/  Il manque un bout, là ! Et pis ce n'est pas parce que tu n'as pas encore trouvé que tu ne vas pas le faire. Etudie mieux ton bout de code.
Les deux zones à scruter bien les mêmes. Le fournisseur n'a pas changé. Et pas la peine de scruter les nouvelles réfs de ton catalogue !

Regarde, et dis-moi que ça te paraît évidement maintenant :
  1. For Each cl_catalog In zn_catalog
  2. trouve = False
  3. For Each cl_fournis In zn_fournis
  4. If cl_fournis.Value = cl_catalog.Value Then
  5. trouve = True
  6. Exit For
  7. End If
  8. Next
  9. If Not trouve Then
  10. cl_catalog.EntireRow.Interior.ColorIndex = 3 ' // Rouge
  11. End If
  12. Next

Et bien cela me semblait tellement évident et donc tellement bête...... J'allais droit au but : si il ne trouve pas alors il fait tel chose.... L'utilisation de condition se fait complètement. Cela me semblait pas logique...j'ai vraiment du chemin à faire de ce côté là !
Pour récapituler :

  1. Sub Macro_a_etudier()
  2.  
  3. ' // --> La page des nouvelles fournitures, c'est dernière du catalogue
  4. Dim ws_fournis As Worksheet
  5. Set ws_fournis = Worksheets("fichierfournisseur")
  6. ' // --> La page de mon catalogue
  7. Dim ws_catalog As Worksheet
  8. Set ws_catalog = Worksheets("moncatalogue")
  9.  
  10. ' // Combien de lignes dans les fournitures ?
  11. ' // --> On va dire que c'est dans la colonne 1 qu'il y a les références.
  12. ' // --> On se met dans la dernière ligne de la colonne 1 et on remonte jusqu'à ce qu'on trouve quelque chose.
  13. Dim zn_fournis As Range
  14. Set zn_fournis = Range(ws_fournis.Cells(2, 1), ws_fournis.Cells(65536, 1).End(xlUp))
  15. MsgBox "La zone utile des nouvelles fournitures est " & zn_fournis.Address(False, False)
  16.  
  17. ' // Combien de lignes dans le catalogue ?
  18. ' // --> On va dire que c'est dans la colonne 1 qu'il y a les références.
  19. ' // --> On se met dans la dernière ligne de la colonne 1 et on remonte jusqu'à ce qu'on trouve quelque chose.
  20. Dim zn_catalog As Range
  21. Dim dr_catalog As Range ' Pour mémoriser la der de la zone
  22. Set dr_catalog = ws_catalog.Cells(65536, 1).End(xlUp)
  23. Set zn_catalog = Range(ws_catalog.Cells(2, 1), dr_catalog)
  24. MsgBox "La zone utile du catalogue actuel est " & zn_catalog.Address(False, False)
  25.  
  26. ' // --> On boucle sur les nouvelles fournitures
  27. Dim cl_fournis As Range ' // cl = cellule
  28. Dim cl_catalog As Range
  29. Dim trouve As Boolean
  30. For Each cl_fournis In zn_fournis
  31. ' // Pas encore trouvé
  32. trouve = False
  33. ' // --> On boucle sur le catalogue actuel
  34. For Each cl_catalog In zn_catalog
  35. If cl_fournis.Value = cl_catalog.Value Then
  36. ' // Trouvée
  37. trouve = True
  38. If cl_fournis.Offset(0, 19).Value = cl_catalog.Offset(0, 20).Value Then
  39. ' // cl_fournis.EntireRow.Copy cl_catalog.EntireRow
  40. cl_catalog.Offset(0, 13).Value = cl_fournis.Offset(0, 9).Value
  41. Else
  42. Set dr_catalog = dr_catalog.Offset(1, 0)
  43. cl_fournis.EntireRow.Copy dr_catalog.EntireRow
  44. End If
  45. Exit For
  46. End If
  47. Next
  48. If Not trouve Then
  49. ' C'est donc nouveau
  50. ' // Où copier cette nouvelle ligne ?
  51. ' // Ben dans dr_catalog + 1 pardi !
  52. Set dr_catalog = dr_catalog.Offset(1, 0)
  53. cl_fournis.EntireRow.Copy dr_catalog.EntireRow
  54. dr_catalog.EntireRow.Interior.ColorIndex = 5 ' // Bleu
  55. End If
  56. Next
  57. For Each cl_catalog In zn_catalog
  58. trouve = False
  59. For Each cl_fournis In zn_fournis
  60. If cl_fournis.Value = cl_catalog.Value Then
  61. trouve = True
  62. Exit For
  63. End If
  64. Next
  65. If Not trouve Then
  66. cl_catalog.EntireRow.Interior.ColorIndex = 3 ' // Rouge
  67. End If
  68. Next
  69. End Sub


J'ai fait quelques modifications... et ça fonctionne !!!!
Expert Programmation

Ben tu ne respectes pas la sacrosainte Indentation, les commentaires ne sont plus toujours en phase avec le code, tu as laissé des bouts de code de déboggage, mais si ça fonctionne, c'est l'essentiel.

Ceux qui viennent ici en disant Je suis en première année d'informatique et j'n'y arrive pô n'en ont pas fini avec moi jusqu'à ce que le résultat soit impec'. Pour les gentilles marchandes phocéennes, ce n'est pas pareil ;) 

Zeb,

Promis je vais faire les modifications pour l'Indentation (chouette j'ai appris un nouveau mot et je sais ce que c'est ;)  ) :bounce:  :pt1cable: 

Je te remercie beaucoup beaucoup beaucoup.

Ma proposition tient toujours au cas où !!!!

Et je serai ravie de te rendre la pareil.... j'espère que l'occasion se présentera !

Encore MILLE MERCI.

Je te souhaite une excellente soirée :hello: 

Bonsoir à tous,

Je reviens vers vous.... Et toi Zeb en particulier ;-)

Ma macro (notre macro) fonctionne parfaitement même avec mes ajustements et j'ai une nouvelle donne.
J'ai un tableau :
1 : id produit (1,2,3,4...)
2 : Ref du groupe produit (A,B,C...)
Ce qui donne :
1 A
2 B
3 C
4 D .....

Un autre tableau :
1 : Ref du groupe produit (a,b,c...)
2 : Ref du produit (a1,a2,a3,b1,c1,c2,c3,c4...)
Ce qui donne :
A a1
A a2
A a3
B b1
C c1 .....

Le hic quand j'utilise la macro est que le "1" est bien copié sur la ligne "A a1" mais ne se copie pas sur la ligne "A a2".
Sachant que bien évidemmment, vous l'avez vu, la Ref du groupe produit est la colonne de référence pour la liaison.

Dans ma boucle, je n'arrive jamais à retomber sur mes pattes ! Auriez-vous une piste ?
Expert Programmation

Salut gentille marchande,
:hello: 

Je suis un vilain programmeur maniaque, alors je ne sais lire du code que quand il est correctement indenté, je l'ai déjà dit.
Alors pour l'étudier à nouveau, je le réécris correctement :

  1. ' // --> La page des nouvelles fournitures, c'est dernière du catalogue
  2. Dim ws_fournis As Worksheet
  3. Set ws_fournis = Worksheets("fichierfournisseur")
  4. ' // --> La page de mon catalogue
  5. Dim ws_catalog As Worksheet
  6. Set ws_catalog = Worksheets("moncatalogue")
  7.  
  8. ' // Combien de lignes dans les fournitures ?
  9. ' // --> On va dire que c'est dans la colonne 1 qu'il y a les références.
  10. ' // --> On se met dans la dernière ligne de la colonne 1 et on remonte jusqu'à ce qu'on trouve quelque chose.
  11. Dim zn_fournis As Range
  12. Set zn_fournis = Range(ws_fournis.Cells(2, 1), ws_fournis.Cells(65536, 1).End(xlUp))
  13. MsgBox "La zone utile des nouvelles fournitures est " & zn_fournis.Address(False, False)
  14.  
  15. ' // Combien de lignes dans le catalogue ?
  16. ' // --> On va dire que c'est dans la colonne 1 qu'il y a les références.
  17. ' // --> On se met dans la dernière ligne de la colonne 1 et on remonte jusqu'à ce qu'on trouve quelque chose.
  18. Dim zn_catalog As Range
  19. Dim dr_catalog As Range ' Pour mémoriser la der de la zone
  20. Set dr_catalog = ws_catalog.Cells(65536, 1).End(xlUp)
  21. Set zn_catalog = Range(ws_catalog.Cells(2, 1), dr_catalog)
  22. MsgBox "La zone utile du catalogue actuel est " & zn_catalog.Address(False, False)
  23.  
  24. ' // --> On boucle sur les nouvelles fournitures
  25. Dim cl_fournis As Range ' // cl = cellule
  26. Dim cl_catalog As Range
  27. Dim trouve As Boolean
  28.  
  29. For Each cl_fournis In zn_fournis
  30. ' // Pas encore trouvé
  31. trouve = False
  32. ' // --> On boucle sur le catalogue actuel
  33. For Each cl_catalog In zn_catalog
  34. If cl_fournis.Value = cl_catalog.Value Then
  35. ' // Trouvée
  36. trouve = True
  37. If cl_fournis.Offset(0, 19).Value = cl_catalog.Offset(0, 20).Value Then
  38. ' // cl_fournis.EntireRow.Copy cl_catalog.EntireRow
  39. cl_catalog.Offset(0, 13).Value = cl_fournis.Offset(0, 9).Value
  40. Else
  41. Set dr_catalog = dr_catalog.Offset(1, 0)
  42. cl_fournis.EntireRow.Copy dr_catalog.EntireRow
  43. End If
  44. Exit For
  45. End If
  46. Next
  47. If Not trouve Then
  48. ' C'est donc nouveau
  49. ' // Où copier cette nouvelle ligne ?
  50. ' // Ben dans dr_catalog + 1 pardi !
  51. Set dr_catalog = dr_catalog.Offset(1, 0)
  52. cl_fournis.EntireRow.Copy dr_catalog.EntireRow
  53. dr_catalog.EntireRow.Interior.ColorIndex = 5 ' // Bleu
  54. End If
  55. Next
  56.  
  57. For Each cl_catalog In zn_catalog
  58. trouve = False
  59. For Each cl_fournis In zn_fournis
  60. If cl_fournis.Value = cl_catalog.Value Then
  61. trouve = True
  62. Exit For
  63. End If
  64. Next
  65. If Not trouve Then
  66. cl_catalog.EntireRow.Interior.ColorIndex = 3 ' // Rouge
  67. End If
  68. Next


Regarde bien la boucle For de la ligne 33 à 46. C'est là qu'on fait la détection et la recopie. Et quand on a fini de traiter le premier, que fait-on (ligne 44) ?
Lassé par la pub ? Créez un compte