Macro (Do While)

Résolu
Bonjour,

Voici mon fichier :
https://www.cjoint.com/?BCpppNzdPyB

Et dans le 2eme onglet ce à quoi je souhaite arriver, sachant que j'ai environ 20 matricule à traiter,

Je pense passer par un Do While mais je ne vois pas comment faire, sachant qu'il faut le faire pour les matricules mais aussi pour les dates.

J'espère avoir été claire, je reste à disposition,

Cordialement



--
"La vie c'est comme une boite de chocolat, on ne sait jamais sur quoi on va tomber"

5 réponses

  • Votes
  • Date
  • Date décroissante
Résumé de la discussion

Le sujet porte sur l'automatisation d'un traitement par macro VBA pour 20 matricules et des dates, avec l'idée d'utiliser une boucle Do While afin d'appliquer le calcul et l'enregistrement pour chaque salarié. Des solutions proposées visent surtout à modifier la macro afin de traiter chaque salarié et chaque date et de recopier les résultats sur Feuil1 et Feuil2. Cela inclut la suppression d'un test de calcul, la gestion fiable des colonnes et des périodes, et l'adaptation du code pour une boucle Do While qui respecte les 20 matricules. La discussion évoque aussi des options alternatives, comme une formule post-macros pour calculer le résultat, et précise que le choix de la référence temporelle (mois) doit rester clair.

