Copie d'une ligne vers une autre feuille sous condition
Bonjour,
Je débarque dans ce site et je suis novice en VBA.
J'ai une problématique "simple" pour des aguerris de VBA mais je ne parviens pas à trouver de solution malgré tous les posts que j'ai lu sur des sujets presque similaires.
Mon problème est le suivant :
J'ai deux feuilles : Feuille = Synthèse et Feuille 2= Rapport.
Ma feuille synthèse ne contient qu'une ligne de données dont les valeurs sont variables ( ventes mensuelles d'un produit)
Or ma feuille Rapport doit contenir des valeurs fixes se basant sur les données de la feuille Synthèse.
L'idée est donc de copier /coller la ligne de synthèse vers Rapport sous deux conditions :
- si les valeurs n'existent pas encore dans la feuille Rapport alors on les copie
- si elles existent déjà, alors on les remplace
- si elles n'existent pas encore on les rajoute
J'ai déjà créé un début de macro en passant par l'enregistreur de macro ( je ne sais pas faire mieux pour le moment
Range("B6:P6").Select
Selection.Copy
Sheets("Rapport").Select
Range("B4").Select
Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
, SkipBlanks:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Je remercie d'avance ceux qui voudront bien se pencher sur mon problème et me filer un coup de main.
Salut,
tes conditions (me) sont confuses :
denpat a écrit :
- si les valeurs n'existent pas encore dans la feuille Rapport alors on les copie
- si elles existent déjà, alors on les remplace
- si elles n'existent pas encore on les rajoute
quelle différence entre la condition 1 et la condition 3
Ce que j'en comprends, c'est que dans les 3 cas on effectue la même opération : copier et coller au même endroit.
Merci de préciser
Bonjour et merci GameOver de t’intéresser à mon problème.
Je vais essayer d'être plus précise : je voudrais que la macro rajoute les valeurs de la feuille synthèse dans la feuille rapport,, ce qui suppose donc un rajout de ligne plus copier coller.
La seule condition pertinent est que si les valeurs n'existent pas encore dans la feuille Rapport, on copie sur la ligne suivante.
J'espère que c'est un peu plus clair
Bonjour,
Quelle est la condition pour copier sur une nouvelle ligne ?
- Une (ou plusieurs) valeur(s) différente(s).
- La totalité des valeurs différentes.
A+
Encore Merci de l'intérêt apporté à mon problème.
Je viens de rajouter dans le fichier une clé qui servira de condition pour la copie.
Cette clé fait référence au produit.
Si le produit existe déjà dans la feuille Rapport on remplace les valeurs de la prévision calculée mensuellement par les nouvelles valeurs. Si le produit n'existe pas encore dans la feuille Rapport on copie les données à la suite sur la ligne suivante.
j'ai actualisé le fichier avec la modification que je viens de faire.
Merci encore.
Bonsoir Frangie,
Encore merci pour m'avoir aiguillé et d'avoir parfait le code pour la macro. Il fonctionne très bien.
Je le mets en évidence s'il peut servir à d'autres :
Sub copiePV()
Dim WsS As Worksheet, WsC As Worksheet
Dim Cel As Range, C As Range
Dim LigneAjout As Long
Set WsS = Worksheets("Synthèse")
Set WsC = Worksheets("Rapport")
For Each Cel In WsS.Range("A5:A" & WsS.Range("A" & Rows.Count).End(xlUp).Row)
Set C = WsC.Columns(1).Find(Cel, , xlValues, xlWhole)
LigneAjout = WsC.Range("A" & Rows.Count).End(xlUp).Row + 1
If Not C Is Nothing Then
Cel.Resize(, 16).Copy WsC.Range("A" & C.Row)
Else
Cel.Resize(, 16).Copy WsC.Range("A" & LigneAjout)
LigneAjout = LigneAjout + 1
End If
Next Cel
Set C = Nothing: Set WsS = Nothing: Set WsC = Nothing
End Sub
C'est vraiment génial.
A+
Frangy,
Je viens de mettre en évidence un léger souci avec la macro, en effet en l'exploitant dans des conditions réelles, je me rends compte qu'elle ne fait pas un collage spécial des valeurs de toutes les cellules. En effet dans la réalité les cellules B5 à D5 de la feuille de synthèse contiennent des formules et donc la copie faite par la macro les reprend....
J'ai essayé d'adapter la formule en mettant une collage valeurs spéciales en mettant xlPasteValues en lieu et place de xlValues mais cela ne change rien au résultat.
Set C = WsC.Columns(1).Find(Cel, , xlPasteValues, xlWhole)
Est-ce possible d'optimiser ?
A bientôt
Essaie comme cela
Sub copiePV()
Dim WsS As Worksheet, WsC As Worksheet
Dim Cel As Range, C As Range
Dim LigneAjout As Long
Application.ScreenUpdating = False
Set WsS = Worksheets("Synthèse")
Set WsC = Worksheets("Rapport")
For Each Cel In WsS.Range("A5:A" & WsS.Range("A" & Rows.Count).End(xlUp).Row)
Set C = WsC.Columns(1).Find(Cel, , xlValues, xlWhole)
LigneAjout = WsC.Range("A" & Rows.Count).End(xlUp).Row + 1
If Not C Is Nothing Then
Cel.Resize(, 16).Copy
WsC.Range("A" & C.Row).PasteSpecial (xlPasteValues)
Else
Cel.Resize(, 16).Copy
WsC.Range("A" & LigneAjout).PasteSpecial (xlPasteValues)
LigneAjout = LigneAjout + 1
End If
Next Cel
Application.CutCopyMode = False
Set C = Nothing: Set WsS = Nothing: Set WsC = Nothing
End SubA+
Bonjour Frangy,
Je te remercie car ta correction avec le copier/valeurs marche impeccablement
La macro ne fait pas encore un remplacement des valeurs dans la feuille Rapport quand la clé existe déjà.
J'ai rajouté la variable Dim LigneRemplace As Long avec l'instruction suivante
LigneRemplace = WsC.Range("B" & Rows.Count).End(xlUp).Row
Else
Cel.Resize(, 16).Copy
WsC.Range("B" & LigneRemplace).PasteSpecial (xlPasteValues)
LigneRemplace = LigneRemplace
Mais le problème c'est que du coup je perds le rajout de ligne.... ( je précise que je débute sur VBA et donc mon niveau de maîtrise est quasi nul !)
A mon avis il faudrait que je rajoute plutôt une boucle dans l'instruction pour demander à la macro de faire une recherche dans la feuille rapport et si elle trouve la clé alors elle remplace la valeur....
Sans vouloir abuser de ta patience si tu as une idée je suis preneuse, sinon je vais déjà m'accommoder du code que tu m'as envoyé et revoir mon process de fonctionnement.
Merci encore.
A bientôt !
La macro ne fait pas encore un remplacement des valeurs dans la feuille Rapport quand la clé existe déjà.
Si, si ! la macro fait déjà ça.
Voici le code commenté pour faciliter sa compréhension.
Sub copiePV()
Dim WsS As Worksheet, WsC As Worksheet
Dim Cel As Range, C As Range
Dim LigneAjout As Long
Application.ScreenUpdating = False
Set WsS = Worksheets("Synthèse")
Set WsC = Worksheets("Rapport")
'On effectue un balayage de chacune des clés dans la colonne A de la feuille "Synthèse"
For Each Cel In WsS.Range("A5:A" & WsS.Range("A" & Rows.Count).End(xlUp).Row)
'On cherche une correspondance de chaque clé dans la feuille "Rapport"
Set C = WsC.Columns(1).Find(Cel, , xlValues, xlWhole)
LigneAjout = WsC.Range("A" & Rows.Count).End(xlUp).Row + 1
'Si la clé existe
If Not C Is Nothing Then
'alors, on effectue la copie des données de la colonne A à la colonne P de la feuille "Synthèse"
Cel.Resize(, 16).Copy
'puis on effectue le remplacement de ces données dans la feuille "Rapport"
WsC.Range("A" & C.Row).PasteSpecial (xlPasteValues)
Else
'sinon, on effectue la copie des données de la colonne A à la colonne P de la feuille "Synthèse"
Cel.Resize(, 16).Copy
'puis on effectue le collage de ces données dans une nouvelle ligne de la feuille "Rapport"
WsC.Range("A" & LigneAjout).PasteSpecial (xlPasteValues)
LigneAjout = LigneAjout + 1
End If
Next Cel
Application.CutCopyMode = False
Set C = Nothing: Set WsS = Nothing: Set WsC = Nothing
End SubA+
Bonsoir Frangy,
Je viens de revérifier et c'est moi qui avais mal la macro dans les conditions réelles.
J'ai apporté un correctif après t'avoir lu.
Merci beaucoup pour les explications détaillées.
A très bientôt sur le forum !
Bonjour à tous,
Je vous sollicite pour avoir votre aide.
J'ai créer une feuille de calcul sur excel 2016
Je souhaite copier copier une ligne entière de ma feuille "saisie" sur différentes feuilles suivant une condition d'une cellule
dans ma feuille "SAISIE" j'ai une colonne "envoyé par" , une colonne "destinataire" et d'autres
sur la ligne "5"
Si dans la cellule "envoyé par" je marque "A" je veux que toute la ligne se copie sur la feuille "A" ...B vers B etc...
Si Si dans la cellule "destinataire" je marque "TOTO" je veux que toute la ligne se copie sur la feuille "TOTO" ...BIBI vers BIBI etc...
donc jusqu'ici, j'ai réussi mais mon problème est que je souhaite également q'une fois les lignes copiées sur les autres feuilles, je veux que quand je complète depuis la feuille "A" les info se copie également sur la feuille "SAISIE"
avec mon code je peux seulement compléter modifier sur saisie et j'ai qu'un visuelle sur les feuilles respectives.
voila dans un premier temps...
merci d'avance