Macro

Résolu
Bonjour,
J'ai une macro qui copie une ligne (la dernière remplie sur un tableau) et qui la colle sur la ligne voulue.

Cette macro marche, jusque là tout va bien

Mais j'aimerais bien trouver la macro qui me permettra de gérer la mise en forme

Il faudrait qu'à la fin, la ligne soit quadrillée de la colonne A à la colonne L

De plus, la colonne K doit avoir un fond rouge si >=49, orange si >=28 et vert si <28

Une idée?

--
Après Open Office essayez Opin Offece :P
Configuration: ...

7 réponses

Résumé de la discussion

Problème posé : une macro doit, après copie et collage d'une ligne, appliquer une mise en forme quadrillant les colonnes A à L et colorier la colonne K selon des seuils définis. Parmi les solutions, une approche consiste à écrire une fonction de mise en forme qui ajoute des bordures et applique une couleur d’intérieur, appelée après chaque condition. Certaines propositions précisent que la coloration de K doit être rouge ≥49, orange ≥28 et vert <28, et recommandent d’utiliser Range pour cibler A à L et activer le formatage après insertion. En pratique, il est conseillé d'appeler la fonction de mise en forme après l'opération de collage et d'utiliser Range(Cells(nuli+1,1), Cells(nuli+1,12)) pour cibler A à L.

