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

Macros et VBA Excel Discussion :

Incrémentation de temps sous condition


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Apprenti
    Inscrit en
    Décembre 2013
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2013
    Messages : 44
    Par défaut Incrémentation de temps sous condition
    Bonjour à tous,

    Après un passage il y a quelques semaines, me voilà de nouveau confronté à un problème de macro que je n'arrive pas à résoudre...

    En effet, mon dossier (en pièce jointe) a été en partie réalisé par vos soins. Mais après plusieurs modifications et tentatives de m'adapter en fonction des personnes qui complètent ce fichier, j'ai perdu un certain fil dans mes macros.

    Mon problème est le suivant: Lorsque je ne met ni la durée ni la fréquence en feuille 'saisie-pilote', la fréquence se met automatiquement à 1 et la durée à 00:05 après le choix de la Machine/Cause. Cependant dans la feuille 'CalculsMacros' la durée ne s'incrémente pas de 5min (mais la fréquence oui).

    J'ai 2 macros pour gérer l'incrémentation de temps et de fréquence. J'ai donc peur qu'elles ne soient pas forcément complémentaires...

    Voici les deux lignes de codes pour ceux qui ne souhaitent pas ouvrir le fichier:
    Rajout automatique de la fréquence et du temps
    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
    Private Sub Cause()
        Dim Rg As Range
     
        Set Rg = Me.Shapes(Application.Caller).TopLeftCell.Offset(, -2)
            t$ = Rg.Value:  If t = "" Then t = Rg.End(xlUp).Value
     
        With Feuil1
            With .Cells(.Rows.Count, 5).End(xlUp).Offset(1)
                            .Value = t
                .Offset(, 1).Value = Rg.Offset(, 1).Value
     
                If .Offset(, -1) = "" And .Offset(, -2) = "" Then
                    .Offset(, -1).Value = 1
                    .Offset(, -2).Value = TimeValue("0:05")
     
                End If
            End With
     .Activate
     
        End With
     
        Set Rg = Nothing
    End Sub
    Incrémentation du temps et fréquence dans le module 'saisie-pilote'
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    'la macro se déclenche à chaque fois qu'une valeur est entrée dans une cellule de la feuille
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    'Définir les variables
        If Target.Column <> 6 Then Exit Sub ' le target ne concerne que la colonne 6
        Dim Ligne As Integer
        Dim trouvé As Boolean
        trouvé = False
        'si toutes les colonnes de 3 à 6 sont renseignées
        If Target.Offset(0, 0) = "" And Target.Offset(0, -2) = "" And Target.Offset(0, -3) = "" Then
            MsgBox " Renseigner au minimum le début, la durée ou la fréquence"
     
            Exit Sub
        Else
            With Sheets("CalculsMacros")
              'on cherche sur la feuille "CalculsMacros" la première ligne de la machine correspondant à l'évènement
               Ligne = Application.Match(Cells(Target.Row, 5), .[A:A], 0) ' départ de la recherche
     
               Do While .Cells(Ligne, 1) = Target.Offset(0, -1) ' "Autre" est traité comme un cas courant dans la boucle
     
                  If .Cells(Ligne, 3) = Target Then
                      If Target.Offset(0, -2) <> "" Then
                         .Cells(Ligne, 5) = .Cells(Ligne, 5) + TimeValue("0:05") * Cells(Target.Row, 4)
                         .Cells(Ligne, 8) = .Cells(Ligne, 8) + Cells(Target.Row, 4)
                      Else
                         .Cells(Ligne, 5) = .Cells(Ligne, 5) + Cells(Target.Row, 3)
                         .Cells(Ligne, 8) = .Cells(Ligne, 8) + 1
                      End If
                      trouvé = True
                      Exit Do
                  End If
                  Ligne = Ligne + 1
              Loop
     
              If trouvé = False Then
                 MsgBox " Cas incompatible avec le choix dans une liste "
              End If
            End With
        End If
    End Sub
    En espérant avoir le plus clair possible.

    Bien cordialement,

    Blend
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expérimenté
    Homme Profil pro
    Pompier de service
    Inscrit en
    Février 2014
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Pompier de service

    Informations forums :
    Inscription : Février 2014
    Messages : 146
    Par défaut
    Salut,

    Ca me parait normal, car quand on exécute le code pas-à-pas, on se rend compte que, si on ne saisit pas de durée ni de fréquence dans "saisie-pilote", au moment où on choisit sa "machine/cause", on va rentrer dans la partie du if que j'ai mis en vert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                  If .Cells(Ligne, 3) = Target Then
                      If Target.Offset(0, -2) <> "" Then
                         .Cells(Ligne, 5) = .Cells(Ligne, 5) + TimeValue("0:05") * Cells(Target.Row, 4)
                         .Cells(Ligne, 8) = .Cells(Ligne, 8) + Cells(Target.Row, 4)
                      Else
                         .Cells(Ligne, 5) = .Cells(Ligne, 5) + Cells(Target.Row, 3)
                         .Cells(Ligne, 8) = .Cells(Ligne, 8) + 1
                      End If
    On fait bien alors un "+1" pour la colonne "récurrence de d'evt", mais on vient ajouter, à la "durée totale", la valeur actuelle PLUS la valeur de la colonne "durée" dans "saisie-pilote"... qui est actuellement vide !!!

    Ce n'est que plus tard dans le "Sub Cause" que tu complètes "saisie-pilote" par les valeurs par défaut si vide, à savoir "0:05" et "1"

  3. #3
    Membre averti
    Homme Profil pro
    Apprenti
    Inscrit en
    Décembre 2013
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2013
    Messages : 44
    Par défaut
    Bonjour Phil'oche,

    Merci de ta réponse, effectivement on "saute" la partie souhaitée pour rajouter le temps..
    J'ai simplement rajouté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                  If .Cells(Ligne, 3) = Target Then
                      If Target.Offset(0, -2) <> "" Then
                         .Cells(Ligne, 5) = .Cells(Ligne, 5) + TimeValue("0:05") * Cells(Target.Row, 4)
                         .Cells(Ligne, 8) = .Cells(Ligne, 8) + Cells(Target.Row, 4)
                      Else
                         .Cells(Ligne, 5) = .Cells(Ligne, 5) + Cells(Target.Row, 3) + TimeValue("0:05") 
                         .Cells(Ligne, 8) = .Cells(Ligne, 8) + 1
                      End If
    Mais cela fait un peu "bricolage"... Il n'y a pas de meilleures solutions possible qui fasse plus "pro" ?

    Bien cordialement,

    Blend

  4. #4
    Expert éminent 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
    Par défaut
    Déjà, tu pourrais commencer par mettre cette valeur 0:05 soit dans une variable (du style V_Duree_Defaut) en début de code dans un chapitre initialisation, ce qui t'éviterai d'avoir à la chercher si chercher si tu veux un jour la modifier.

    Perso, c'est plutôt le genre de chose que je mets dans un onglet Paramètres et que je récupère dans des variables en début de code. Ca permet de la modifier facilement et tout le monde peut ainsi connaitre les paramètres retenu sans connaitre le code.

  5. #5
    Membre averti
    Homme Profil pro
    Apprenti
    Inscrit en
    Décembre 2013
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2013
    Messages : 44
    Par défaut
    Effectivement cela serait plus simple, je vais essayer de le faire. Le problème est que quand j'ai commencé ce fichier, je n'avais aucune connaissance... Ce fichier a donc évolué en même temps que moi provoquant beaucoup de sac de noeud de code! Il n'est pas du tout simple ni "lisible" pour un tiers.

    Encore merci pour votre aide !

    Blend

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

Discussions similaires

  1. [XL-2010] Calculer le temps entre 2 enregistrements sous conditions.
    Par PaulineH dans le forum Excel
    Réponses: 2
    Dernier message: 04/04/2014, 21h10
  2. Incrémentation d'une variable sous condition
    Par Can10ce dans le forum SAS Base
    Réponses: 7
    Dernier message: 04/05/2009, 14h44
  3. Réponses: 1
    Dernier message: 21/10/2008, 10h45
  4. Pb Ouverture de formulaire sous condition.
    Par Phl98 dans le forum Access
    Réponses: 8
    Dernier message: 03/11/2005, 23h28
  5. Create function sous condition
    Par nbl dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/05/2005, 13h00

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