Copier ligne en effaçant le contenu de certaines cellules

Fermé
Fat17 Messages postés 87 Date d'inscription vendredi 25 août 2017 Statut Membre Dernière intervention 30 mars 2021 - 24 sept. 2017 à 11:54
 Fat17 - 1 oct. 2017 à 21:24
Bonjour le Forum,
J'ai besoin d'une petite macro pour copier une ligne qui va de A à Z en effaçant le contenu des cellules F, P et U et tout en gardant la mise en forme globale et le contenu des autres cellules.
Cette ligne une fois copiée et complétée avec d'autres valeurs en F, P et U sera de nouveau copiée pour une nouvelle facture et ainsi de suite.
La ligne peut se trouver n'importe où et peut être sélectionnée entièrement.
Merci pour votre aide
Cordialement
Fat


Version Excel : 2010


A voir également:

20 réponses

via55 Messages postés 14405 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 25 avril 2024 2 703
24 sept. 2017 à 12:46
Bonjour

Il faut d'autres précisions :
-ligne copiée où ?
- pour être collée où ?

Le mieux est de joindre un exemple de ton fichier en le postant sur cjoint.com, faire créer un lier, le copier et revenir le coller ici

Cdlmnt
Via
0
Fat17 Messages postés 87 Date d'inscription vendredi 25 août 2017 Statut Membre Dernière intervention 30 mars 2021
24 sept. 2017 à 15:51
Re-Bonjour
Il s'agit de n'importe quelle ligne qui est copiée.
Ensuite on choisit une cellule dans la colonne A (qui peut être n'importe où) et on copie la ligne en effaçant le contenu des cellules F, P et U et tout en gardant la mise en forme globale et le contenu des autres cellules.
Ce n'est peut être pas évident !
Cordialement
Fat
0
via55 Messages postés 14405 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 25 avril 2024 2 703
24 sept. 2017 à 17:18
Ca ne me dit toujours pas où la copier !!
Postes un exemple de ton fichier comme demandé en donnant un exemple d'une ligne à copier et de l'endroit ou la copier

Cdlmnt
Via

0
Fat17 Messages postés 87 Date d'inscription vendredi 25 août 2017 Statut Membre Dernière intervention 30 mars 2021
24 sept. 2017 à 17:38
Bonsoir,
Voici un modèle de ce que je cherche à faire
Salutations
A+

http://www.cjoint.com/c/GIypK7DUhiN
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
via55 Messages postés 14405 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 25 avril 2024 2 703
24 sept. 2017 à 20:53
Re

Ton fichier avec une macro qui se déclenche au double-clic sur une cellule de la ligne à copier (ALT+F11 pour voir la macro)
https://mon-partage.fr/f/Mzi8FER8/

Cdlmnt
Via
0
Merci beaucoup Via,

Ca marche bien, mais dans mon fichier d'origine, j'ai déjà utilisé le double clic pour la date du jour de saisie.

Voici la macro :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Target = Date
Target.Value = Target.Value
Cancel = True
End Sub

Il y a donc une confusion pour les deux macro qui bloquent.
Peut-on avoir à la place du double clic un raccourci du type Ctrl+F9 par exemple ?

Bonne soirée
Cordialement
Fat
0
via55 Messages postés 14405 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 25 avril 2024 2 703
24 sept. 2017 à 22:43
Re

Dans ce cas :
1) Créer un module : ouvrir editeur VBA - Insertion - Module
2) Dans ce module mettre la macro suivante :
Sub recop()
ligneC = InputBox("Entrer le n* de la ligne à recopier", "Copie d'une nouvelle ligne vierge")
If ligneC <> "" Then
If MsgBox("Etes-vous certain de vouloir copier la ligne " & ligneC & " en fin de tableau ?", vbYesNo, "Demande de confirmation") = vbYes Then
'première ligne vide
Dim Ligne As Long
Ligne = Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row + 1
'copier-coller
    Range("A" & ligneC & ":Z" & ligneC).Select
    Selection.Copy
    Range("A" & Ligne).Select
    ActiveSheet.Paste
    'Effacements
    Range("F" & Ligne).Select
    ActiveCell.FormulaR1C1 = ""
    Range("P" & Ligne).Select
    ActiveCell.FormulaR1C1 = ""
    Range("U" & Ligne).Select
    ActiveCell.FormulaR1C1 = ""
 End If
 End If
End Sub

3)Dans le Ruban Excel - Developpeur - Macros - Selectionner la macro puis Options et là tu peux définir le raccourci clavier de ton choix

Cdlmnt
Via
0
Fat17 Messages postés 87 Date d'inscription vendredi 25 août 2017 Statut Membre Dernière intervention 30 mars 2021
25 sept. 2017 à 17:18
Bonjour,

