Copie de valeurs d'une colonne non identiques
Bonjour,
J'ai un petit problème à trouver la bonne macro pour régler mon problème!
J'ai un fichier de compilation de données contenant 6 feuilles, dont une générale ("Coordonnées") et les 4 autres regroupent les données trié par type. Ma première étape, c'est faire un tri par type à partir de ma feuille "Coordonnées" en d'ensuite copier les données dans la première colonne de chacune des feuilles selon le type.
Ma macro fonctionne très bien pour la première partie!
Voici mon problème: Je ne veux pas qu'il remplace mes données déjà copier dans ma feuille une première fois. Je veux que lorsque je lance la macro par la suite, qu'elle vérifie ou compare dans la feuille cible (à partir de Coordonnées) s'il y a des valeurs semble et ne copier que celles non identiques à la prochaine ligne vide. J'ai seulement besoin de comparer une colonne dans chaque feuille, non pas la feuille entière.
Mes données son stocké sous la forme suivante : C35021.
C'est la première fois que je fais des macros, donc si vous avez des suggestions pour améliorer mon code, vous êtes les bienvenue!!
Merci beaucoup!
Voici ma macro:
Sub CopieFeuillets()
'
' CopieForage Macro
Sheets("Coordonnées").Select
Range("D5").Select
ActiveSheet.Range("$A$4:$N$68").AutoFilter Field:=4, Criteria1:=Array("F", _
"FC", "FS", "FSZ"), Operator:=xlFilterValues
Range("C5").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("FORAGE").Select
Range("A8").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'CopieCPTU Macro
Sheets("Coordonnées").Select
ActiveSheet.Range("$A$4:$N$64").AutoFilter Field:=4, Criteria1:=Array("C", _
"CR", "FC"), Operator:=xlFilterValues
Range("C5").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("CPTU").Select
Range("A7").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'CopiePiézomètre Macro
Sheets("Coordonnées").Select
ActiveSheet.Range("$A$4:$N$64").AutoFilter Field:=4, Criteria1:=Array("Z", _
"FSZ"), Operator:=xlFilterValues
Range("C5").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("Piézomètres").Select
Range("B8").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'CopieInclinomètre Macro
Sheets("Coordonnées").Select
ActiveSheet.Range("$A$4:$N$64").AutoFilter Field:=4, Criteria1:=Array("i"), Operator:=xlFilterValues
Range("C5").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("Inclinomètres").Select
Range("B7").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Coordonnées").Select
ActiveWindow.SmallScroll Down:=-42
ActiveSheet.Range("$A$4:$N$64").AutoFilter Field:=4
Application.CutCopyMode = False
Selection.AutoFilter
Sheets("Accueil").Select
End SubBonsoir,
une proposition de correction à tester.
Sub CopieFeuillets()
'
' CopieForage Macro
Sheets("Coordonnées").Select
Range("D5").Select
ActiveSheet.Range("$A$4:$N$68").AutoFilter Field:=4, Criteria1:=Array("F", _
"FC", "FS", "FSZ"), Operator:=xlFilterValues
Range("C5").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("FORAGE").Select
Cells(Rows.Count, 1).End(xlUp).Offset(1).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'CopieCPTU Macro
Sheets("Coordonnées").Select
ActiveSheet.Range("$A$4:$N$64").AutoFilter Field:=4, Criteria1:=Array("C", _
"CR", "FC"), Operator:=xlFilterValues
Range("C5").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("CPTU").Select
Cells(Rows.Count, 1).End(xlUp).Offset(1).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'CopiePiézomètre Macro
Sheets("Coordonnées").Select
ActiveSheet.Range("$A$4:$N$64").AutoFilter Field:=4, Criteria1:=Array("Z", _
"FSZ"), Operator:=xlFilterValues
Range("C5").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("Piézomètres").Select
Cells(Rows.Count, 2).End(xlUp).Offset(1).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'CopieInclinomètre Macro
Sheets("Coordonnées").Select
ActiveSheet.Range("$A$4:$N$64").AutoFilter Field:=4, Criteria1:=Array("i"), Operator:=xlFilterValues
Range("C5").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("Inclinomètres").Select
Cells(Rows.Count, 2).End(xlUp).Offset(1).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Coordonnées").Select
ActiveWindow.SmallScroll Down:=-42
ActiveSheet.Range("$A$4:$N$64").AutoFilter Field:=4
Application.CutCopyMode = False
Selection.AutoFilter
Sheets("Accueil").Select
End SubMerci beaucoup pour la réponse!
Je voie un petit problème pour la feuille "CPTU", il me colle les données à partir de la ligne 207 et non pas à ligne 7. Tandis qu'avec les autres tout est ok. Je ne comprend pas pourquoi?
La seule différence que je peux voir dans ma feuille, j'ai un commentaire dans le bas de ma feuille. Ce sont des notes à l'usager dans un encadrer.
Qu'est ce que fait la fonction cells (rows.count, 1).....??
Merci!
bassmart a écrit :Merci beaucoup pour la réponse!
Je voie un petit problème pour la feuille "CPTU", il me colle les données à partir de la ligne 207 et non pas à ligne 7. Tandis qu'avec les autres tout est ok. Je ne comprend pas pourquoi?
je suppose qu'il y a une valeur en A206 (qui ne devrait pas y être ?)
Qu'est ce que fait la fonction cells (rows.count, 1).....??
Merci!
rows.Count détermine le nombre maximum de lignes d'un classeur (dépend de la version d'excel)
cells(rows.count,1).end(xlup) renvoie la première cellule non vide en colonne 1 en partant de la dernière ligne
Oui, effectivement!!
J'ai déplacer ma remarque pour qu'elle ne soit pas dans la première colonne et ça fonctionne!
Après avoir testé, il accepte les doublons par contre et il recopie chaque fois les même données! Donc je peux avoir 5 fois le même numéro, si je lance 5 fois la macro.
Est-ce qu'il y a une façon d'éviter ça?
Merci !
bassmart a écrit :Oui, effectivement!!
J'ai déplacer ma remarque pour qu'elle ne soit pas dans la première colonne et ça fonctionne!
Après avoir testé, il accepte les doublons par contre et il recopie chaque fois les même données! Donc je peux avoir 5 fois le même numéro, si je lance 5 fois la macro.
Est-ce qu'il y a une façon d'éviter ça?
Merci !
Oui, cela devrait être possible, il faut ajouter un test pour détecter les doublons. mais cela dépend des données.
- on peut ajouter une colonne pour identifier le fichier ou la version du fichier importé
- on peut tester sur un identifiant unique
- on tester sur toutes les valeurs d'une ligne
- ...
sans une idée précise des données, difficile de faire une proposition concrète.
Désolé!
Je t'explique un peu!
Dans ma feuille "Coordonnées", je retrouve tout mes numéro de sondage (sondage de sol ou forage) qui commence par une lettre et cette lettre change en fonction du type de sondage. Suivi de la lettre, j'ai une série de chiffre qui représente le numéro du sondage, le fournisseur de service et ensuite l'année de réalisation (ex: F35021-004-14, C35022-000-12, CR35023-006-13, FSZ35001-004-14). C'est numéro sont stockés dans ma colonne "C" de "Coordonnées".
J'ai ensuite, 4 feuilles regroupant chaque types de sondage. Une feuille pour les sondages qui inclus un "C", une feuille pour ceux qui commence par la lettre "F", une feuille pour ceux qui inclus la lettre "Z" et tous ceux qui commence par la lettre "I". Seulement les données de al colonne "C" de la feuille "Coordonnées" sont copié dans la colonne "A" de chacune des feuilles.
Le problème que j'ai, c'est que dans mes feuilles (4) qui regroupe tous les sondages par type, je doit faire un suivi afin de savoir si j'ai reçue les données du fournisseur, ect. Alors chacune de ces lignes doit rester associer au bonne donnée entrée! En plus, certain numéro peuvent être laissé vacant entre deux numéro pour être utilisé plus tard dans ma feuille "Coordonnées".
Donc, ce que je voudrais, c'est que la macro compare la colonne "A" de chacune des feuilles ("CPTU", "Forage", "Piézomètres" et "Inclinomètres") avec la colonne "C" de ma feuille "Coordonnées" afin que la macro copie seulement les nouveaux numéro dans la bonne feuille.
J'espère que c'est plus clair!
Merci beaucoup!
Bonjour,
peux-tu fournir un fichier de test ?
J'ai un petit problème, le fichier même compression fait plus de 700Ko!
Est-ce que je peux t'envoyé une version vraiment allégée?
Merci!
Bon voilà!
J'ai réussi! J'ai enlevé beaucoup de chose dans le fichier, mais les colonnes en questions sont là! Et j'ai laissé seulement la feuille "CPTU" pour faire des test.
Je me posais une autre question, est-ce possible qu'après la saisie d'une ligne on ajoute une ligne en dessous automatique, aulieu de faire une feuille avec 200 ou 300 ligne prédéfinie dans ma feuille?
Encore merci pour ton aide!
bonjour,
je ne parviens pas à ouvrir ce fichier. il semble corrompu.
J'essai encore!
Est-ce que ça se peux à cause que j'ai fait un fichier .xlsb?
Je t'envoie une troisième version!
En espérant que ça fonctionne!
je ne parviens toujours pas à les ouvrir.
peux-tu utiliser cjoint.com et mettre le lien du fichier ici
Bonsoir,
macro pour CPTU.
Sub CopieFeuillets()
'CopieCPTU Macro
With Sheets("Coordonnées")
.Range("$A$4:$N$64").AutoFilter Field:=4, Criteria1:=Array("C", "CR", "FC"), Operator:=xlFilterValues 'on filtre les données de coordonnées
Set ws = Sheets("CPTU") ' ws = référence de la feuille CPTU
nl = ws.Cells(Rows.Count, 1).End(xlUp).Row ' nl pointeur de dernière ligne utilisée dans CPTU basé sur colonne 1 (=A)
For Each r In .Range(.Range("C5"), .Range("C5").End(xlDown)) ' on parcourt toutes les cellules sélectionnées de la colonne C, (r=cellule en cours)
Set re = ws.Range("A:A").Find(r.Value, lookat:=xlWhole) 'on recherche le n°de sondage dans CPTU
If re Is Nothing Then 'si non trouvé
nl = nl + 1 ' on ajoute une nouvelle ligne
ws.Cells(nl, 1) = r.Value ' on met le numéro de sondage en colonne 1 (=A)
End If
Next
End With
End SubMerci pour la réponse!
Mais j'ai encore un problème! Quand je lance la macro, tout les autres lettres se copient aussi dans ma feuille CPTU.
re-bonsoir,
une correction
Sub CopieFeuillets()
'CopieCPTU Macro
With Sheets("Coordonnées")
.Range("$A$4:$N$64").AutoFilter Field:=4, Criteria1:=Array("C", "CR", "FC"), Operator:=xlFilterValues 'on filtre les données de coordonnées
Set ws = Sheets("CPTU") ' ws = référence de la feuille CPTU
nl = ws.Cells(Rows.Count, 1).End(xlUp).Row ' nl pointeur de dernière ligne utilisée dans CPTU basé sur colonne 1 (=A)
For Each r In .Range(.Range("C5"), .Range("C5").End(xlDown)).SpecialCells(xlVisible) ' on parcourt toutes les cellules sélectionnées de la colonne C, (r=cellule en cours)
Set re = ws.Range("A:A").Find(r.Value, lookat:=xlWhole) 'on recherche le n°de sondage dans CPTU
If re Is Nothing Then 'si non trouvé
nl = nl + 1 ' on ajoute une nouvelle ligne
ws.Cells(nl, 1) = r.Value ' on met le numéro de sondage en colonne 1 (=A)
End If
Next
End With
End SubVoici une version où, j'ai ajouté des numéros de sondage dans la colonne "C" de la feuille Coordonnées.
Merci beaucoup!
Ça fonctionne SUPER! Donc, je peux appliquer la même macro pour mes autres feuilles (en la modifiant bien sûr)!
J'aurais une autre question, comment fait-on pour faire ajouter une nouvelle ligne à la suite de la dernière ligne d'entrée dans la feuille Coordonnées?
Encore merci!
Je viens de remarquer qu'il ne prend pas la première valeur C35001-006-12. Elle commence par le deuxième ligne C35002-006-12.
re-bonsoir,
en imaginant que la nouvelle ligne à ajouter à la fin de feuille"coordonnées" se trouve dans "feuil1" en ligne1
with sheets("coordonnées")
sheets("feuil").rows(1).copy .rows(.cells(rows.count,1).end(xlup).row+1)
end withEn modifiant la macro pour mes autres feuilles tout marche super bien mais pour 2 feuilles, je n'arrive pas à trouver la solution! Je veux changer la colonne de destination, dans mes 2 feuilles la première colonne sont dans la position "B" et non "A".
Je n'arrive pas à trouver le paramètre à changer dans la macro.
Merci!