Supprimer résultats d'un Userform

Mag55 -  
 Mag55 -
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. marion8316 Messages postés 75 Statut Membre
     
    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. chossette9 Messages postés 6855 Date d'inscription   Statut Contributeur Dernière intervention   1 313
       
      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. Mag55
       
      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. marion8316 Messages postés 75 Statut Membre
     
    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. chossette9 Messages postés 6855 Date d'inscription   Statut Contributeur Dernière intervention   1 313
       
      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. Mag55
       
      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. marion8316 Messages postés 75 Statut Membre
     
    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
  4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Mag55
     
    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
  7. Mag55
     
    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. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
  8. Mag55
     
    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. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
  9. Mag55
     
    SUPER!!!!

    Déjà, ca efface!!!

    A présent, j'aimerais juste pouvoir épargner les 12 premières lignes de la feuille si possible :)
    0
  10. Mag55
     
    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
  11. Mag55
     
    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