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 .. Wend


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2007
    Messages : 66
    Points : 33
    Points
    33
    Par défaut Boucle While .. Wend
    Bonjour,

    j'ai un petit problème de boucle, je trouve pas où ça plante...

    j'ai un stock d'essence de 54 Litre,

    la pompe 1 vide 20 litres par 20 litres
    la pompe 2 vide 10 litres pas 10 litres
    la pompe 3 vide 2 litre par 2 litre

    je vide des litres d'essence, si le litrage est >= à la valeur A1 ( litrage que la pompe 1 peut évacuer de la cuve) je continue à vider

    pompe1=pompe1 + 1 : me donne le nombre de litre que la pompe1 à vidé


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    While niveau >= (Sheets("feuil1").Range("A1"))
        pompe1=pompe1 + 1
        niveau = niveau - (Sheets("feuil1").Range("A1"))
    Wend
     
    While niveau >= (Sheets("feuil1").Range("A2") )
        pompe2 = pompe2 + 1
        niveau = niveau - (Sheets("feuil1").Range("A2"))
    Wend
     
    While niveau >= (Sheets("feuil1").Range("A3"))
        pompe3 = pompe3 + 1
        niveau = niveau - (Sheets("feuil1").Range("A3"))
    Wend
    dans mon récapitulatif, les litrages ne s'affichent pas...

    est ce que vous trouvez un problème sur mon code ?

    merci

  2. #2
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Bonjour,

    Et comme ça ? Je n'ai pas l'habitude d'utiliser While...Wend mais à tout hazard
    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
    With Sheets("feuil1")
     
    While niveau >= .Range("A1").Value
        pompe1 = pompe1 + 1
        niveau = niveau - .Range("A1").Value
    Wend
     
    While niveau >= .Range("A2").Value
        pompe2 = pompe2 + 1
        niveau = niveau - .Range("A2").Value
    Wend
     
    While niveau >= .Range("A3").Value
        pompe3 = pompe3 + 1
        niveau = niveau - .Range("A3").Value
    Wend
     
    End With

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 563
    Points : 1 691
    Points
    1 691
    Par défaut
    je comprend pas ce point là
    cela ne te donne pas le nombre de litre que la pompe a évacué (20 + 1 = 21 )mais le nombre de coup de pompe. si tu veux le nombre de litre pompé, il te faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pompe1 = pompe1 + pompe1
    et quand au fait que les récap ne s'affiche pas, a priori , c'est normal, a aucun momment tu ne dis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cellulerécapniveau = niveau
    celulelitragepompe1 = pompe1
    sinon, ta boucle fonctionne parfaitement

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour,

    Ton problème est tout simplement identique à celui d'un monnayeur ....

    Les valeurs faciales à distribuer dans l'ordre décroissant sont ici à remplacer par les litrages tirables à chaque coup par une pompe, c'st tout...

    Quant à l'affichage, il peut n'être fait qu'in fine (inutile de ralentir ton appli tout au long en te référant à chaque fois à la valeur de cellules).

    EDIT : mon commentaire ici sur ta façon de procéder :

    Quel besoin de jouer comme aux buchettes (en les comptant une par une alors qu'une division faite d'entrée de jeu te donne immédiatement le nombre de tirages possibles d'une pompe ??? )...
    La seule boucle dont je vois l'utilité serait pour passer d'une pompe à l'autre et non au sein d'une même pompe !!!!!


    Re edit : sans compter plusieurs autres aspects ...

    Je vois que tu détermines l'importance de la "livraison" à faire (ici 54 litres)

    - Si tu ne les as pas, il faut immédiatement signaler (donc calculer à l'avance)
    - si tu les as, mais ne peut faire l'appoint demandé ? (par exemple 300 litres disponibles dans la cuve1 mais plus rien dans les autres... comment en distribuer 54 à coup de 50 litres ?... ou encore une commande de 23 litres alors que le plus petit débit, de la pompe3, est de 2 litres !)
    - et d'autres petites choses

    Il te faut gérer celà à priori et non a posteriori, me semble-t-il !!!

    Pour bien comprendre le pourquoi des choses : imagine simplement que tu te rendes, sur un tarmac, pour satisfaire la commande d'un aéronef, avec tes 3 pompes .... (tu vas vite comprendre). Et alors ? si tu ne parviens pas à l'exactitude, que vas-tu faire ? Repomper dans la citerne de l'aéronef pour rétablir des niveaux par rapport aux différences constatées ? cas d'une commande de 70 litres alors que tes cuves 2 et 3 sont vides et que la cuve 1 en contient 300 ? Il va êtrev content, tiens, le commandant de bord, de n'apprendre qu'in fine qu'il n'a reçu sans être prévenu que 60 litres et qu'il ne lui reste plus qu'à faire appel, s'il veut les 10 manquants, à une autre société (en espérant qu'une autre accepte de se déplacer pour 10 litres... à moins de repomper ce qui a été distribué afin de lui donner une chance de trouver un autre fournisseur intéressé !!!).

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Tiens,
    Je me suis amusé à faire du paramétrable, en gérant même des erreurs (contenu d'une citerne non multiple du débit de sa pompe)

    Sur un userform :

    - une ligne de 3 textboxes nommée citerne1, citerne2 et citerne3 (destinées à recevoir leurs contenus)
    - une ligne de 3 textboxes nommées debit1, debit2 et debit3 (destinées à recevoir les débits)
    - une textebox nommée commande et destinée à recevoir la quantité à livrer
    - un bouton de commande destiné à l'exécution.

    Lance, complète les textboxes, fais des "livraisons", lis les messages reçus et observe les évolutions dans les citernes.

    Voilà le type de mécanisme à adapter (en remplaçant au besoin les textboxes par tes cellules/Excel


    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
    Option Explicit
    Private debits, dispo, dispo1, restes
     
    Private Sub Command1_Click()
      If Not verifions Then
        MsgBox "une donnée est manquante !"
        Exit Sub
      End If
      Dim rep As Double, arep As Double, arep1 As Double, i As Integer, combien As Double, distribues As String
      arep = Val(commande.Text)
      arep1 = CDbl(arep)
      distribues = ""
      For i = 0 To UBound(debits)
        combien = Int(CDbl(arep1) / CDbl(Val(debits(i))))
        If combien > dispo(i) Then combien = dispo(i)
        dispo(i) = dispo(i) - combien
        arep1 = arep1 - (combien * CDbl(debits(i)))
        rep = rep + (combien * CDbl(debits(i)))
        If combien > 0 Then distribues = distribues & combien & " * " & debits(i) & vbCrLf
      Next
      If arep > rep Then
        Dim avoir As Double
        For i = 0 To UBound(debits)
          avoir = avoir + (dispo(i) * debits(i))
        Next
        If avoir > (arep - rep) Then
           MsgBox " pas de quoi faire appoint "
        Else
          MsgBox " pas assez dans les cuves et vous devriez encore " & arep - rep & " litres" & vbCrLf & _
          "vous ne pourriez en effet distribuer que ceci :" & vbCrLf & distribues
        End If
        distribues = ""
        Let dispo = dispo1
      Else
        MsgBox "vous avez distribué " & distribues
        Let dispo1 = dispo
        citerne1.Text = dispo1(0) * debits(0) + restes(0): citerne2.Text = dispo1(1) * debits(1): citerne3.Text = dispo1(2) * debits(2)
      End If
    End Sub
     
    Private Function verifions() As Boolean
      verifions = False
      If Not IsNumeric(citerne1) Then Exit Function
      If Not IsNumeric(citerne2) Then Exit Function
      If Not IsNumeric(citerne2) Then Exit Function
      If Not IsNumeric(debit1) Then Exit Function
      If Not IsNumeric(debit2) Then Exit Function
      If Not IsNumeric(debit3) Then Exit Function
      If Not IsNumeric(commande) Then Exit Function
      debits = Array(Val(debit1), Val(debit2), Val(debit3))
      dispo = Array(Val(citerne1.Text) \ debits(0), Val(citerne2.Text) \ debits(1), Val(citerne3.Text) \ debits(2))
      restes = Array(Val(citerne1) Mod debits(0), Val(citerne2) Mod debits(1), Val(citerne3) Mod debits(2))
      verifions = True
    End Function
    Voilà... les choses sont quelquefois plus complexes qu'elles ne le paraissent au départ .

    Analyse tout tranquillement...

  6. #6
    Membre actif Avatar de Many31
    Profil pro
    Inscrit en
    Février 2007
    Messages
    198
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 198
    Points : 210
    Points
    210
    Par défaut
    tu vois petibonohm tu voulais visualiser tes litres d'essence ben Ucfoutu il te fait une macro qui te vide les pompes, prépare un gateau au cas ou t'aurais faim pendant l'opération, te fait un massage et prépare le café. Sans oublier la vaisselle ^^

    Code Lisa?

  7. #7
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour, many31,

    Pas du tout !

    Il va avoir à étudier pas mal (et à découvrir, également) pour analyser, comprendre tout et adapter à ses cellules ...
    C'est le but recherché ...

  8. #8
    Membre actif Avatar de Many31
    Profil pro
    Inscrit en
    Février 2007
    Messages
    198
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 198
    Points : 210
    Points
    210
    Par défaut
    Bonjour Ucfoutu

    je critique pas du tout. Bien au contraire j'apprend moi aussi ^^ c'est le but de ma présence ici :=)

    pour pas foutre la merde je dirai que j'aurais aussi rajouté une gestion d'erreur au cas ou

    /me court

  9. #9
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Mais la chose va beaucoup plus loin, Many31...

    J'ai dépensé moins de temps à développer l'essentiel que celui que j'ai dépensé pour que la chose ne soit pas utilisable, sans une étude préalable, avec un simple copier-coller et des cellules...

    Je me suis également évertué à "noyer un peu le poisson", pour forcer à la réflexion...

    J'attends des uns et des autres (de ceux que la chose intéresserait de près ou de loin) la seule réaction saine possible : alléger tout celà de ce que ucfoutu y a .... foutu... pour obliger à réfléchir ...

    Il y a longtemps que j'ai développé mon monnayeur .... et il est beaucoup plus simple que ce que j'ai montré là ...

  10. #10
    Membre actif Avatar de Many31
    Profil pro
    Inscrit en
    Février 2007
    Messages
    198
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 198
    Points : 210
    Points
    210
    Par défaut
    Ce qui est sur....


    c'est que je vais finir par mettre plus de temps a comprendre tes phrases que toi à écrire ton code

    Je suis décu que tu nous ais pas inclu un tit GiF d'une pompe se vidant

Discussions similaires

  1. [AC-2003] Boucle While .. Wend sur un recordset qui ne s'execute pas
    Par mamadouabd dans le forum VBA Access
    Réponses: 6
    Dernier message: 24/11/2009, 20h00
  2. [AC-2000] Sortir d'une boucle while wend
    Par 973thom dans le forum VBA Access
    Réponses: 2
    Dernier message: 03/09/2009, 10h14
  3. chargement du Combo Par sql boucle While wend
    Par r.mehdi dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 09/06/2008, 18h16
  4. [VBA]Boucle While/Wend interrompue
    Par stéphane_ais2 dans le forum VBA Access
    Réponses: 6
    Dernier message: 29/03/2007, 15h05
  5. Recordset et boucle While...Wend
    Par sbeprod dans le forum Access
    Réponses: 9
    Dernier message: 24/07/2006, 16h48

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