Copier ligne en effaçant le contenu de certaines cellules

Fat17 Messages postés 90 Statut Membre -  
 Fat17 -
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

20 réponses

  1. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    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
  2. Fat17 Messages postés 90 Statut Membre
     
    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
  3. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    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
  4. Fat17 Messages postés 90 Statut Membre
     
    Bonsoir,
    Voici un modèle de ce que je cherche à faire
    Salutations
    A+

    http://www.cjoint.com/c/GIypK7DUhiN
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    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
  7. Fat17
     
    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
  8. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    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
  9. Fat17 Messages postés 90 Statut Membre
     
    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
  10. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    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
  11. Fat17
     
    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
  12. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    Re

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

    Cdlmnt
    Via
    0
  13. Fat17
     
    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
  14. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    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
  15. Fat17
     
    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
  16. Fat17
     
    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
  17. Fat17 Messages postés 90 Statut Membre
     
    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
  18. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    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
  19. Fat17
     
    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
  20. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    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
  21. Fat17
     
    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