Bobot (l’IA à votre service)
  1. Modérateur
    Qu'entends tu par "quadrillée"? Tu veux une bordure? Fine? grosse? Sinon essaie avec l'enregistreur de macro.
    0
    1. Je veux bordure fine pour chaque case de ma ligne (de a à l)
      Et les couleurs conditionnelles pour la case K
      0
      1. Modérateur
        As tu essayé l'enregistreur de macro?
        Tu fais : Outils/Macros/Nouvelle macro
        et tu exécutes toutes les manipulations à automatiser. Y compris ta MFC.
        Ensuite tu va voir le code dans l'un des Modules Visual Basic
        0
    2. Le souci avec cette manip c'est que la macro enregistre la ligne que je sélectionne à la main et non celle qui vient d'être collée
      0
      1. Bonjour,
        Eh bien, rien ne vous empêche de corriger la macro dans le bon sens.
        C'est encore nous qui décidons et non pas la machine.
        0
        1. Modérateur
          Salut,
          Tout à fait ok avec Mr Le pingou.
          Tu enregistres ta macro avec une ligne que tu sélectionnes et après tu appliques le format avec la ligne que tu "colles".
          Personnellement, pour tout ce qui est format de cellules (bordures, couleurs de remplissage) je procède comme cela. Alors inutile pour moi de te donner ici le code d'une macro enregistrée.
          Si tu as des soucis pour l'adapter à ton code, reviens ici, on se fera un plaisir de t'aider.
          0
          1. Alors petite question

            comment appliquer la mise en forme enregistrée manuellement à chaque fonction "If" associée à la case N1 dans la macro suivante?

            Private Sub CommandButton1_Click()
            Sheets("données").Range("m1") = ComboBox1.Value
            Sheets("données").Range("n1") = ComboBox2.Value
            Sheets("données").Range("o1") = TextBox1.Value
            Sheets("données").Range("p1") = ComboBox4.Value
            Sheets("données").Range("q2") = ComboBox5.Value
            Sheets("données").Range("r2") = ComboBox6.Value
            Sheets("données").Range("s1") = TextBox2.Value
            Sheets("données").Range("t2") = ComboBox7.Value
            Sheets("données").Range("u1") = TextBox3.Value

            If Sheets("données").Range("m1") = "Administratif" Then
            Sheets("Administratif").Select
            Dim a As Integer
            a = Range("a65536").End(xlUp).Offset(1, 0).Row
            Range("a" & a) = Sheets("données").Range("o1")
            Sheets("données").Range("l1").Copy
            Range("b" & a).Select
            ActiveCell.PasteSpecial
            If ActiveCell.Value = "Photo" Then ActiveCell.Comment.Visible = False
            Range("c" & a) = Sheets("données").Range("p1").Value
            Range("d" & a) = Sheets("données").Range("q1").Value
            Range("e" & a) = Sheets("données").Range("r1").Value
            Range("f" & a) = Sheets("données").Range("w1").Value
            Range("h" & a) = Sheets("données").Range("t1").Value
            Range("i" & a) = Sheets("données").Range("w1").Value
            Range("l" & a) = Sheets("données").Range("u1").Value
            Range("g" & a) = Sheets("données").Range("s1").Value
            Range("j" & a) = Sheets("données").Range("x1").Value
            Range("k" & a) = Sheets("données").Range("y1").Value

            If Sheets("données").Range("n1") = "Tous les bâtiments administratifs" Then
            Dim nuli As Integer
            nuli = Sheets("administratif").Cells.Find(What:="Tous les bâtiments administratifs", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlNext).Row
            Sheets("administratif").Range("A" & nuli).Offset(1, 0).EntireRow.Insert Shift:=xlDown
            Sheets("administratif").Range("A65536").End(xlUp).EntireRow.Cut Range("A" & nuli).Offset(1, 0)
            End If

            If Sheets("données").Range("n1") = "Poste de travail informatique" Then
            Dim nuli1 As Integer
            nuli1 = Sheets("administratif").Cells.Find(What:="Poste de travail informatique", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlNext).Row
            Sheets("administratif").Range("A" & nuli1).Offset(1, 0).EntireRow.Insert Shift:=xlDown
            Sheets("administratif").Range("A65536").End(xlUp).EntireRow.Cut Range("A" & nuli1).Offset(1, 0)
            End If

            If Sheets("données").Range("n1") = "Salle de repas" Then
            Dim nuli2 As Integer
            nuli2 = Sheets("administratif").Cells.Find(What:="Salle de repas", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlNext).Row
            Sheets("administratif").Range("A" & nuli2).Offset(1, 0).EntireRow.Insert Shift:=xlDown
            Sheets("administratif").Range("A65536").End(xlUp).EntireRow.Cut Range("A" & nuli2).Offset(1, 0)
            End If

            If Sheets("données").Range("n1") = "Vestiaires" Then
            Dim nuli3 As Integer
            nuli3 = Sheets("administratif").Cells.Find(What:="Vestiaires", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlNext).Row
            Sheets("administratif").Range("A" & nuli3).Offset(1, 0).EntireRow.Insert Shift:=xlDown
            Sheets("administratif").Range("A65536").End(xlUp).EntireRow.Cut Range("A" & nuli3).Offset(1, 0)
            End If

            ETC ..........

            0
            1. Modérateur
              Perso je ferais ceci :
              Créer une fonction "mise en forme" dans le même module que ton code ci dessus;
              de ce style :

              Function mise_en_forme()
                  Selection.Borders(xlDiagonalDown).LineStyle = xlNone
                  Selection.Borders(xlDiagonalUp).LineStyle = xlNone
                  With Selection.Borders(xlEdgeLeft)
                      .LineStyle = xlContinuous
                      .Weight = xlThin
                      .ColorIndex = xlAutomatic
                  End With
                  With Selection.Borders(xlEdgeTop)
                      .LineStyle = xlContinuous
                      .Weight = xlThin
                      .ColorIndex = xlAutomatic
                  End With
                  With Selection.Borders(xlEdgeBottom)
                      .LineStyle = xlContinuous
                      .Weight = xlThin
                      .ColorIndex = xlAutomatic
                  End With
                  With Selection.Borders(xlEdgeRight)
                      .LineStyle = xlContinuous
                      .Weight = xlThin
                      .ColorIndex = xlAutomatic
                  End With
                  With Selection.Borders(xlInsideVertical)
                      .LineStyle = xlContinuous
                      .Weight = xlThin
                      .ColorIndex = xlAutomatic
                  End With
                  With Selection.Borders(xlInsideHorizontal)
                      .LineStyle = xlContinuous
                      .Weight = xlThin
                      .ColorIndex = xlAutomatic
                  End With
                  With Selection.Interior
                      .ColorIndex = 36
                      .Pattern = xlSolid
                  End With
              End Function


              Ensuite, il suffit d'appeler cette fonction sous tout tes If comme ceci :

              If Sheets("données").Range("n1") = "Vestiaires" Then 
              Dim nuli3 As Integer 
              nuli3 = Sheets("administratif").Cells.Find(What:="Vestiaires", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlNext).Row 
              Sheets("administratif").Range("A" & nuli3).Offset(1, 0).EntireRow.Insert Shift:=xlDown 
              Sheets("administratif").Range("A65536").End(xlUp).EntireRow.Cut Range("A" & nuli3).Offset(1, 0) 
              Range(Cells(1, nuli3 + 1),Cells(12, nuli3 + 1)).Select 'sélectionne tes cellules A à L
              call mise_en_forme
              End If
              0
            2. @pijakuIf Sheets("données").Range("n1") = "Tous les bâtiments administratifs" Then
              Dim nuli As Integer
              nuli = Sheets("administratif").Cells.Find(What:="Tous les bâtiments administratifs", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlNext).Row
              Sheets("administratif").Range("A" & nuli).Offset(1, 0).EntireRow.Insert Shift:=xlDown
              Sheets("administratif").Range("A65536").End(xlUp).EntireRow.Cut Range("A" & nuli).Offset(1, 0)
              Range(Cells(1, nuli + 1), Cells(12, nuli + 1)).Select
              Call Mise_en_forme
              Range(Cells(1, nuli + 11)).Select
              Call Colour

              J'ai séparé ma macro manuelle en deux fonctions (vu que ce ne sont pas les mêmes cellules concernées)

              Pourquoi la ligne en gras bug t elle?
              0
            3. Modérateur
              @Farfadet88La syntaxe lorsque tu utilises Cells dans un Range est :
              Range(Cells1, Cells2)

              Tu écris :
              Range(Cells1)
              0
            4. @pijakuque dois je mettre pour sélectionner la case K de la ligne active alors?
              0
            5. Modérateur
              @Farfadet88Range("K" & nuli + 11)
              tout simplement...
              Je te propose de boire un p'tit café non?

              ps je plaisante...
              0
          2. Salut,

            Comme on te l'a expliqué sur plusieurs post dans la discussion, lorsqu'on commence en programmation, le plus simple est d'utiliser l'assistant macro.
            Je te conseille d'écrire sur une feuille la chronologie de ton enregistrement, parce qu'une fois l'assistant macro ouvert, il enregistre tout ce qui est fait.

            Un fois l'enregistrement terminé il est possible de supprimer des lignes inutiles mais avant pour tester une ligne il est possible de la neutraliser en mettant une apostrophe au début exemple

            'Cells(i, 1).Value = Cells(1, i).Value

            S'il n'y a pas d'incidence sur le code la supprimer
            0
            1. pas de souci pour l'enregistrement

              Juste des problèmes pour modifier le code après
              0