IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Excel Discussion :

VBA boucle DO WHILE ou DO UNTIL [XL-2010]


Sujet :

Excel

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Responsable paie
    Inscrit en
    Juillet 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Responsable paie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 8
    Points : 5
    Points
    5
    Par défaut VBA boucle DO WHILE ou DO UNTIL
    Bonjour,

    C'est déjà à nouveau moi, j'ai l'impression que je suis en train d'atteindre mes limites. Je déteste gérer des dates et des heures sur Excel mon truc c’est plutôt les chiffres.
    J'ai un tableau avec des données alimentées par VBA depuis un fichier texte pour gérer des pointages avec des totaux hebdomadaires et mensuels.

    Le premier salarié démarre après les lignes de titre par un lundi soit valeur 1 et ainsi de suite jusqu'à 7 pour dimanche.
    A chaque fin de semaine dans la colonne E j'ai TOTAL SEMAINE et en fin de mois mon dernier TOTAL SEMAINE est suivi d'un TOTAL MOIS et ensuite c'est un nouveau salarié qui repars avec 1 comme 1er jour de sa première semaine.

    Mat Colonne E "Jour semaine 1 = lundi"
    SOULA00 1
    SOULA00 1
    SOULA00 2
    SOULA00 3
    SOULA00 3
    SOULA00 4
    SOULA00 4
    SOULA00 5
    SOULA00 6
    SOULA00 7
    SOULA00 TOTAL SEMAINE
    SOULA00 1
    SOULA00 1
    SOULA00 2
    SOULA00 3
    SOULA00 4
    SOULA00 5
    SOULA00 5
    SOULA00 6
    SOULA00 6
    SOULA00 6
    SOULA00 7
    SOULA00 7
    SOULA00 TOTAL SEMAINE
    SOULA00 1
    SOULA00 2

    J'ai un code qui me permet de faire des totaux hebdomadaire par le biais d'une somme pour laquelle j'ai récupéré l'adresse des cellules à sommer en partant du principe que chaque semaine commence à 1 avec la première ligne 1 vide et la seconde alimentée.
    Mon code fonctionnait très bien. Mais j'ai des salariés qui ont plus de 2 lignes de pointages par jour donc plus de 2 fois la ligne 1 donc mon code ne fonctionne plus puisque je m'arrête à la première ligne 1 trouvée alors qu'il faudrait que j'atteigne le 1er 1 pour chaque semaine et non le dernier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Range("D2").End(xlDown).Offset(1, 0).Select
    DerLigne = ActiveCell.Row
    Set MaPlage = ActiveSheet.Range("D2:D" & DerLigne)
    Dim NumLigne As Integer
    Dim NumLigne2 As Integer
    Dim NumLigne3 As Integer
     
    Range("E2").Select
    For Each cell In MaPlage
    If ActiveCell.Value = "TOTAL SEMAINE" Then
    NumLigne = ActiveCell.Row
    ActiveCell.Offset(-1, 0).Select
    NumLigne2 = ActiveCell.Row
    Range("E" & NumLigne).Select
    Do While ActiveCell.Value <> 1
    ActiveCell.Offset(-1, 0).Select
    NumLigne3 = ActiveCell.Offset(1, 0).Row
    Loop
     
    'Applique les formules dans les lignes totaux par semaine de F à K et de N à U
    Range("F" & NumLigne).Select
    ActiveCell.Formula = "=SUM(" & Cells(NumLigne2, 6).Address & ":" _
    & Cells(NumLigne3, 6).Address & ")"
    J'ai essayé tout ce qui était à ma portée mais rien à faire je ne sais pas comment faire pour remonter jusqu'à la ligne contenant le premier 1 pour chaque salarié.
    J'ai essayé avec un LIKE pour identifier les lignes contenant TOTAL ce qui serait un bon moyen d'identifier mes fins de semaines et de mois mais ça ne fonctionne pas. J'avais insérer une ligne avant le 1er salarié avec la donnée TOTAL pour que ça fonctionne pour lui aussi mais rien n'y fait, je cale complètement je crois que n'arrive pas à faire fonctionner NOT LIKE avec DO WHILE alors que je l'ai déjà utilisé avec des SI. Excel remonte jusqu'à la première ligne de la feuille il ne trouve jamais la valeur TOTAL. J'ai aussi essayé avec DO UNTIL pour ne pas utiliser NOT LIKE mais rien non plus. Soit je boucle soit je buggue soit il ne se passe rien.
    Je ne vois vraiment pas comment il faut raisonner et je ne pense pas être capable de trouver le code qui pourrait faire l’affaire.
    Quelqu'un aurait-il une idée pas trop compliquée à la hauteur de mes petites capacités pour résoudre mon problème ?

    Tant que j'y suis, sans vouloir abuser, ma formule SOMME est bien évidemment en références absolues, existe-t'il un équivalent pas trop compliqué pour avoir les références de cellules en références relatives ? Je pense que non mais peut-être que je suis dans l'erreur.
    J’espère que mes explications sont assez claires.
    D'avance merci à tous ceux qui me liront et double merci à celui qui m'aidera à trouver une solution.

    Nadine

  2. #2
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2009
    Messages
    1 794
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 85
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 1 794
    Points : 3 094
    Points
    3 094
    Par défaut
    Bonjour,
    Pourquoi utiliser le n° de jour plutôt que le n° de semaine puisque c'est pour faire un total hebdomadaire ?
    Pour le total mensuel utilisez le n° du mois.
    Il me semble que ce serait plus simple.
    Et pourquoi passer par VBA alors que les fonctions SOMMEPROD ou SOMME.SI pourrait très bien faire ces calculs ?
    Cordialement.

    RJ

  3. #3
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Juste un petit détail concernant ton code : tu pourrais le simplifier, l'accélérer et le rendre plus agréable à l'exécution en utilisant moins de Select.
    Quand on utilise l'enregistreur de macro, les Select sont omniprésents mais dans du code classique, ils sont rarement utiles.

    Par exemple, pour tes premières lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("D2").End(xlDown).Offset(1, 0).Select
    DerLigne = ActiveCell.Row
    Pourrait être avantageusement remplacé simplement par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DerLigne = Range("D2").End(xlDown).Offset(1, 0).Row
    Citation Envoyé par rjamin Voir le message
    Et pourquoi passer par VBA alors que les fonctions SOMMEPROD ou SOMME.SI pourrait très bien faire ces calculs ?
    Je pense même que, encore plus simplement, il doit être possible de résoudre ce problème avec des SI(....;SOMME();"")

    Ce que je ne comprends pas dans ton énoncé, c'est où se trouve la valeur que tu sommes ? Dans ton code, ça semble être la colonne 6 mais comme tu mets également la formule dans la colonne 6, j'ai un doute.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Responsable paie
    Inscrit en
    Juillet 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Responsable paie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Re boucle VBA
    Bonjour à vous et merci pour vos réponses,

    Pour la simplification du code je sais, je ne suis pas une pro mais j'arrive quand même à faire des applis sympas qui me facilitent grandement la vie. Je fais avec ce que j'arrive à faire fonctionner tant bien que mal et ça me rend bien service malgré le temps que ça me prends. Pour l’accélération j'ai gagné plus d'une semaine de travail alors laisser tourner l'application pendant 5 minutes c'est toujours mieux que ce qui se faisait avant quand ils faisaient des copier/coller depuis le fichier texte pour récupérer et exploiter les fichiers de la badgeuse.

    Si tu voyais l'ensemble de mon code ça te ferai peur tellement je me complique la vie faute de connaissance en développement. J'ai appris toute seule comme j'ai pu. Je cherche en fonction de mes besoins ce qu'il me faut et quand je trouve enfin quelque chose qui fonctionne je garde sans chercher s'il y a mieux sinon je ne dors plus, je ne mange plus bref je ne vis plus.

    Pour ce qui est de définir ma plage et mes NumLigne sans faire de select effectivement je vais gagner en lisibilité et en mouvement d'écran mais quand j'aurai figer l'écran ça ne me posera plus de problème mais j'adopte.

    Pour ce qui est des SI ou SOMMEPROD je ne crois pas que ce soit possible car j'ai 4 fichiers de plus de 3000 lignes à traiter pour plusieurs dizaine de salariés sur la même feuille. C'est la macro qui alimente toutes les données depuis un fichier texte et qui écrit toutes les formules. Je ne sais pas comment je pourrai faire sans boucle pour lui dire ce qu'il faut additionner et à quel endroit faire les ruptures alors une somme fait aussi bien l'affaire tout est dans la boucle à mon avis. Et puis mon appli sera terminée une fois que j'aurai résolu mon problème de totaux alors le code va rester comme il est et je vais enfin pouvoir profiter de nouveau de mes soirées et de mes week-end et mes pointages vont se faire quasiment tout seul.
    J'ai déjà utilisé SOMMEPROD dans une application parce que je n'avais pas d'autre choix mais qu'est ce que ça ralenti le traitement.
    Mon plus gros fichier contient 55 salariés * 4 semaines + 1 total par mois ça fait 275 opérations je ne pense pas que SOMMEPROD soit très judicieux dans mon cas.

    Désolée pour l'énoncé. En fait dans la colonne 6 j'ai le nombre d'heures effectué par jour et à chaque rupture de semaine je fais les totaux des lignes qui se trouvent au-dessus pour la semaine en cours. Dans les colonnes suivantes je calcule des heures de nuit, des heures sup, des paniers, des dimanches, des fériés, bref tout ce dont j'ai besoin pour faire les paies et je fais les totaux pour chaque semaine idem pour les mois. Tous les salariés sont à la suite d'où l'utilisation des boucles pour identifier les salariés, les semaines et la fin du mois.

    Par contre oui pour le numéro de semaine ça ne m'avait même pas effleuré l'esprit, ça va être bien plus simple il suffit de boucler sur ce numéro.

    J'essaie ça tout de suite et je vous dit si ça fonctionne.

    Encore merci

    Nadine




    Citation Envoyé par Menhir Voir le message
    Juste un petit détail concernant ton code : tu pourrais le simplifier, l'accélérer et le rendre plus agréable à l'exécution en utilisant moins de Select.
    Quand on utilise l'enregistreur de macro, les Select sont omniprésents mais dans du code classique, ils sont rarement utiles.

    Par exemple, pour tes premières lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("D2").End(xlDown).Offset(1, 0).Select
    DerLigne = ActiveCell.Row
    Pourrait être avantageusement remplacé simplement par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DerLigne = Range("D2").End(xlDown).Offset(1, 0).Row

    Je pense même que, encore plus simplement, il doit être possible de résoudre ce problème avec des SI(....;SOMME();"")

    Ce que je ne comprends pas dans ton énoncé, c'est où se trouve la valeur que tu sommes ? Dans ton code, ça semble être la colonne 6 mais comme tu mets également la formule dans la colonne 6, j'ai un doute.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Même si tu en viens au n° de semaine cela peux te servir maintenant ou à l'avenir.
    Effectivement il m'a d'abord fallu recréer un exemple de données qui puisse ressembler aux tiennes.
    Relis bien dans le détail, il y a plusieurs modifications par rapport à ton code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Sub CalculSemaine()    
        DerLigne = Range("D2").End(xlDown).Offset(1, 0).Row
        Set MaPlage = ActiveSheet.Range("D2:D" & DerLigne)
        Dim NumLigne As Integer
        Dim NumLigne2 As Integer
        Dim NumLigne3 As Integer
     
        Range("E2").Select
        For Each cell In MaPlage
            cell.Select
            If ActiveCell.Value = "TOTAL SEMAINE" Then
               NumLigne = ActiveCell.Row
     
               NumLigne3 = NumLigne - 1
               Range("E" & NumLigne).Select
               Do
                   ActiveCell.Offset(-1, 0).Select
                   NumLigne2 = ActiveCell.Row
               Loop Until ActiveCell.Value = 1 And ActiveCell.Offset(-1, 0) <> 1
     
               'Applique les formules dans les lignes totaux par semaine de F à K et de N à U
               Range("F" & NumLigne).Select
               ActiveCell.Formula = "=SUM(" & Cells(NumLigne2, 6).Address & ":" _
               & Cells(NumLigne3, 6).Address & ")"
            End If
        Next
    End Sub

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Responsable paie
    Inscrit en
    Juillet 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Responsable paie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci Jean-claude mais j'ai tout cassé en voulant remettre un peu d'ordre dans mon codage, plus rien ne fonctionne et je n'arrive pas à trouver pourquoi. Mon code est tellement vilain que ce n'est pas simple pour chercher l'erreur je crois que j'y suis pour la nuit car j'en ai besoin pour demain. C'est l'inconvénient à coder comme un cochon.

    Je retiens quand même ton code et quand j'aurai remis mon appli en état de fonctionnement je reprendrai l'étape des formules.

    Nadine

    Citation Envoyé par jcDSoft Voir le message
    Bonsoir,

    Même si tu en viens au n° de semaine cela peux te servir maintenant ou à l'avenir.
    Effectivement il m'a d'abord fallu recréer un exemple de données qui puisse ressembler aux tiennes.
    Relis bien dans le détail, il y a plusieurs modifications par rapport à ton code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Sub CalculSemaine()    
        DerLigne = Range("D2").End(xlDown).Offset(1, 0).Row
        Set MaPlage = ActiveSheet.Range("D2:D" & DerLigne)
        Dim NumLigne As Integer
        Dim NumLigne2 As Integer
        Dim NumLigne3 As Integer
     
        Range("E2").Select
        For Each cell In MaPlage
            cell.Select
            If ActiveCell.Value = "TOTAL SEMAINE" Then
               NumLigne = ActiveCell.Row
     
               NumLigne3 = NumLigne - 1
               Range("E" & NumLigne).Select
               Do
                   ActiveCell.Offset(-1, 0).Select
                   NumLigne2 = ActiveCell.Row
               Loop Until ActiveCell.Value = 1 And ActiveCell.Offset(-1, 0) <> 1
     
               'Applique les formules dans les lignes totaux par semaine de F à K et de N à U
               Range("F" & NumLigne).Select
               ActiveCell.Formula = "=SUM(" & Cells(NumLigne2, 6).Address & ":" _
               & Cells(NumLigne3, 6).Address & ")"
            End If
        Next
    End Sub

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Responsable paie
    Inscrit en
    Juillet 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Responsable paie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Bonsoir,

    Voilà j'ai tout remis en état et en utilisant le numéro de semaine calculé dans une cellule c'est un jeu d'enfant.
    Mon bout de code, toujours aussi vilain et qui va le rester vue la mésaventure qui viens de m'arriver fonctionne à merveille. Je peux relancer mes calculs autant de fois que je le souhaite si je supprime ou si j'insère des lignes donc les valeurs absolues ne me gènent absolument pas.
    Mais, par curiosité, si quelqu'un connait une méthode pour utiliser la fonction somme en fonction de l'adresse comme dans la formule de mon premier post mais en valeur relative je suis preneuse.

    Je ne sais pas si je suis bien claire mais il est tard, je fatigue.
    Je vais oublié VBA et reprendre une vie normale pendant quelques temps car je viens d'en faire une overdose.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Range("D2").End(xlDown).Offset(1, 0).Select
    DerLigne = ActiveCell.Row
    Set MaPlage = ActiveSheet.Range("D2:D" & DerLigne)
    Dim NumLigne As Integer
    Dim NumLigne2 As Integer
    Dim NumLigne3 As Integer
    Dim NumSemaine As String
     
    Range("E2").Select
    For Each cell In MaPlage
    If ActiveCell.Value = "TOTAL SEMAINE" Then
    NumLigne = ActiveCell.Row
    ActiveCell.Offset(-1, 0).Select
    NumSemaine = ActiveCell.Offset(0, 17).Value
    NumLigne2 = ActiveCell.Row
    Range("E" & NumLigne2).Select
    Do While ActiveCell.Offset(0, 17).Value = NumSemaine
    ActiveCell.Offset(-1, 0).Select
    NumLigne3 = ActiveCell.Offset(1, 0).Row
    Loop
    Merci pour votre attention et le temps que vous m'avez consacré.
    Nadine
    PS Jean-Claude comment fais-tu pour numéroter les lignes ?



    Citation Envoyé par jcDSoft Voir le message
    Bonsoir,

    Même si tu en viens au n° de semaine cela peux te servir maintenant ou à l'avenir.
    Effectivement il m'a d'abord fallu recréer un exemple de données qui puisse ressembler aux tiennes.
    Relis bien dans le détail, il y a plusieurs modifications par rapport à ton code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Sub CalculSemaine()    
        DerLigne = Range("D2").End(xlDown).Offset(1, 0).Row
        Set MaPlage = ActiveSheet.Range("D2:D" & DerLigne)
        Dim NumLigne As Integer
        Dim NumLigne2 As Integer
        Dim NumLigne3 As Integer
     
        Range("E2").Select
        For Each cell In MaPlage
            cell.Select
            If ActiveCell.Value = "TOTAL SEMAINE" Then
               NumLigne = ActiveCell.Row
     
               NumLigne3 = NumLigne - 1
               Range("E" & NumLigne).Select
               Do
                   ActiveCell.Offset(-1, 0).Select
                   NumLigne2 = ActiveCell.Row
               Loop Until ActiveCell.Value = 1 And ActiveCell.Offset(-1, 0) <> 1
     
               'Applique les formules dans les lignes totaux par semaine de F à K et de N à U
               Range("F" & NumLigne).Select
               ActiveCell.Formula = "=SUM(" & Cells(NumLigne2, 6).Address & ":" _
               & Cells(NumLigne3, 6).Address & ")"
            End If
        Next
    End Sub

  8. #8
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Nadine Soulage Voir le message
    Pour la simplification du code je sais, je ne suis pas une pro mais j'arrive quand même à faire des applis sympas qui me facilitent grandement la vie.
    Ce n'était pas une critique mais juste un conseil d'amélioration.

    Je ne sais pas comment je pourrai faire sans boucle pour lui dire ce qu'il faut additionner et à quel endroit faire les ruptures alors une somme fait aussi bien l'affaire tout est dans la boucle à mon avis.

    [...]

    Désolée pour l'énoncé. En fait dans la colonne 6 j'ai le nombre d'heures effectué par jour et à chaque rupture de semaine je fais les totaux des lignes qui se trouvent au-dessus pour la semaine en cours.
    Comme tu parles de colonne 6 et non de colonne F, je vais supposé que tu es en référence L1C1 et non A1. Les formules ci-dessous seront donc avec ce type de référence.

    Je vais supposer que les "TOTAL SEMAINE" et numéro de jour sont en colonne 2.
    Je vais supposer que tes valeurs commencent en ligne 2.
    Je suppose aussi qu'il n'y a pas de valeur d'heure pour les lignes TOTAL SEMAINE et TOTAL MOIS.
    Je vais faire l'impasse sur les heures de nuit et autres primes, tu adapteras.

    Tu mets en colonne 7 la formule suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(LC2="TOTAL SEMAINE";somme(L(-1)C6:L2C6)-somme(L(-1)C:L2C);"")
    Pour les mois, tu mets exactement la même formule en colonne 8 en remplaçant simplement "TOTAL SEMAINE" par "TOTAL MOIS".
    Pas compliqué.

    Si tu veux avoir toutes les valeurs dans la même colonne, tu peux mettre en colonne 9 un simple :
    Il ne te reste plus qu'à copier ces trois formules sur toutes les lignes de données.
    Ca n'est pas perturbé s'il y a plusieurs lignes de journée pour un même numéro de journée, c'est-a-dire par le nombre de journées par semaines.

    On aurait pu avoir toutes les valeurs directement dans une seule colonne mais il aurait fallu utiliser des SOMME.SI qui auraient complexifié les formules et ralenti les calculs.

    Citation Envoyé par Nadine Soulage Voir le message
    Mais, par curiosité, si quelqu'un connait une méthode pour utiliser la fonction somme en fonction de l'adresse comme dans la formule de mon premier post mais en valeur relative je suis preneuse.
    Quelle formule ?
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Responsable paie
    Inscrit en
    Juillet 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Responsable paie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    J'avais bien compris pour les conseils d'améliorations, je me fais moi-même la remarque très souvent que je code comme un cochon, mais je n'ai pas le temps de faire mieux et tant que ça fonctionne ça me va.

    Il ne s'agit pas de formules Excel, je suis plutôt pas mal à ce niveau c'est mon principal outil de travail depuis 20 ans dont une partie en tant que formatrice, en général j'arrive toujours à mes fins.
    Mon problème c'était de faire les calculs à partir de VBA, là je suis un peu moins performante.
    Il s'agit de plusieurs feuilles avec plus de 3000 lignes et plusieurs dizaines de salariés. Le but c'est de récupérer un fichier texte, de retraiter les données et d'effectuer tous les calculs sur des plages de données variables juste en appuyant sur un bouton. Il ne s'agit pas tous les mois de recopier plus de 200 fois une formule, je suis partisane de l'automatisation et je n'ai pas de temps à perdre sur ce genre de tâche.
    Mais c'est bon, j'ai trouvé, mon code tourne à merveille en travaillant sur le numéro de semaine et non sur le numéro du jour comme ça m'a été conseillé sur ce forum. J'aurai du y penser toute seule mais des fois on passe bêtement à côté des solutions les plus simples. J'étais partie sur les jours et remonter le numéro de semaine ne m'avait absolument pas effleuré l'esprit alors que c'était une évidence.

    Merci, même si la réponse n'était pas adaptée à ma demande.
    Nadine

    Citation Envoyé par Menhir Voir le message
    Ce n'était pas une critique mais juste un conseil d'amélioration.


    Comme tu parles de colonne 6 et non de colonne F, je vais supposé que tu es en référence L1C1 et non A1. Les formules ci-dessous seront donc avec ce type de référence.

    Je vais supposer que les "TOTAL SEMAINE" et numéro de jour sont en colonne 2.
    Je vais supposer que tes valeurs commencent en ligne 2.
    Je suppose aussi qu'il n'y a pas de valeur d'heure pour les lignes TOTAL SEMAINE et TOTAL MOIS.
    Je vais faire l'impasse sur les heures de nuit et autres primes, tu adapteras.

    Tu mets en colonne 7 la formule suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(LC2="TOTAL SEMAINE";somme(L(-1)C6:L2C6)-somme(L(-1)C:L2C);"")
    Pour les mois, tu mets exactement la même formule en colonne 8 en remplaçant simplement "TOTAL SEMAINE" par "TOTAL MOIS".
    Pas compliqué.

    Si tu veux avoir toutes les valeurs dans la même colonne, tu peux mettre en colonne 9 un simple :
    Il ne te reste plus qu'à copier ces trois formules sur toutes les lignes de données.
    Ca n'est pas perturbé s'il y a plusieurs lignes de journée pour un même numéro de journée, c'est-a-dire par le nombre de journées par semaines.

    On aurait pu avoir toutes les valeurs directement dans une seule colonne mais il aurait fallu utiliser des SOMME.SI qui auraient complexifié les formules et ralenti les calculs.


    Quelle formule ?

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonsoir Nadine,

    Peut-être je perds mon temps et tu sais déjà ce qui suit mais comme tu parles de difficultés lors des tests, débogages.....
    1. Exécuter le programme ligne à ligne par F8.
    2. Pour arrêter l'exécution à une ligne donnée, F9 pose un point d'arrêt. L'appui de la même touche l'enlève.
    3. Pour vérifier la valeur des variables à un moment donné


    • Evidemment MsgBox nom_variable. Mais l'exécution s'arrête à chaque message.
    • debug.print nom_variable. La valeur est inscrite dans la fenêtre "Exécution" que l'on affiche par le menu "Affichage" ou Ctrl+G
    • Lors de l'arrêt de l'exécution ou de l'exécution ligne à ligne, mettre le pointeur de la souris au-dessus du nom de ce dont on veut connaître la valeur.


    Bon courage et peut-être à bientôt.

  11. #11
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Nadine Soulage Voir le message
    J'avais bien compris pour les conseils d'améliorations, je me fais moi-même la remarque très souvent que je code comme un cochon, mais je n'ai pas le temps de faire mieux et tant que ça fonctionne ça me va.
    Justement : améliorer ta façon de coder te permettrait d'arriver plus facilement et plus rapidement à la solution désirée.
    Et, surtout, ça te permettrait de comprendre plus facilement le code que tu as écrit.

    Il s'agit de plusieurs feuilles avec plus de 3000 lignes et plusieurs dizaines de salariés. Le but c'est de récupérer un fichier texte, de retraiter les données et d'effectuer tous les calculs sur des plages de données variables juste en appuyant sur un bouton. Il ne s'agit pas tous les mois de recopier plus de 200 fois une formule, je suis partisane de l'automatisation et je n'ai pas de temps à perdre sur ce genre de tâche.
    Dans le cas que tu présentes, tu pourrais parvenir avec de simples formules au même résultat sans avoir à appuyer sur un bouton.
    Ce serait encore plus automatique.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  12. #12
    Futur Membre du Club
    Femme Profil pro
    Responsable paie
    Inscrit en
    Juillet 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Responsable paie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci Jean Claude,

    C'est exactement le genre de conseil dont j'avais besoin.

    Mon principal problème c'est justement de chercher les erreurs, c'est pour ça que je garde tous mes sélect, au moins quand ça plante je vois où le programme s'est arrêté et je vérifie la valeur de mes variables en passant la souris dessus. Pour ce qui est de cette appli ce qui est fait est fait je ne vais donc pas la retoucher elle fait ce qui était prévu c'est le principal.
    Mais pour les prochaines, et je suis certaines qu'il y en aura, je vais apprécier de pouvoir utiliser les manips que tu m'as données. Je ne sais pas utiliser les fonctionnalités de déboggages et je n'ai jamais réussi à utiliser le pas à pas. En fait je ne sais que coder, j'utilise très peu les commandes VBA faute de temps pour les apprendre.
    Encore merci, je garde tout ça sous le coude avec la modification de code que tu m'as fait l'autre jour mais comme je n'ai pas tout compris je ne peux pas encore l'utiliser car j'ai pour principe de ne coder que ce que je comprends.

    Bonne soirée et peut-être à une prochaine fois mais pas trop tôt j'espère.
    Nadine


    Citation Envoyé par jcDSoft Voir le message
    Bonsoir Nadine,

    Peut-être je perds mon temps et tu sais déjà ce qui suit mais comme tu parles de difficultés lors des tests, débogages.....
    1. Exécuter le programme ligne à ligne par F8.
    2. Pour arrêter l'exécution à une ligne donnée, F9 pose un point d'arrêt. L'appui de la même touche l'enlève.
    3. Pour vérifier la valeur des variables à un moment donné


    • Evidemment MsgBox nom_variable. Mais l'exécution s'arrête à chaque message.
    • debug.print nom_variable. La valeur est inscrite dans la fenêtre "Exécution" que l'on affiche par le menu "Affichage" ou Ctrl+G
    • Lors de l'arrêt de l'exécution ou de l'exécution ligne à ligne, mettre le pointeur de la souris au-dessus du nom de ce dont on veut connaître la valeur.


    Bon courage et peut-être à bientôt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Programmation VBA (boucle do while loop)
    Par Dbratt dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 13/08/2014, 23h41
  2. VBA Boucle do while
    Par amzyr dans le forum VBA Access
    Réponses: 4
    Dernier message: 23/01/2013, 18h16
  3. Réponses: 2
    Dernier message: 06/02/2007, 15h05
  4. [VBA] Boucle do while
    Par Pitou5464 dans le forum Access
    Réponses: 8
    Dernier message: 23/08/2006, 10h17
  5. [VBA] Boucle Do While
    Par jmde dans le forum Access
    Réponses: 4
    Dernier message: 16/10/2005, 20h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo