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 :

Boucle while dans tableau


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
    Mars 2007
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 59
    Par défaut Boucle while dans tableau
    Bonjour,

    je me permets de poster ce sujet car je me trouve face à un problème

    J'ai construit un tableau "virtuel", uniquement avec du code VBA.

    ce tableau contient une ligne faite de "oui" et de "non".

    La ligne se présente de la sorte:

    oui oui oui oui non non non non

    je voudrait un code qui, pour la colonne j, me donne la longueur de la dernière plage de "oui".

    Pour être plus clair, cette boucle doit me donner:
    3 pour j=3
    0 pour j = 5

    j'ai tenté le code suivant :

    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
     
    sub creationtableau()
     
    dim tableau(1,1 to 8) as variant
     
    tableau(1,1)="oui"
    tableau(1,2)="oui"
    tableau(1,3)="oui"
    tableau(1,4)="oui"
    tableau(1,5)="non"
    tableau(1,6)="non"
    tableau(1,7)="non"
    tableau(1,8)="non"
     
    end sub
     
     
    sub test
     
    for j=1 to 8
     
    duree=0
    While tableau(1, j -duree - 1) = "oui"
    duree= duree+ 1
    Wend
     
    next j
     
    end sub
    Le problème c'est qu'il y a dépassement d'indice au bon d'un moment. J'ai essayer d'ajouter des conditions , mais rien n'y fait...

    Pouvez-vous m'aider?

    Merci d'avance.

    TRM

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    Salut,

    Première remarque : tu n'as pas besoin d'un tableau à 2 dimensions, une suffit amplement.

    Deuxièmement, pourquoi un tableau de variant et non de String ?

    Ensuite as-tu tenté quelque chose comme :

    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
    sub creationtableau()
     
    dim tableau(8) as String
     
    tableau(1)="oui"
    tableau(2)="oui"
    tableau(3)="oui"
    tableau(4)="oui"
    tableau(5)="non"
    tableau(6)="non"
    tableau(7)="non"
    tableau(8)="non"
     
    end sub
     
    sub test
     
    creationtableau 'Faut bien l'appeler ta première procédure
     
    dim cpt as integer
     
    cpt = 0
     
    for i = 1 to 8
     
    If tableau(i)="Oui" Then
    cpt = cpt + 1
    End if
     
    next
     
    MsgBox cpt
     
    end sub
    Je l'ai fait à main levée mais ça devrait être dans ce goût là !

    Bonne nuit

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Bonjour,
    Pas bien clair !! ta duree c'est le nombre total de oui dans le tableau ? au quel cas le code de Dead est d'application, mais si ta durée c'est la plus grande série de oui il faut passer par une variable intermédiaire.
    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
    Sub creationtableau()
    Dim tableau(1, 1 To 8) As String
    Dim Duree As Integer
    Dim MemoDuree As Integer
        tableau(1, 1) = "oui"
        tableau(1, 2) = "oui"
        tableau(1, 3) = "oui"
        tableau(1, 4) = "oui"
        tableau(1, 5) = "non"
        tableau(1, 6) = "non"
        tableau(1, 7) = "non"
        tableau(1, 8) = "non"
     
        For j = 1 To 8
            If tableau(1, j) = "oui" Then
                Duree = Duree + 1
            Else
                If Duree > MemoDuree Then MemoDuree = Duree
                Duree = 0
            End If
        Next j
        msgbox MemoDuree 'qui donne 4
    End Sub
    Et ce qui n'est pas clair aussi c'est..
    Pour être plus clair, cette boucle doit me donner:
    3 pour j=3
    0 pour j = 5
    j = 3 ? alors que tu a 4 oui et 4 non ?

    A+

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 59
    Par défaut
    bonjour,

    Merci pour vos réponses.

    Effectivement je n'ai pas été très clair du tout, je m'en excuse.
    Je réexplique le problème correctement.

    A la place des "oui" je vais mettre "malade" et à la place des "non" je vais mettre "ok", comme ceci le but à atteindre sera plus clair.

    Chaque colonne du tableau représente une année.

    Le but est de déterminer, quelquesoit l'année, et donc quelquesoit j, si l'individu est malade à cet instant, depuis combien de temps il est malade.

    En d'autres termes :
    -si à l'instant j (donc colonne j) l'individu est "ok", il faut que la durée soit égale à 0.
    - si à l'instant j l'individu est malade, je veux savoir depuis combien de temps dure sa dernière période de maladie.


    ainsi, si mon tableau se compose de la manière suivante:


    malade malade ok ok ok malade malade malade ok ok malade ok


    Par exemple, pour j=7, l'individu est malade depuis 2 ans. Il faudrait donc que le code me sorte une durée de 2.
    Pour j=4, l'individu n'est pas malade, sa duree est donc nulle.
    Pour j=8, on a une durée de 3.

    C'est pour ca que j'ai utilisé un "while", car il faut aller en arrière tant qu'il y a écrit "malade".
    mais seulement cela pose un problème pour j=1 et j=2 (dans ce cas) car il y a dépassement d'indice à un moment donné, et je n'arrive pas à "stopper" l'indice.

    Pourriez-vous m'aider dans ce sens.

    Je m'excuse encore pour mes mauvaises explications...

    TRM

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    Re,

    Tu peux reprendre mon code et remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If tableau(i)="Oui" Then
    cpt = cpt + 1
    End if
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If tableau(i)="Oui" Then
    cpt = cpt + 1
    Else
    cpt = 0
    End if
    Tu as un compteur qui commence à 0 donc. A chaque malade (ici "Oui") trouvé, il s'incrémente de 1 et donc tu sais à tout moment où tu en es dans ton compteur. Si jamais tu trouves "Non" (pour ton Ok), alors le cpt repassera à 0 et tout recommencera.

    Bonne chance pour la suite

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Re,
    Je pense que j'ai compris ce que tu veux...
    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
    Sub DonneNBannee()
    Dim i As Integer, R As Integer
    Dim tableau(1, 2000 To 2008) As String
    Dim M As Integer
        tableau(1, 2000) = "Malade"
        tableau(1, 2001) = "Malade"
        tableau(1, 2002) = "OK"
        tableau(1, 2003) = "OK"
        tableau(1, 2004) = "Malade"
        tableau(1, 2005) = "Malade"
        tableau(1, 2006) = "Malade"
        tableau(1, 2007) = "OK"
        tableau(1, 2008) = "OK"
    Reco:
        R = InputBox("Quelle année voulez-vous contrôllez ?", "Contrôle", Year(Now) - 1)
        If R < 2001 Or R > 2008 Then
            MsgBox "contrôle disponnible entre 2001 et 2008"
            GoTo Reco
        End If
        For i = R To 2000 Step -1
            If tableau(1, i) = "Malade" Then
                M = M + 1
            Else
    Controler:
                If M <> 0 Then
                    MsgBox "La personne est malade depuis " & M & " an(s)"
                Else
                    MsgBox "La personne est active"
                End If
                Exit Sub
            End If
        Next i
        If i < 2000 Then GoTo Controler
    End Sub
    Avec l'exemple que je met si tu tape 2006 tu auras 3ans ,2001..2 ans
    A+

Discussions similaires

  1. boucle "while" dans un sous-formulaire
    Par philebaucis dans le forum VBA Access
    Réponses: 4
    Dernier message: 02/04/2017, 06h15
  2. [MySQL] 2 boucles While dans un tableau
    Par Nicolas_k dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 25/01/2011, 14h59
  3. Boucle "while" dans un fichier Javascript ?
    Par Boris56 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/04/2010, 12h31
  4. Problème de boucle while dans un popup
    Par drogba72 dans le forum Langage
    Réponses: 2
    Dernier message: 06/02/2009, 14h19
  5. probleme de boucle while dans une procedure stockée
    Par aboulemagnifique dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 08/08/2007, 12h39

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