VBA : Copier/coller sur condition

Camille -  
danielc0 Messages postés 2176 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous,

J'en apprend tous les jours sur les macros mais mes compétences ne me permettent toujours pas de faire des choses simples par moi-même. :'(

Je vous explique (CF fichier joint https://www.cjoint.com/c/IFCs1XuhzZA ), j'ai trois petits besoins pour faire de la comparaison de projets :

1 - Je renseigne les données d'un projet dans la colonne H, en étude, une fois que j'ai terminé l'étude, je souhaite pouvoir la déplacer dans étudié (soit à la suite, soit on me demande à quelle position). Pour ce faire, je ne peux pas simplement copier coller toutes les cellules. Certaines ont besoin d'être copié en valeur, pour casser les formules; d'autres ont besoin de reprendre les formules. Pour cela je pensais dédier une colonne, ici la D pour dire de comment la cellule doit se copier.

2 - Ensuite j'aimerais pouvoir faire un RAZ de certaines cellules pour renseigner une nouvelle étude. De la même façon je pourrais avoir une colonne, ici la C pour dire quelles cellules vont voir leur contenu effacer.

3 - Je souhaite pouvoir faire marche arrière et ramener les données d'un projet étudié dans la colonne en étude. Les cellules à ramener sont les mêmes que celles qui sont à RAZ donc on peut se servir de la même colonne comme indicateur. Pour ça je pensais soit avoir un bouton devant chaque projets étudiés que je copie/colle en modifiant la colonne à copier, soit après avoir cliquer sur un bouton, on me demande quel projet je souhaite ramener.

Je précise que j'ai pour l'instant 180 lignes. Si vous avez d'autres idées de structure ou de façon de faire, je suis preneur ^^

Voilà

Ca fait un peu de texte mais au moins ça devrait être clair !

2 réponses

Résumé de la discussion

L'objectif est d'automatiser le déplacement des données d'un projet de la colonne H (étude) vers l'état "étudié", en gérant la copie soit par valeur, soit par transfert de formules selon une colonne indicatrice. Des macros nommées Copie, RAZ et MarcheArriere sont proposées pour prendre en compte l'indicateur dans la colonne D, afin de déplacer, réinitialiser ou restaurer les données selon la ligne du projet. D'autres échanges soulignent la préservation des bordures et du formatage et envisagent des solutions pratiques comme un bouton par ligne ou une invite pour choisir le projet à ramener.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. danielc0 Messages postés 2176 Date d'inscription   Statut Membre Dernière intervention   286
     
    Bonjour,
    Essaie ces trois macros :
    Sub Copie()
      Dim C As Range, Col As Integer
      'trouve la colonne à utiliser
      Col = Cells(3, Columns.Count).End(xlToLeft).Column + 1
      For Each C In Range("H3", Cells(Rows.Count, 8).End(xlUp)) 'Sélectionne la plage H3 à la dernière cellule remplie de la colonne H
        If C.Offset(, -4) = 0 Then
          Cells(C.Row, Col).Value = C.Value 'recopie valeurs
        ElseIf C.Offset(, -4) = 1 Then
          C.Copy Cells(C.Row, Col)  'collage standard
        End If
      Next C
    End Sub
    Sub RAZ()
      Dim C As Range
      For Each C In Range("H3", Cells(Rows.Count, 8).End(xlUp)) 'Sélectionne la plage H3 à la dernière cellule remplie de la colonne H
        If C.Offset(, -5) = 1 Then
          C.ClearContents 'efface la cellule
        End If
      Next C
    End Sub
    
    Sub MarcheArriere()
      Dim C As Range, Num As Variant, Col As Variant
      'Saisie du numéro de projet
      Num = InputBox("Entrez le numéro de projet")
      If Num = "" Then Exit Sub
      Col = Application.Match("Projet " & Num, [2:2], 0)
      If Not IsNumeric(Col) Then
        MsgBox "Projet " & Num & "  non trouvé"
        Exit Sub
      End If
      For Each C In Range("H3", Cells(Rows.Count, 8).End(xlUp)) 'Sélectionne la plage H3 à la dernière cellule remplie de la colonne H
        If C.Offset(, -5) = 1 Then
          C.Value = Cells(C.Row, Col).Value
        End If
      Next C
    End Sub

    Pose des questions sur ce que tu ne comprends pas.
    Cordialement.
    Daniel
    2
    1. Camille
       
      OOOOOHHH

      Merci Daniel ! Merci merci !
      T'as pas idée à quelle point ça me débloque !!
      Je viens de tester ça sur mon fichier de test et tout marche niquel, c'est exactement ce que je voulais !

      Je test ça sur mon fichier original et je reviens te dire si j'ai une galère.
      Mille merci !!!! :O
      0
    2. Camille
       
      Rebonjour Daniel,

      Alors, j'ai essayé de l'adapter, et à part pour transformer le H3, le reste je n'ai pas compris comment faire.
      J'ai tenté de modifier la lettre C par K mais ça n'a pas l'air de fonctionner.

      Dans le fichier joint, j'ai mis les données à d'autre emplacement, comme ça je pourrais voir la différence et je devrais y arriver.

      https://www.cjoint.com/c/IFDlUFvnNIA
      0
    3. Camille
       
      Comme je ne suis pas sur de bien avoir répondu pour que tu sois alerté, je retente comme ça ^^'
      0
    4. danielc0 Messages postés 2176 Date d'inscription   Statut Membre Dernière intervention   286 > Camille
       
      Essaie :

      Sub Copie()
        Dim K As Range, Col As Integer
        'trouve la colonne à utiliser
        Col = Cells(3, Columns.Count).End(xlToLeft).Column + 1
        '"8" est le numéro de la  colonne H, j'aurais pu mettre "H"
        For Each K In Range("O3", Cells(Rows.Count, "O").End(xlUp)) 'Sélectionne la plage O3 à la dernière cellule remplie de la colonne O
          If K.Offset(, -3) = 0 Then
            '"-3" est le décalage vers la gauche entre les colonnes O et L
            Cells(K.Row, Col).Value = K.Value 'recopie valeurs
          ElseIf K.Offset(, -3) = 1 Then
            K.Copy Cells(K.Row, Col)  'collage standard
          End If
        Next K
      End Sub
      Sub RAZ()
        Dim C As Range
        For Each C In Range("O4", Cells(Rows.Count, "O").End(xlUp)) 'Sélectionne la plage H3 à la dernière cellule remplie de la colonne H
          If C.Offset(, -4) = 1 Then
            C.ClearContents 'efface la cellule
          End If
        Next C
      End Sub
      
      Sub MarcheArriere()
        Dim C As Range, Num As Variant, Col As Variant
        'Saisie du numéro de projet
        Num = InputBox("Entrez le numéro de projet")
        If Num = "" Then Exit Sub
        Col = Application.Match("Projet " & Num, [2:2], 0)
        If Not IsNumeric(Col) Then
          MsgBox "Projet " & Num & "  non trouvé"
          Exit Sub
        End If
        For Each C In Range("O4", Cells(Rows.Count, "O").End(xlUp)) 'Sélectionne la plage H3 à la dernière cellule remplie de la colonne H
          If C.Offset(, -4) = 1 Then
            C.Value = Cells(C.Row, Col).Value
          End If
        Next C
      End Sub


      Daniel
      0
    5. Camille
       
      Merci Daniel.

      J'ai quelques petits "bugs", j'ai des données en colonne P et Q et on dirais que la macro (copie) cherche à coller dés que possible, tu sais comment je peux verrouille la première colonne à rechercher ?
      R en premier puis les suivante si R est déjà remplie ?
      Merci encore
      0
  2. Camille
     
    Bonjour Daniel, bonjour le forum,

    Je revient sur ce topic parce que j'ai remarqué un petit problème sur une des macros.
    Le code est le suivant :
    Sub Retour_en_etude()
    Dim C As Range, Num As Variant, Col As Variant
    Num = InputBox("Entrez le numéro de projet") 'Saisie du numéro de projet
    If Num = "" Then Exit Sub
    Col = Application.Match("Projet " & Num, [2:2], 0)
    If Not IsNumeric(Col) Then
    MsgBox "Projet " & Num & " non trouvé"
    Exit Sub
    End If
    For Each C In Range("H3", Cells(Rows.Count, "H").End(xlUp)) 'Sélectionne la plage H3 à la dernière cellule remplie de la colonne H
    If C.Offset(, -4) = 1 Then '"-4" est le décalage vers la gauche entre les colonnes H et D
    C.Value = Cells(C.Row, Col).Formula
    End If
    Next C
    End Sub


    Le problème c'est qu'il copie précisément le contenu de la formule donc le décalage ne prend pas.
    Si je fais un retour en étude de la colonne N à la colonne H, les formules qui prenaient N garde N alors qu'elle devrait passer sur H comme les autres macros.

    j'ai essayer de remplacer C.Value = Cells(C.Row, Col).Formula

    par C.Copy
    Cells(C.Row, Col).PasteSpecial xlPasteFormulas

    Qui est utilisait dans les autres macros mais ça ne fonctionne pas.

    Un idée ? :')
    0
    1. danielc0 Messages postés 2176 Date d'inscription   Statut Membre Dernière intervention   286
       
      Bonjour,

      Il faut que tu ouvres un nouveau fil de discussion avec le classeur actuel. Il y a eu beaucoup de modifications depuis le début. Si tu veux que je le suive, poste l'adresse du nouveau fil dans cette discussion.

      Daniel
      0
    2. Camille
       
      Ca va être assez long pour moi de recréer un fichier exemple. :S

      Toute les autres macro sont bonnes, y a que ce bout là C.Value = Cells(C.Row, Col).Formula
      qu'il faudrait pouvoir modifier comme les autres macros

      Par exemple une de tes autres macro ressemblait à ça
      Sub Copie()
      Dim C As Range, Col As Integer
      Col = Cells(3, 9).End(xlToRight).Column + 1 '"9" est le numéro de la colonne J, j'aurais pu mettre "J"
      If Col = Columns.Count + 1 Then Col = 11
      For Each C In Range("H3", Cells(Rows.Count, "H").End(xlUp)) 'Sélectionne la plage H3 à la dernière cellule remplie de la colonne H
      If C.Offset(, -3) = 0 Then '"-3" est le décalage vers la gauche entre les colonnes H et E
      Cells(C.Row, Col).Value = C.Value 'recopie valeurs
      ElseIf C.Offset(, -3) = 1 Then
      C.Copy
      Cells(C.Row, Col).PasteSpecial xlPasteFormulas 'collage spéciall formules
      End If
      Next C
      End Sub
      0
      1. danielc0 Messages postés 2176 Date d'inscription   Statut Membre Dernière intervention   286 > Camille
         
        J'ai retrouvé ce classeur. Est-ce que tu peux me donner un exemple ?

        Daniel
        0
    3. Camille
       
      Par exemple, en K33 j'ai la formule =3000*(K24-1)

      Quand j'active la macro et que je sélectionne la colonne K a reprendre, normalement toutes les lignes oû D=1 ça doit copier la formule (mais en gardant le déplacement actif) donc en H33 je devrait avoir =3000*(H24-1)

      Alors qu'actuellement en H33 j'ai =3000*(K24-1) : la formule a été copiée a l'identique

      Je sais pas si c'est plus clair ^^'
      0
      1. danielc0 Messages postés 2176 Date d'inscription   Statut Membre Dernière intervention   286 > Camille
         
        Voici le classeur. Prends un exemple sur ce classeur :

        https://mon-partage.fr/f/BG8r4dia/
        0