Merci Via pour la peine que tu t'es donnée.
J'aurais voulu supprimer les boîtes de dialogue et placer la ligne copiée non pas à la fin du tableau, mais à la première ligne vide représentée par exemple par la colonne F (Désignation Client) et ça par Ctrl+w.
(On peut éventuellement revenir au double clic après avoir désactivé celui de la date de saisie)
En effet, mon tableau contient une centaine de lignes partiellement vides qui donnent la chronologie et les enchaînements de numéros; et la copie doit se faire à la suite des lignes pleines.
Je renvoie le fichier actualisé pour info.
Cordialement
Fat

http://www.cjoint.com/c/GIzpodUHC6r
0
via55 Messages postés 14405 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 25 avril 2024 2 703
25 sept. 2017 à 18:02
Bonjour,

1° solution : macro à mettre dans un module, lui affecter après le raccourci voulu :
Sub recop()
ligneC = InputBox("Entrer le n* de la ligne à recopier", "Copie d'une nouvelle ligne vierge")
If ligneC <> "" Then

'première ligne vide en colonne H
Dim Ligne As Long
Ligne = Columns(8).Find("*", , , , xlByColumns, xlPrevious).Row + 1
'copier-coller
    Range("A" & ligneC & ":Z" & ligneC).Select
    Selection.Copy
    Range("A" & Ligne).Select
    ActiveSheet.Paste
    'Effacements
    Range("F" & Ligne).Select
    ActiveCell.FormulaR1C1 = ""
    Range("P" & Ligne).Select
    ActiveCell.FormulaR1C1 = ""
    Range("U" & Ligne).Select
    ActiveCell.FormulaR1C1 = ""
 End If

End Sub


La ligne choisie est recopiée en 1ere ligne vide trouvée en colonne G et donc se fait à la suite
On ne peut pas se passer de la boîte de dialogue car on doit bien indiquer quelle ligne copier, Excel ne peut le deviner !

2° solution : si comme je le pense la ligne à copier est forcement la dernière complétée en colonne F c'est cette macro qu'il faut appliquer, et là plus de boite de dialogue
Sub recop()
'dernière ligne remplie en colonne F
ligneC = Columns(6).Find("*", , , , xlByColumns, xlPrevious).Row
'première ligne vide en colonne H
Dim Ligne As Long
Ligne = Columns(8).Find("*", , , , xlByColumns, xlPrevious).Row + 1
'copier-coller
    Range("A" & ligneC & ":Z" & ligneC).Select
    Selection.Copy
    Range("A" & Ligne).Select
    ActiveSheet.Paste
    'Effacements
    Range("F" & Ligne).Select
    ActiveCell.FormulaR1C1 = ""
    Range("P" & Ligne).Select
    ActiveCell.FormulaR1C1 = ""
    Range("U" & Ligne).Select
    ActiveCell.FormulaR1C1 = ""
End Sub


Cdlmnt
Via
0
Bonsoir,
La 2ème solution est parfaite, et la dernière ligne pleine en F est bien recopiée dans la première ligne vide en I (au lieu de H) avec un simple Ctrl+w !
Seul bémol : Les cellules F, P et U restent pleines.
L'effacement ne se fait pas même s'il est mentionné dans la macro !
Quoi faire ?
Merci de trouver la parade, ça serait vraiment magique !

Sincères salutations
Fat
0
via55 Messages postés 14405 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 25 avril 2024 2 703
25 sept. 2017 à 20:30
Re

Tu as bien recopié la macro exactement ?
Chez moi elle fonctionne, voir ce fichier :
https://www.cjoint.com/c/GIzsEknPcMC

Cdlmnt
Via
0
Bonsoir,
Effectivement, la macro fonctionne très bien sur le fichier modèle, mais sur l'original. Pourtant, j'ai fait un "copier / coller".
J'ai même déplacer la macro du module vers la feuille concernée, mais le résultat est le même.
Mystère et boule de gomme !
Le temps fera bien les choses.
Merci beaucoup pour l'intérêt que tu as porté à ce sujet.

Si je peux me permettre une autre question :
Je n'arrive pas à concaténer les 3 formules suivantes (qui fonctionnent bien séparément) en une seule formule.
=INDEX(BEA!$D$2:$D$9999;EQUIV(D10;BEA!$G$2:$G$9999;0))
=INDEX(BNP!$D$2:$D$9999;EQUIV(D10;BNP!$G$2:$G$9999;0))
=INDEX(CAS!$D$2:$D$9999;EQUIV(D10;CAS!$G$2:$G$9999;0))
Il s'agit d'une recherche dans 3 feuilles distinctes avec le critère commun à gauche de la donnée recherchée.