Bobot (l’IA à votre service)
  1. Bonjour,
    Je pense que oui, mais je n'ai pas trouvé ce que vous voulez réaliser !
    1. Bonjour,

      Sub copie_donnees_F2()
      Dim a(), b(), c(), d(), e()
      Dim F1 As Worksheet, F2 As Worksheet
      Dim D_J_MF1 As Integer, First_Col_PersXF1 As Integer, P_L_LAF2 As Integer, P_L_LABF2 As Integer
      Dim Lig_BF1 As Range, Nbr_Personne As Integer, D_C_LBF1 As Integer
      Dim Periode, Cel_Fin As Integer, Matricule

      Set F1 = Worksheets("Feuil1")
      Set F2 = Worksheets("Feuil2")

      F1.Activate
      'pour la dernière colonne de la ligne 2
      D_C_LBF1 = F1.Cells(2, Columns.Count).End(xlToLeft).Column
      'Definition Plage de cellule pour Nombre de personnes
      Set Lig_BF1 = F1.Range(Cells(2, 2), Cells(2, D_C_LBF1))
      'Recherche du Nombre de personne
      Nbr_Personne = Application.CountIf(Lig_BF1, "*Heures Vendues*")
      'pour dernier jour du mois colonne A
      D_J_MF1 = F1.Range("A" & Rows.Count).End(xlUp).Row - 2
      'Periode
      Periode = Int(Format(F1.Range("A3"), "MM"))

      ReDim a(D_J_MF1), b(D_J_MF1), c(D_J_MF1), d(D_J_MF1)

      For iter = 0 To Nbr_Personne - 1
      Application.ScreenUpdating = False
      Application.DisplayAlerts = False
      'Colonne de depart pour chaque personne
      First_Col_PersXF1 = 2 + (9 * iter)
      'Premiere ligne libre F2
      P_L_LAF2 = F2.Range("A" & Rows.Count).End(xlUp).Row + 1

      'Cellule Fin Plage
      If iter > 0 Then
      Cel_Fin = P_L_LAF2 + D_J_MF1 + 1 - 4
      Else
      Cel_Fin = D_J_MF1 + 1
      End If

      'Copies
      F1.Activate
      'Matricule
      Matricule = Mid((F1.Cells(1, First_Col_PersXF1)), InStr(1, F1.Cells(1, First_Col_PersXF1), "matricule", vbTextCompare) + 9)
      'Date colonne fixe
      b = Application.Transpose(F1.Range("A3:A" & D_J_MF1))
      'Heures Vendues
      c = Application.Transpose(F1.Range(Cells(3, First_Col_PersXF1), Cells(D_J_MF1, First_Col_PersXF1)))
      'Heures TNF
      d = Application.Transpose(F1.Range(Cells(3, First_Col_PersXF1 + 1), Cells(D_J_MF1, First_Col_PersXF1 + 1)))
      'Heures TT
      e = Application.Transpose(F1.Range(Cells(3, First_Col_PersXF1 + 6), Cells(D_J_MF1, First_Col_PersXF1 + 6)))

      'Recopies
      F2.Activate
      'Matricule
      F2.Range(Cells(P_L_LAF2, 1), Cells(Cel_Fin, 1)) = Application.Transpose(Matricule)
      'Date colonne fixe
      F2.Range(Cells(P_L_LAF2, 2), Cells(Cel_Fin, 2)) = Application.Transpose(b)
      'Periode ?? j'ai pris le mois
      F2.Range(Cells(P_L_LAF2, 3), Cells(Cel_Fin, 3)) = Application.Transpose(Periode)
      'Heures Vendues
      F2.Range(Cells(P_L_LAF2, 4), Cells(Cel_Fin, 4)) = Application.Transpose(c)
      'Heures TF
      F2.Range(Cells(P_L_LAF2, 5), Cells(Cel_Fin, 5)) = Application.Transpose(c)
      'Heures TNF
      F2.Range(Cells(P_L_LAF2, 6), Cells(Cel_Fin, 6)) = Application.Transpose(d)
      'Heures TT
      F2.Range(Cells(P_L_LAF2, 7), Cells(Cel_Fin, 7)) = Application.Transpose(e)
      Next iter

      Application.DisplayAlerts = True
      Application.ScreenUpdating = False
      End Sub

      Je pense que cela correspond a ce que vous vouliez. Par contre Periode??, j'ai pris le mois.....
      1. Merci :) ça à l'air d'être pas mal :)

        oui oui période c'est le mois :)

        Par contre une chose, c'est possible de changer le nom de Feuil1 et Feuil2 ?
        De mettre pour Feuil1, "feuille active"
        Et pour feuil2, je vais renommé en DATA
      2. Re,
        Pour F2 ok pour DATA
        Pour F1, il faudra passer par le nom de la feuille active. Je suppose que vous avez une feuille par mois.

        Bon courage
      3. Oui une feuille par mois mais c'est pas possible de lui dire "Feuille active" plutôt que de mettre un nom ?
      4. Re,
        Je regarde la faisabilite.

        A+
    2. Bonjour,
      Je vois que vous avez la solution.
      A une prochaine.
      1. Oui ça devrait le faire,

        Merci de vous y être interessé
    3. Re,

      Nom_feuille = ActiveSheet.Name
      Set F1 = Worksheets(Nom_feuille)

      Vous clicquez sur la feuille que vous voulez traiter ensuite vous lancez la macro.
      Maintenant il, y a peut-etre mieux a faire?
      1. Merci de ton aide,

        Je reviens vers toi j'ai aperçu un "petit" problème,
        Quand le salarié est en CP, quand je lance la macro ça me sort en heure travaillé total ... y'a t-il une solution ? Tu vois ce que je veux dire ?

        Merci d'avance !
      2. Bonjour,

        Sur la feuille "Feuil1" colonne H (TOTAL Jour) il y a---->=SOMME(B3+C3+D3) et D3="HEURES Abs CP,MA,AT". C'est pas moi!
      3. Oui je sais que c'est pas toi ... mais le fichier ne provient pas de moi non plus (là n'est pas la question) mais comme c'est en colonne et pas en ligne, je peux pas modifier pour chaque salarié ... est-il possible de changer la macro ?
      4. Si tu peux pas c'est pas grave, je peux faire une formule après la macro pour trouver le résultat ...
        dit moi juste si tu as le temps ou pas ;)

        Merci en tout cas ;)
    4. Re,
      Qu'est ce qu'il se passe pour:
      F2.Cells(x, 7) = F2.Cells(x, 7) - a(x - P_L_LAF2)

      Parce que chez moi, tout ce passe normalement
      1. ça se surligne en jaune et apres quand je vais sur la feuil2 j'ai le premier matricule qui sort sur 30 lignes et les 2 dernieres sont rempli de #N/A
      2. Le problème a été résolu avec le dernier code ... je vais tester l'empilage et jte dit :) merci beaucoup en tout cas
      3. Pour l'empilage c'est nickel :)

        Jte remercie !! =)
      4. Re,
        Oui, parce Cel_Fin n'etait calcule pour plusieurs tours de macro.

        s = Int(F1.Cells(5, 4).Value)

        Il faut enlever cette ligne, elle me servait de test
      5. Vu que la ça fonctionne y'a pas besoin de l'enlever si ?