Supprimer résultats d'un Userform

Bonjour,

Je mets actuallement à jour des fichiers de masse salariale en vue de les automatiser au maximum. En gros, la masse salariale est répartie par centre de coût. J'ai donc créé un bouton via Userform sur VBA qui permette de sélectionner le centre de coût souhaité.

Entre le sub et end sub de ce userform, j'ai enregistré un tas d'actions que je souhaitais être exécutées dès la sélection du centre de coût.

Mon problème: Lorsque je change de sélection en passant par la boîte de dialogue créée, mes résultats du nouveau centre de coûts se superposent aux anciens qui ne s'effacent pas automatiquement.

Du coup, comme la masse salariale n'est pas figée d'un centre de coûts à l'autre, j'ai des lignes d'employés qui restent et qui n'ont rien à faire dans ma nouvelle sélection.

Je me disais qu'en essayant de créer une fonction à la fin du userform qui permette de supprimer les résultats précédents dès lors qu'un centre de coûts différent est sélectionné résoudrait mon problème.

Seulement, je n'ai aucune idée concernant la manière dont je peux faire fonctionner une telle macro, je compte donc un peu (beaucoup) sur vos lumières.

A l'avance, merci merci merci.

10 réponses

  1. Bonjour,

    Si j'ai bien compris, lors de la sélection (Combobox ?) d'un centre de coût, exécution du code.

    Ou vont les résultats ? (affichage ou autre)

    Si vous voulez que je vous fournisse une solution, le plus simple est de m'envoyer par mail le code et la grille Userform.

    Merci

    Didier
    0
    1. Contributeur
      Bonjour,

      on ne demande pas à l'utilisateur d'envoyer par mail le code, mais de le mettre à disposition ici, afin que cela puisse profiter à tout le monde sur le site.

      Cordialement.
      0
    2. Exactement Didier. Lorsque le centre de coût est sélectionné via la boîte de dialogue, les résultats s'affichent automatiquement dans la même feuille.

      Je vous ai envoyé ci dessous le détail de mon code qui ne doit pas faire peur ! Beaucoup de lignes, mais très peu d'opérations au final comme je l'explique plus bas.

      Merci
      0
  2. Bonjour Mr Chossette9,

    Afin d'éviter des manipulations inutiles du style : Copier/coller, il est plus facile de loader l'application directement avec les sources.

    La solution sera positionnée sur le site avec bien sur le source modifié.

    Cordialement

    Didier
    0
    1. Contributeur
      Du coup, il est utile de proposer à l'utilisateur de déposer son fichier sur le site cijoint.fr, et de copier le lien généré dans une réponse, pour que tout le monde accède au fichier et puisse proposer ses solutions.

      Cordialement.
      0
    2. Je peux vous envoyer le code mais pas les fichiers puisqu'ils concernent de la masse salariale à grande échelle. Sera-t-il tout de même possible d'en faire quelque chose? Bien cordialement
      0
  3. Pouvez vous procéder comme l'a dit Chossette9 (voir ci-dessus).

    Pour les fichiers même principe en copiant une dizaine d'enregistrements dans de nouveaux fichiers.

    Ou si vous ne pouvez pas , donnez moi la structure des fichiers.

    Merci

    Didier
    0
    1. Modérateur
      Bonjour,
      Commencez déjà par envoyer tous les codes contenus dans le userForm ainsi que les éventuelles Sub qu'il est susceptible d'appeler... On verra déjà plus clair... peut être!
      0
      1. Private Sub Label1_Click()

        End Sub

        Private Sub ListBox1_Change()

        'Cellule liée à la sélection ds boîte de dialogue
        Range("$A$2").Value = ListBox1.Value

        End Sub

        Private Sub OK_Click()

        Unload Me

        Dim i As Integer, j As Integer

        i = [B65536].End(xlUp).Row
        j = [IV5].End(xlToLeft).Column

        'Filtre élaboré pour obtenir matricules selon centre de coût sélectionné
        Workbooks("Ctrl Gestion -SG- analyse par postes -0611.xls").Sheets("RUB2"). _
        Columns("A:S").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
        "A1:A2"), CopyToRange:=Range(Cells(12, 2), Cells(i, 2)), Unique:=False

        Range(Cells(12, 2), Cells(i, 2)).Select

        Rows("13:13").Select
        Selection.Insert Shift:=xlDown

        Range("B14:B1000").Select
        With Selection.Interior
        .ColorIndex = 2
        .Pattern = xlSolid
        End With

        'Entre les formules de la 1ère ligne qui sera ensuite recopiée
        Cells(14, 3).FormulaLocal = "=SI($B14<>"""";SI(C$12=""Eff"";SOMME.SI('[ETP 2011-06.xls]TB-EFFMO'!$A:$A;$B14;'[ETP 2011-06.xls]TB-EFFMO'!$Q:$Q);SI(C$12=""R ""&$P$1&"" "";SOMME($G14:$H14;$J14:$M14);RECHERCHEV($B14;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$A:$S;EQUIV(C$12;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$1:$1;0);""faux"")));"""")"
        Cells(14, 4).FormulaLocal = "=SI($B14<>"""";SI(D$12=""Eff"";SOMME.SI('[ETP 2011-06.xls]TB-EFFMO'!$A:$A;$B14;'[ETP 2011-06.xls]TB-EFFMO'!$Q:$Q);SI(D$12=""R ""&$P$1&"" "";SOMME($G14:$H14;$J14:$M14);RECHERCHEV($B14;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$A:$S;EQUIV(D$12;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$1:$1;0);""faux"")));"""")"
        Cells(14, 5).FormulaLocal = "=SI($B14<>"""";SI(E$12=""Eff"";SOMME.SI('[ETP 2011-06.xls]TB-EFFMO'!$A:$A;$B14;'[ETP 2011-06.xls]TB-EFFMO'!$Q:$Q);SI(E$12=""R ""&$P$1&"" "";SOMME($G14:$H14;$J14:$M14);RECHERCHEV($B14;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$A:$S;EQUIV(E$12;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$1:$1;0);""faux"")));"""")"
        Cells(14, 6).FormulaLocal = "=SI($B14<>"""";SI(F$12=""Eff"";SOMME.SI('[ETP 2011-06.xls]TB-EFFMO'!$A:$A;$B14;'[ETP 2011-06.xls]TB-EFFMO'!$Q:$Q);SI(F$12=""R ""&$P$1&"" "";SOMME($G14:$H14;$J14:$M14);RECHERCHEV($B14;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$A:$S;EQUIV(F$12;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$1:$1;0);""faux"")));"""")"
        Cells(14, 7).FormulaLocal = "=SI($B14<>"""";SI(G$12=""Eff"";SOMME.SI('[ETP 2011-06.xls]TB-EFFMO'!$A:$A;$B14;'[ETP 2011-06.xls]TB-EFFMO'!$Q:$Q);SI(G$12=""R ""&$P$1&"" "";SOMME($G14:$H14;$J14:$M14);RECHERCHEV($B14;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$A:$S;EQUIV(G$12;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$1:$1;0);""faux"")));"""")"
        Cells(14, 8).FormulaLocal = "=SI($B14<>"""";SI(H$12=""Eff"";SOMME.SI('[ETP 2011-06.xls]TB-EFFMO'!$A:$A;$B14;'[ETP 2011-06.xls]TB-EFFMO'!$Q:$Q);SI(H$12=""R ""&$P$1&"" "";SOMME($G14:$H14;$J14:$M14);RECHERCHEV($B14;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$A:$S;EQUIV(H$12;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$1:$1;0);""faux"")));"""")"
        Cells(14, 9).FormulaLocal = "=SI($B14<>"""";SI(I$12=""Eff"";SOMME.SI('[ETP 2011-06.xls]TB-EFFMO'!$A:$A;$B14;'[ETP 2011-06.xls]TB-EFFMO'!$Q:$Q);SI(I$12=""R ""&$P$1&"" "";SOMME($G14:$H14;$J14:$M14);RECHERCHEV($B14;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$A:$S;EQUIV(I$12;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$1:$1;0);""faux"")));"""")"
        Cells(14, 10).FormulaLocal = "=SI($B14<>"""";SI(J$12=""Eff"";SOMME.SI('[ETP 2011-06.xls]TB-EFFMO'!$A:$A;$B14;'[ETP 2011-06.xls]TB-EFFMO'!$Q:$Q);SI(J$12=""R ""&$P$1&"" "";SOMME($G14:$H14;$J14:$M14);RECHERCHEV($B14;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$A:$S;EQUIV(J$12;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$1:$1;0);""faux"")));"""")"
        Cells(14, 11).FormulaLocal = "=SI($B14<>"""";SI(K$12=""Eff"";SOMME.SI('[ETP 2011-06.xls]TB-EFFMO'!$A:$A;$B14;'[ETP 2011-06.xls]TB-EFFMO'!$Q:$Q);SI(K$12=""R ""&$P$1&"" "";SOMME($G14:$H14;$J14:$M14);RECHERCHEV($B14;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$A:$S;EQUIV(K$12;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$1:$1;0);""faux"")));"""")"
        Cells(14, 12).FormulaLocal = "=SI($B14<>"""";SI(L$12=""Eff"";SOMME.SI('[ETP 2011-06.xls]TB-EFFMO'!$A:$A;$B14;'[ETP 2011-06.xls]TB-EFFMO'!$Q:$Q);SI(L$12=""R ""&$P$1&"" "";SOMME($G14:$H14;$J14:$M14);RECHERCHEV($B14;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$A:$S;EQUIV(L$12;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$1:$1;0);""faux"")));"""")"
        Cells(14, 13).FormulaLocal = "=SI($B14<>"""";SI(M$12=""Eff"";SOMME.SI('[ETP 2011-06.xls]TB-EFFMO'!$A:$A;$B14;'[ETP 2011-06.xls]TB-EFFMO'!$Q:$Q);SI(M$12=""R ""&$P$1&"" "";SOMME($G14:$H14;$J14:$M14);RECHERCHEV($B14;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$A:$S;EQUIV(M$12;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$1:$1;0);""faux"")));"""")"
        Cells(14, 14).FormulaLocal = "=SI($B14<>"""";SI(N$12=""Eff"";SOMME.SI('[ETP 2011-06.xls]TB-EFFMO'!$A:$A;$B14;'[ETP 2011-06.xls]TB-EFFMO'!$Q:$Q);SI(N$12=""R ""&$P$1&"" "";SOMME($G14:$H14;$J14:$M14);RECHERCHEV($B14;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$A:$S;EQUIV(N$12;'[Ctrl Gestion -SG- analyse par postes -0611.xls]RUB2'!$1:$1;0);""faux"")));"""")"

        'Etire la ligne de formules définie plus haut

        Set SourceRange = Worksheets("Essai juin").Range("C14:N14")
        Set fillRange = Worksheets("Essai juin").Range(Cells(14, 3), Cells(i, 14))
        SourceRange.AutoFill Destination:=fillRange

        ' Selectionne la première cellule du tableau
        Range("B14").Select

        ' Boucle tant que pas vide
        Do While Not (IsEmpty(activecell))
        Nbligne = Nbligne + 1
        Selection.Offset(1, 0).Select
        Loop

        '1ere ligne total
        activecell.Offset(1, 3).Select
        Selection = "Total CDI 2011"

        activecell.Offset(0, 1).Select
        Selection.Value = Application.SumIf(Range("(E14)").EntireColumn, "CDI", Range("(F14)").EntireColumn)

        activecell.Offset(0, 1).Select
        Selection.Value = Application.SumIf(Range("(E14)").EntireColumn, "CDI", Range("(G14)").EntireColumn)

        activecell.Offset(0, 1).Select
        Selection.Value = Application.SumIf(Range("(E14)").EntireColumn, "CDI", Range("(H14)").EntireColumn)

        activecell.Offset(0, 1).Select
        Selection.Value = (activecell.Offset(0, -1)) / (activecell.Offset(0, -2))

        activecell.Offset(0, 1).Select
        Selection.Value = Application.SumIf(Range("(E14)").EntireColumn, "CDI", Range("(J14)").EntireColumn)

        activecell.Offset(0, 1).Select
        Selection.Value = Application.SumIf(Range("(E14)").EntireColumn, "CDI", Range("(K14)").EntireColumn)

        activecell.Offset(0, 1).Select
        Selection.Value = Application.SumIf(Range("(E14)").EntireColumn, "CDI", Range("(L14)").EntireColumn)

        activecell.Offset(0, 1).Select
        Selection.Value = Application.SumIf(Range("(E14)").EntireColumn, "CDI", Range("(M14)").EntireColumn)

        activecell.Offset(0, 1).Select
        Selection.Value = Application.SumIf(Range("(E14)").EntireColumn, "CDI", Range("(N14)").EntireColumn)

        '2eme ligne total
        activecell.Offset(1, -9).Select
        Selection = "Total CDD 2011"

        activecell.Offset(0, 1).Select
        Selection.Value = Application.SumIf(Range("(E14)").EntireColumn, "CDD", Range("(F14)").EntireColumn)

        activecell.Offset(0, 1).Select
        Selection.Value = Application.SumIf(Range("(E14)").EntireColumn, "CDD", Range("(G14)").EntireColumn)

        activecell.Offset(0, 1).Select
        Selection.Value = Application.SumIf(Range("(E14)").EntireColumn, "CDD", Range("(H14)").EntireColumn)

        activecell.Offset(0, 1).Select
        Selection.NumberFormat = "0.0%"
        If (activecell.Offset(0, -1)) = "" Then activecell = "0" Else activecell.Formula = (activecell.Offset(0, -1)) / (activecell.Offset(0, -2))

        activecell.Offset(0, 1).Select
        Selection.Value = Application.SumIf(Range("(E14)").EntireColumn, "CDD", Range("(J14)").EntireColumn)

        activecell.Offset(0, 1).Select
        Selection.Value = Application.SumIf(Range("(E14)").EntireColumn, "CDD", Range("(K14)").EntireColumn)

        activecell.Offset(0, 1).Select
        Selection.Value = Application.SumIf(Range("(E14)").EntireColumn, "CDD", Range("(L14)").EntireColumn)

        activecell.Offset(0, 1).Select
        Selection.Value = Application.SumIf(Range("(E14)").EntireColumn, "CDD", Range("(M14)").EntireColumn)

        activecell.Offset(0, 1).Select
        Selection.Value = Application.SumIf(Range("(E14)").EntireColumn, "CDD", Range("(N14)").EntireColumn)

        '3eme ligne
        activecell.Offset(1, -9).Select
        Selection = "Total INT 2011"

        activecell.Offset(0, 1).Select
        If Q5 = "" Then activecell = "0" Else activecell.Formula = activecell.Offset(0, 8) / Q5

        '4eme ligne
        activecell.Offset(1, -1).Select
        Selection = "Total MO 2011"

        activecell.Offset(0, 1).Select
        If Q6 = "" Then activecell = "0" Else activecell.Formula = activecell.Offset(0, 8) / Q6

        'Prov
        activecell.Offset(1, 6).Select
        Selection = "+ Prov manuelles SAP"

        'Total gal
        activecell.Offset(2, -7).Select
        Selection = "R 2011 SAP"

        activecell.Offset(0, 1).Select
        Selection.Value = Application.Sum(Range(activecell.Offset(-6, 0), activecell.Offset(-3, 0)))

        activecell.Offset(0, 1).Select
        Selection.Value = Application.Sum(Range(activecell.Offset(-6, 0), activecell.Offset(-3, 0)))

        activecell.Offset(0, 1).Select
        Selection.Value = Application.Sum(Range(activecell.Offset(-6, 0), activecell.Offset(-3, 0)))

        activecell.Offset(0, 1).Select
        Selection.NumberFormat = "0.0%"
        activecell.Formula = (activecell.Offset(0, -1)) / (activecell.Offset(0, -2))

        activecell.Offset(0, 1).Select
        Selection.Value = Application.Sum(Range(activecell.Offset(-6, 0), activecell.Offset(-3, 0)))

        activecell.Offset(0, 1).Select
        Selection.Value = Application.Sum(Range(activecell.Offset(-6, 0), activecell.Offset(-3, 0)))

        activecell.Offset(0, 1).Select
        Selection.Value = Application.Sum(Range(activecell.Offset(-6, 0), activecell.Offset(-3, 0)))

        activecell.Offset(0, 1).Select
        Selection.Value = Application.Sum(Range(activecell.Offset(-6, 0), activecell.Offset(-3, 0)))

        activecell.Offset(0, 1).Select
        Selection.Value = Application.Sum(Range(activecell.Offset(-6, 0), activecell.Offset(-3, 0)))

        End Sub

        Private Sub UserForm_Initialize()

        ListBox1.ColumnCount = 1

        'Load data into ListBox

        ListBox1.List() = Array("184000", "185900", "183200", "185100", "181900", "184300", "183800", "183400", "185400", "184200", "183900")

        End Sub

        Sub gocombobox()

        frmcomb.Show

        End Sub
        0
        1. Voila le code. Il peut paraître très long mais en fait pas du tout.

          Je pense que les commentaires insérés avant les opérations pourront vous aider à comprendre mon cheminement. Sinon, je reste bien évidemment à votre disposition pour répondre à d'éventuelles questions.

          En gros, pour que la macro s'exécute, je vais chercher les données dans 2 fichiers Excel différents. J'ai d'abord nommé de façon automatique ma ligne d'en-têtes: Matricule, Nom, Prénom, CS,.. Prov.

          Ensuite, via un filtre élaboré, je suis allée chercher la liste des matricules en fonction du centre de coût sélectionné. Pour remplir toutes les colonnes qui suivent, j'ai utilisé la fonction Recherchev que j'automatise grâce à la macro.

          Une fois l'ensemble des données récupérées dans le fichier, j'ai créé une ligne de sous-totaux (CDI, CDD, Interim, MO) puis Total.

          C'est à la suite de ces opérations que j'aimerais pouvoir insérer une macro permettant d'effacer TOUUUUTES ces données si la sélection venait à changer.

          Merci d'avance pour le temps que vous consacrerez à mon problème.
          0
          1. Modérateur
            Alors si j'ai bien compris, et c'est loin d'être acquis...
            Private Sub ListBox1_Change() 
            'Cellule liée à la sélection ds boîte de dialogue 
            Range("$A$2").Value = ListBox1.Value 
            End Sub 

            Te permet de choisir la valeur du filtre.
            C'est dans cette liste que tu veux, en cas de nouvelle sélection, effacer les données contenues dans ta feuille.
            Question 1 : Nom de la feuille dont tu souhaites supprimer les données?
            Ensuite, ta macro : Private Sub OK_Click() te permet de, systématiquement et complètement, remplir ta feuille (celle dont je t'ai demandé le nom?) avec formules etc...
            Question 2 : Dans cette feuille, tu n'as pas d'autres données à conserver, tu veux bien tout effacer?
            Si oui, il suffit, dans ta procédure Private Sub ListBox1_Change() d'ajouter :

            Private Sub ListBox1_Change() 
            Sheets(NomDeLaFeuilleDontOnVeuxEffacerLesDonnées).Cells.Clear
            'Cellule liée à la sélection ds boîte de dialogue 
            Range("$A$2").Value = ListBox1.Value 
            End Sub 

            !!!!!!!!! Teste cette procédure sur une copie de ton classeur!!!!!!!!! Je ne suis pas responsable de l'effacement de toutes tes données!!!!!!!!!!!!!!
            0
        2. Question 1: Je n'ai pas du si mal expliquer car c'est exactement ca!
          Question 2: Je souhaiterais juste garder les 12 premières lignes de la feuille qui n'ont rien à voir avec la macro car je les copie-colle pour l'instant d'un classeur à un autre.

          En attendant, je vais m'empresser d'essayer cette macro !!!

          Et surtout.. MERCI!!!
          0
          1. Modérateur
            Ben non n'essaye pas!!! la macro supprime toutes les cellules de la feuille concernée:!!!!
            Essaye plutôt celle ci :
            Private Sub ListBox1_Change() 
            Dim DerLig As Long 
            With Sheets(NomDeLaFeuilleDontOnVeuxEffacerLesDonnées) 
                DerLig = .Range("A" & .Rows.Count).End(xlUp).Row 'remplace le "A" par la lettre de ta plus longue colonne 
                .Range("A13:H" & DerLig).Clear 'ici H représente ta dernière colonne remplie
            End With 
            'Cellule liée à la sélection ds boîte de dialogue  
            Range("$A$2").Value = ListBox1.Value  
            End Sub
            0
        3. SUPER!!!!

          Déjà, ca efface!!!

          A présent, j'aimerais juste pouvoir épargner les 12 premières lignes de la feuille si possible :)
          0
          1. Aie.. Ca ne fonctionne pas finalement. J'ai l'impression que la macro ne réitère pas les formules pour le centre de coûts sélectionné suivant.

            J'ai essayé de bidouiller mais rien n'y fait.
            0
            1. Après plusieurs essais, je pense que si j'arrivais "simplement" à supprimer les lignes correspondant au code de mes sous-totaux (c'est-à-dire à partir du commentaire '1ere ligne total jusqu'à 'Total gal, ceci résoudrait mon problème et me permettrait d'exécuter correctement la macro que pikaju m'a donné plus haut.
              0