macro recherche cellules dans 2 fichiers

macro recherche cellules dans 2 fichiers - VB/VBA/VBS - Programmation

Marsh Posté le 14-12-2012 à 11:25:40    

Bonjour à vous, amis développeurs!
 
J’ai besoin d’aide sur ma macro qui plante. J’imagine que la réponse est évidente, mais pas pour moi !!
 
J’explique le contexte. Je reçois quotidiennement par un extract (Feuil1 ou FL1) sur excel de 9 colonnes et environ 10 à 20 lignes par jour (des fois plus , des fois moins), à traiter. (La 1ere ligne est l'entête)
De l’autre côté, j’ai un reporting (Feuil2 ou FL2) de 60 colonnes et 15.000 lignes.
Les 9 colonnes de l’extract correspondent aux 9 premières colonnes de mon reporting.
Mes commandes extract sont présentes dans mon reporting et j’ai d’autres commandes que je considère « doublon » (excepté la colonne A qui est unique) lorsque les cellules des colonnes (C/G/I) 3,7 et 9 sont identiques.
Je voudrais donc récupérer à partir de mon reporting (Feuil2 ou FL2) les commandes « doublon » et les coller dans la Feuil1 sous les données déjà présentes. (uniquement les 9 colonnes, la suite n’est pas importante, pour ce traitement en tout cas !)
Mon problème est :
Ma macro plante quand je sélectionne mes cellules.
Je n’arrive pas à sélectionner la cellule vide après mes données FL1 pour coller.
Je ne sais pas sélectionner les 9 colonnes, du coup je prends toute la ligne…..
 
 
Merci pour votre aide.
 
 

Code :
  1. Sub Macro10()
  2. '
  3. ' Macro10 Macro
  4. '
  5. Dim K As Long, J As Long, Plage() As String, Plag() As String
  6. Dim Cherch As String, Ligne As Long, Lig As Long
  7. Dim FL1 As Worksheet
  8. Dim FL2 As Worksheet
  9.     Application.EnableEvents = False
  10.     Application.ScreenUpdating = False
  11.    
  12.     Set FL1 = Sheets("Feuil1" ) 'Destination
  13.     Set FL2 = Sheets("Feuil2" ) 'origine
  14.     Lig = FL2.Range("A65536" ).End(xlUp).Row
  15.     Ligne = FL1.Range("A65536" ).End(xlUp).Row
  16.    
  17.     ReDim Plage(2 To Lig)
  18.     For J = 2 To Lig: Plage(J) = FL2.Cells(J, 3) + FL2.Cells(J, 7) + FL2.Cells(J, 9): Next
  19.    
  20.     For K = 2 To Ligne
  21.         Cherch = FL1.Cells(K, 3) + FL1.Cells(K, 7)+ FL3.Cells(K,9)
  22.         For J = 2 To Lig
  23.             If Cherch = Plage(J) Then
  24.             FL2.Cells(J).EntireRow.Copy FL1.Cells(K)
  25.  
  26.                 Exit For
  27.             End If
  28.         Next J
  29.         DoEvents
  30.     Next K
  31.     Application.EnableEvents = True
  32.     Application.ScreenUpdating = True
  33. End Sub

Reply

Marsh Posté le 14-12-2012 à 11:25:40   

Reply

Marsh Posté le 14-12-2012 à 12:14:58    

 
               Bonjour !   Cela plante oui, mais où ?!   Sur quelle ligne et instruction ?
 
               Cela ne serait pas par hasard sur la ligne où il y a un FL3 à la place d'un FL1 ?!
 
               Vu le code, j'en déduis que c'est une version antérieure à 2007 (2003 ?) sinon il y aurait une sacré incohérence !
 
               Autre possible incohérence, DoEvents …
               A part ralentir le processus en donnant la main à d'autres applications, quid de son intérêt,
               surtout vu les évènements de l'application désactivés en début de code …
 
               Sinon l'incohérence principale concerne Cells(J) car les cellules d'une feuille sont numérotées par ligne et non en colonne !
               Cells(1) correspond à A1 tandis que Cells(2) fait référence à B1 …
 
               Donc pour recopier les 9 premières colonnes de la ligne J :

Code :
  1.                  FL2.Range(FL2.Cells(J, 1), FL2.Cells(J, 9)).Copy FL1.Cells(K, 1)


               Edit :   autre méthode pour définir les 9 premières cellules de la ligne J:

Code :
  1.                  FL2.Cells(J, 1).Resize(, 9).Copy FL1.Cells(K, 1)


Message édité par Marc L le 14-12-2012 à 12:30:48
Reply

Marsh Posté le 14-12-2012 à 12:30:22    

Merci pour ta réponse.
J'ai mis FL3 pour créer une nouvelle feuille et tout coller. J'ai oublié de remettre la valeur initiale.
Merci pour le correctif des 9 colonnes, ça me semble bon.
Par contre, il plante sur la ligne 21 du code avec "incompatibilité de type"
et pour copier/coller sur la cellule vide, je fais une recherche de cellule vide dans la colonne A?

Reply

Marsh Posté le 14-12-2012 à 12:37:40    

 
               L'incompatibilité proviendrait du contenu d'une cellule qui par exemple serait en mode texte au lieu de numérique …
 
               Pour la copie à la suite, je reviens plus tard le temps de vérifier un point.
 

Reply

Marsh Posté le 14-12-2012 à 12:44:10    

Merci encore!
J'ai réussi à coller depuis la première cellule vide en testant sur une seule variable, la colonne 3, en partant de ton correctif

Code :
  1. FL2.Cells(J, 1).Resize(, 9).Copy FL1.Cells(65535, 1).End(xlUp)(2)


Du coup je me retrouve avec des faux doublons! (colonnes 7 et 9 foireuses!)

Reply

Marsh Posté le 14-12-2012 à 12:58:29    

 
            Pour la copie à la suite de FL1 :

Code :
  1.             If Cherch = Plage(J) Then
  2.                 R = FL1.Columns(1).Cells(FL1.Rows.Count).End(xlUp).Row + 1
  3.                 FL2.Cells(J, 1).Resize(, 9).Copy FL1.Cells(R, 1)
  4.                 Exit For
  5.             End If


Message édité par Marc L le 14-12-2012 à 12:59:00
Reply

Marsh Posté le 14-12-2012 à 13:07:29    

Cela ne marche pas. Mes colonnes 7 et 9 sont toujours différentes.
J'ai "bidouillé la ligne suivante qui m'a indiqué le bon résultat:
 

Code :
  1. If Cherch = Plage(J) And FL1.Cells(K, 7) = FL2.Cells(J, 7) And FL1.Cells(K, 9) = FL2.Cells(J, 9) Then
  2.             FL2.Cells(J, 1).Resize(, 9).Copy FL1.Cells(65535, 1).End(xlUp)(2)


 
 
Edit: je pense que ta réponse ne faisait pas suite à ma question!


Message édité par bnono1975 le 14-12-2012 à 13:13:30
Reply

Marsh Posté le 14-12-2012 à 13:21:27    

 
               Dernier point :   mettre en dur la dernière ligne d'une feuille (65536) est valable jusqu'à la version 2003
               vu que les suivantes en ont beaucoup plus …
 
               Mieux vaut par exemple définir une variable en début de code puis s'y référer ensuite :
 
               DL = FL1.Rows.count
 
               […] FL1.Cells(DL, 1).End(xlUp)(2)
 
 
               Ou encore définir une variable directement sur la dernière cellule de la colonne A :
 
               Set Dc = FL1.Cells(FL1.Rows.count, 1)  
 
               […] Dc.End(xlUp)(2)


Message édité par Marc L le 14-12-2012 à 13:21:41
Reply

Marsh Posté le 14-12-2012 à 13:39:27    

 
               Autre méthode dans le cas d'une plage mise en forme mais dont certaines cellules sont vides,
               la copie devant être faite après cette plage :
 
               R = FL1.UsedRange(FL1.UsedRange.Count).Row + 1
               FL2.Cells(J, 1).Resize(, 9).Copy FL1.Cells(R, 1)


Message édité par Marc L le 14-12-2012 à 13:40:00
Reply

Marsh Posté le 14-12-2012 à 14:13:58    

Je te remercie pour tes précieux conseils.
Je vais me mettre à la page!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed