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 :

Positionnement de plusieurs If dans des boucles imbriquées


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 71
    Par défaut Positionnement de plusieurs If dans des boucles imbriquées
    Bonjour à tous,
    une fois de plus je me tourne vers le forum pour m'aider à résoudre mon problème. Je vous mets la feuille Excel en PJ.
    La première partie de la macro récupère ligne par ligne le numéro de colonne dans lequel on a le min et le max, ainsi que les valeurs.
    C'est une étape préparatoire à la suite :
    je souhaite que la macro remplisse la colonne 24 (ou X) comme cela est fait dans l'exemple, suivant les règles suivantes :
    - la première voiture arrive en P16 à 6h52 --> on met 1 en X9
    - il faut qu'elle reparte de P16 en respectant un temps de retournement de 20 mn (paramétrable en B2) et selon une parité différente (la parité est en colonne 1). La parité représente le sens de roulement.
    - on voit que la ligne 11 est la première à répondre à ces critères --> on met 2 (= 1+1) en X11
    - la voiture arrive en P5 à 8h49. La prochaine ligne respectant les critères est la ligne 25 --> on met 3 (= 2+1) en X25
    Ainsi de suite...
    Ensuite on veut remplir la colonne 25 (ou Y) selon la même logique, cette fois la première voiture est à la ligne 10. Puisque la ligne 9 est déjà remplie.
    La macro ne peut se terminer que quand toutes les cellules de la plage W9:W61 sont remplies.
    C'est un peu compliqué à expliquer alors j'espère que j'ai été assez clair pour que vous puissiez comprendre le problème et m'aider... N'hésitez pas à me poser des questions s'il est nécessaire de préciser certaines choses.
    A+
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éclairé Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Par défaut
    bonjour
    si je comprend bien..

    dans la colonne W,il y a toujours un "1"
    la condition se situe dans la colonne x qui va augmenter de 1 à chaque fois la condition est remplie par rapport à "P1" ou "P2", etc..

    donc ce que tu veux est que le compteur augment chaque fois que tu inscrit une nouvelle donné concernant chaque "P"

    si je prend "P1" pour exemple, il doit avoir en "X60" le nombre 19

    est-ce bien cela ?

    a moins qu'a partir de la colonne X, tu veuille faire 16 autre colonne synthetisant "P1" à "P16" avec le compteur

    donc concernant "P5", on aurai le résultat "16" dans la cellule "AB61"

    alors ??

  3. #3
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 71
    Par défaut
    Bonjour Bosk1000, et merci de t'intéresser à mon problème.

    Pour répondre à ta question, non, ce n'est pas cela :
    - en W les "1" se mettent automatiquement au fur et à mesure que la macro remplit les colonnes > 24 (ou X)
    - la colonne X est actuellement entièrement remplie, il n'y a donc rien à mettre en X60.

    Il faut bien comprendre que la construction se fait pas à pas, et selon les critères énoncés dans mon précédent post.
    Prenons par exemple le remplissage de la colonne 25 (ou Y):
    - on met 1 en Y10 puisque c'est la première voiture "dispo"
    elle part de P16 à 6h53 et arrive en P1 à 8h55. Sa parité est 1. Il faut donc trouver un trajet qui parte de P1 au moins 20 mn après 8h55 et dont la parité soit différente de 1 (donc = 2).
    - En ligne 14 on a bien un trajet qui part à 9h55 mais la parité n'est pas 2 donc on ignore la ligne et on continue la recherche.
    - La première ligne à satisfaire les critères est la ligne 29 : la parité est 2 et le départ est plus de 20mn après 8h55.
    etc...

    Si on devait commencer à remplir la colonne 26 (ou Z), on mettrait 1 en Z12, puis 2 en Z16...

  4. #4
    Membre éclairé Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Par défaut
    j'ai bien compris le fonctionnement de ton tableau
    pour exemple a partir de la colonne 24 ligne 9
    si la cellule n'est pas vide, regarder en colonne A
    si la valeur est 1 recherché les valeurs 2 en dessous et prendre l'horaire
    au delà du temps en b2

    pas évident comme critère

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    As-tu pensé à utiliser select case plutôt que des if. Un parcours en boucle qui détermine la parité à chercher, select case pour traiter selon cette parité et if then pour ce qui est de l'horaire de départ.
    (je n'ai pas regardé ton fichier et ne me base que sur tes explications. Bref, je ne suis pas certain d'avoir bien tout compris )

  6. #6
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 71
    Par défaut
    Bonjour Bosk1000, ouskel'n'or, le forum,

    - Bosk1000, effectivement la logique est celle que tu décris, mais il ne faut pas oublier de comparer les horaires (le départ suivant est au moins 20 mn après l'arrivée et doit être au même endroit).
    - ouskel'n'or, effectivement, je pense qu'on doit pouvoir faire ça avec des select case, mais je me sens moins à l'aise avec cette écriture, alors je suis parti sur des if, then, else...

    J'ai un peu travaillé ma macro et je vous la mets à suivre :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    Sub Journee()
     
    Dim ligne, colonne, lfin, cfin, cref, j, parite1, parite2 As Integer
    Dim CMax, Max, CMin, Min, Tarr, compare, tret, amplimax
     
    'Déclaration des hypothèses
    tret = Format(Worksheets("journ").Cells(2, 2), "hh:nn:ss")
    amplimax = Format(Worksheets("journ").Cells(3, 2), "hh:nn:ss")
     
    'Prise en compte des dimensions du tableau
    lfin = Cells(65335, 2).End(xlUp).Row
    cfin = Cells(7, 256).End(xlToLeft).Column
     
    'initialisation
    ligne = 9
    j = 1
     
    'début de boucle
     
    For ligne = 9 To lfin
    If Cells(ligne, 23).Value <> 1 Then
     
        parite2 = Cells(ligne, 1).Value
     
        If Worksheets("journ").Cells(ligne, 4) = "" Then
            Max = "00:00:00"
        Else
            Max = Format(Worksheets("journ").Cells(ligne, 4), "hh:nn:ss")
        End If
        If Worksheets("journ").Cells(ligne, cfin) = "" Then
            Min = "24:59:59"
        Else
            Min = Format(Worksheets("journ").Cells(ligne, cfin), "hh:nn:ss")
        End If
        CMax = 4
        CMin = cfin
     
        'boucles pour trouver Max et Min
        For colonne = 5 To cfin
            If Worksheets("journ").Cells(ligne, colonne) = "" Then
                compare = "00:00:00"
            Else
                compare = Format(Worksheets("journ").Cells(ligne, colonne), "hh:nn:ss")
                If DateDiff("s", Max, compare) > 0 Then
                    Max = compare
                    CMax = colonne
                End If
            End If
        Next
     
        For colonne = cfin - 1 To 4 Step -1
            If Worksheets("journ").Cells(ligne, colonne) = "" Then
                    compare = "00:00:00"
        Else
                compare = Format(Worksheets("journ").Cells(ligne, colonne), "hh:nn:ss")
                If DateDiff("s", Min, compare) < 0 Then
                    Min = compare
                    CMin = colonne
                End If
            End If
        Next
     
    'Tests pour remplir les colonnes > 24
     
        If ligne > 9 Then
            If parite2 <> parite1 Then
                    If CMin = cref Then
                        'If DateDiff("s", Min, Tarr + tret) > 0 Then
                        If Min > Tarr + tret Then
                        j = j + 1
                        'choix de la ligne 27 pour faire un test sans écraser les données de la colonne 24
                        Cells(ligne, 27) = j
                        'Récupérer le n° de colonne et la valeur Max et la parité
                        Tarr = Max
                        cref = CMax
                        'parite1 = Cells(ligne, 1).Value
                        End If
                    End If
            End If
        End If
     
    'Récupérer le n° de colonne et la valeur Max et la parité
     
        Tarr = Max
        cref = CMax
        parite1 = Cells(ligne, 1).Value
     
    End If
    Next ligne
     
    End Sub
    Malheurseusement cette macro ne remplit pas la colonne exactement comme elle le devrait. Je pense que cela vient du fait qu'en fin de boucle je récupère toujours un nouveau
    tarr, tcref et parite
    même quand je ne le devrais pas.
    Est-ce un problème de positionnement de cette partie de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Tarr = Max
        cref = CMax
        parite1 = Cells(ligne, 1).Value
    ou il manque un if quelque part?
    Merci

Discussions similaires

  1. [C#]Remonter des événements dans des classes imbriquées
    Par Kcirtap dans le forum Windows Forms
    Réponses: 9
    Dernier message: 14/12/2013, 12h43
  2. problème de syntaxe dans des boucles imbriquées
    Par deglingo37 dans le forum Access
    Réponses: 2
    Dernier message: 01/09/2006, 14h46
  3. Positionner précisement plusieurs JPanel dans une JFrame.
    Par RadicalBob dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 13/06/2006, 22h42
  4. Présentation dans des listes imbriquées
    Par Ghusse dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 29/09/2005, 09h35

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