Merci 1000 fois
Cordialement
Fat
0
via55 Messages postés 14405 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 25 avril 2024 2 703
25 sept. 2017 à 22:12
Que veux tu dire pas concaténer ?
Tu veux les 3 résultats des 3 INDEX à la suite ? en ce cas
=INDEX(BEA!$D$2:$D$9999;EQUIV(D10;BEA!$G$2:$G$9999;0))
& "-" & INDEX(BNP!$D$2:$D$9999;EQUIV(D10;BNP!$G$2:$G$9999;0))
& " -" & INDEX(CAS!$D$2:$D$9999;EQUIV(D10;CAS!$G$2:$G$9999;0))

ou alors tu veux le 2nd résultat si le 1er ne donne rien et le 3eme si le 2nd non plus ? en ce cas il faut passer par SIERREUR :
=SIERREUR(INDEX(BEA!$D$2:$D$9999;EQUIV(D10;BEA!$G$2:$G$9999;0));SIERREUR(INDEX(BNP!$D$2:$D$9999;EQUIV(D10;BNP!$G$2:$G$9999;0));INDEX(CAS!$D$2:$D$9999;EQUIV(D10;CAS!$G$2:$G$9999;0)) ))

Cdlmnt
Via
0
Magnifique !
C'était la 2ème variante qui était recherchée.
En fait, il s'agit d'un état de dates de références de paiement de factures par rapport à 3 comptes différents.
J'ai les bonnes dates pour les paiements avec références (N° Chèque) et ce qui était recherché.
J'ai 00-01-00 pour les paiements avec références mais sans date
Et j'ai #N/A pour les factures non encore payées, donc absentes dans les relevés de compte.
Ça serait chouette si on pouvait avoir du blanc à la place pour les 2 derniers cas!
Je suis sincèrement admiratif pour la pertinence des réponses apportées.
1000 fois merci !
Bonne nuit
Fat
0
Re-bonsoir
J'ai pu supprimer les #N/A en ajoutant SIERREUR( au début de ta formule, et ;"") à la fin, et ça marche très bien !
Je suis content
A+
0
Fat17 Messages postés 87 Date d'inscription vendredi 25 août 2017 Statut Membre Dernière intervention 30 mars 2021
27 sept. 2017 à 17:48
Bonjour Via,

J'ai pu trouver la faille qui empêchait la macro de fonctionner chez moi.
En fait, j'avais la macro ci dessous pour avoir le code article en Colonne I toujours en Majuscule
Private Sub WorkSheet_Change(ByVal Target As Range)
If Target.Count > 1 Then End
If Not Application.Intersect(Target, Range("i4:i9999")) Is Nothing Then
If Not IsEmpty(Target) Then
Application.EnableEvents = False
Target.Value = UCase(Target.Value)
Application.EnableEvents = True
End If
Else
End If
End Sub

J'ai déplacé cette macro dans un module, mais elle ne répond plus.
(il doit y avoir une correction d'écriture à faire pour l'affecter à partir du module à une ou plusieurs feuilles)
La bonne nouvelle, c'est que la macro "copier ligne avec effacement) qui est aussi dans un module tourne très bien !

Salutations amicales
Fat
0
via55 Messages postés 14405 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 25 avril 2024 2 703
27 sept. 2017 à 18:15
Bonsoir Fat,

Bien !
Ta macro Private Sub WorkSheet_Change(ByVal Target As Range) ets une macro d'événement de feuille et doit donc être dans le worksheet de la feuille et pas dans un module
Remets ta macro dans le worksheet de la feuille 1 et pour faire concilier les deux il suffit de shunter ta macro lorsque la mienne s'applique, pour cela :
1) En début de ta macro tu rajoutes la ligne :
If macro = 1 Then Exit Sub

2 Dans ma macro tu rajoutes en début la ligne :
macro=1
et en fin de macro :
macro=0

3) Dans module avant ma macro tu déclares cette variable macro avec cette ligne :
Public macro As Integer

Cdlmnt
Via
0
Bonsoir Via,
Désolé, j'ai du m'absenter.
J'ai appliqué les consignes données, mais je n'ai pas de résultat.
Alors une précision STP:
Point 1 / En début de macro = avant sub ?
Point 2 / En début de ligne = avant sub ? et En fin de macro = après sub ?
Point 3 / avant macro = avant sub ?
Cordialement
Fat
0
via55 Messages postés 14405 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 25 avril 2024 2 703
28 sept. 2017 à 20:47
Bonsoir Fat

1)En début de macro = juste après Sub

2)En début de macro = juste après Sub
En fin de macro = juste avant End Sub

3) Avant Sub

Cdlmnt
Via

0
Bonsoir Via,
Tout ce que tu proposes est JUSTE !
J'ai fait les correctifs envoyés, et tout fonctionne correctement.
1001 merci pour rester dans un langage binaire.
Je suis comblé parce-que mon projet avance bien et s'enrichit de jour en jour.
Cordialement
Fat
0