Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1525 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  macro recherche cellules dans 2 fichiers

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

macro recherche cellules dans 2 fichiers

n°2168080
bnono1975
Posté le 14-12-2012 à 11:25:40  profilanswer
 

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

mood
Publicité
Posté le 14-12-2012 à 11:25:40  profilanswer
 

n°2168089
Marc L
Posté le 14-12-2012 à 12:14:58  profilanswer
 

 
               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
n°2168093
bnono1975
Posté le 14-12-2012 à 12:30:22  profilanswer
 

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?

n°2168096
Marc L
Posté le 14-12-2012 à 12:37:40  profilanswer
 

 
               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.
 

n°2168097
bnono1975
Posté le 14-12-2012 à 12:44:10  profilanswer
 

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!)

n°2168098
Marc L
Posté le 14-12-2012 à 12:58:29  profilanswer
 

 
            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
n°2168099
bnono1975
Posté le 14-12-2012 à 13:07:29  profilanswer
 

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
n°2168101
Marc L
Posté le 14-12-2012 à 13:21:27  profilanswer
 

 
               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
n°2168102
Marc L
Posté le 14-12-2012 à 13:39:27  profilanswer
 

 
               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
n°2168105
bnono1975
Posté le 14-12-2012 à 14:13:58  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  macro recherche cellules dans 2 fichiers

 

Sujets relatifs
Recherche script PHP filtrage emailVBA couleurs de plusieurs cellules
[Divers] Recherche programmeur pour projet artistiqueRecherche Programmeur
Chercher/créer logiciel pour rechercher l’absence de fichiersMise en page d'un signet sous Word par macro
Déclenchement Macro à l'ouverture du fichierDéplacement de plusieurs cellules avec Private sub Worksheets_Change
Créer des fichiers numérotés[Site Web] Recherche programmeur et designer web
Plus de sujets relatifs à : macro recherche cellules dans 2 fichiers


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR