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 :

Probleme excel VBA code


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2013
    Messages : 7
    Par défaut Probleme excel VBA code
    Bonjour a tous,

    Je suis nouvellement stagiaire au sein d´une entreprise et mon chef me demande de resoudre un probleme a l´aide de l´editeur VBA d´excel. Le soucis est que je n´ai jamais utilise cet outil et que j´ai toujours nage en informatique
    Une petite aide serait donc la bienvenue Quel est le programme que je dois realiser sous visuel basic afin de repondre au probleme suivant demande par mon chef ? :


    On possede une cuve qui est alimente par un tuyau de debit 10 m cube par heures. Ce tuyau peut etre ouvert ou ferme a l´aide d´une vanne.

    L´eau sort de cette cuve par un autre tuyau a raison de 5 m cube par heures qui peut egalement etre ferme ou ouvert.

    Le but de la demarche est de savoir le nombre d´eau present dans la cuve en temps reel dans tout les cas possibles d´ouverture des vannes. ( ex: les deux vannes sont ouvertes, ou seulement l´une des deux est ouverte, ou aucune ...)

    Voila en vous remerciant (tres) grandement d´avance

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Salut,

    Il doit manquer un paramètre, c'est la quantité d'eau initialement présent dans la cuve.
    Si tu colles le code suivant dans un module VBA, tu pourras appeler directement la fonction GetVolEauSuivantEtatVannesA depuis Excel comme une autre formule.

    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
    Public Enum ETAT_VANNE
        VANNE_OUVERTE = 1
        VANNE_FERMEE = 0
    End Enum
     
    ' Retourne le volume d'eau en m^3 suivant l'état des vannes à une durée après l'ouverture / fermeture des vannes 
    Public Function GetVolEauSuivantEtatVannesA(QEauInitialMCube As Double, _
                             vArrive As ETAT_VANNE, vSortie As ETAT_VANNE, dureeHeure As Double) As Double
        GetVolEauSuivantEtatVannesA = QEauInitialMCube
        If vArrive = VANNE_OUVERTE Then
            GetVolEauSuivantEtatVannesA = GetVolEauSuivantEtatVannesA + 10 * dureeHeure
        End If
        If vSortie = VANNE_OUVERTE Then
            GetVolEauSuivantEtatVannesA = GetVolEauSuivantEtatVannesA - 5 * dureeHeure
            If GetVolEauSuivantEtatVannesA < 0 Then GetVolEauSuivantEtatVannesA = 0
        End If
    End Function

  3. #3
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut probleme excel VBA
    Bonjour bluemonkey,

    Il ne reste à espérer que la cuve est hermétique sinon bonjour les dégats. Mais comme on ne connait pas la capacité de la cuve notre responsabilité est dégagée ...

    Reste à savoir également qui signalera (automatisme ou pas) l'ouverture ou pas des vannes. le demandeur précise en temps réel or je suppose que les gens ne seront pas en permanence devant l'écran pour informer le programme de l'état des vannes.

    Mais l'objet de mon intrusion est tout autre :
    Je connais sub, function, property mais pas public enum. C'est quoi ? C'est la deuxième fois en peu de temps que je vois cette expression sur ce site ? Peut-être étais-tu également l'auteur de la première fois.

    Cordialement.

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Bonjour nibledispo,

    Les Enum permettent de créer un groupe de constantes.
    De cette manière tu peux les retrouver plus facilement à partir du nom que tu as donné au groupe.
    voir FAQ Enum

  5. #5
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut probleme excel VBA code
    re... BlueMonkey

    merci de la réponse. je regarde dès mon retour le lien que tu m'as remis.

    a+

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2013
    Messages : 7
    Par défaut
    Merci grandement de ta réponse ainsi que de sa rapidité blueMonkey !!

    Une derniere petite question, a quoi correspond/sert l'expression " As Double" utilisée dans le code ?

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public Function GetVolEauSuivantEtatVannesA(QEauInitialMCube As Double, _
                             vArrive As ETAT_VANNE, vSortie As ETAT_VANNE, dureeHeure As Double) As Double
    QEauInitialMCube As Double : est le volume d'eau présent initialement dans la cuve.
    dureeHeure As Double : est durée pendant laquelle les vannes sont ouvertes.
    Function GetVolEauSuivantEtatVannesA(...) As Double : veut dire que la fonction renvoi un Double.

    A lire pour te former : Un support de cours complet pour le VBA d'Excel de Jean-Marc RABILLOUD

  8. #8
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut probleme excel VBA code
    bonjour,

    double est l'un des formats des variables numériques.
    ce format accepte les grands nombres décimaux si ma mémoire est bonne.

    les autres formats sont : single, long, double, integer, byte .....

    j'espère que la réponse de blueMonkeye est suffisante pour toi. Comme je le faisais remarquer mi plaisantin mi serieux : si la cuve vide est gérée ce n'est en revanche pas le cas de la cuve qui déborde.

    cordialement.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2013
    Messages : 7
    Par défaut
    Ok merci bien, c´est plus clair la deja !


    Par contre petit soucis, lorsque j´essai d´executer mon code (que j´ai traduit en anglais etant a l´etranger), Excel me dit que le nom: STATE_VAN (ETAT_VANNE) est ambigu. Il ne veut donc pas me l´executer correctement et me souligne en jaune toute cette partie du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ' Retourne le volume d'eau en m^3 suivant l'état des vannes à une durée après l'ouverture / fermeture des vannes 
    Public Function GetVolEauSuivantEtatVannesA(QEauInitialMCube As Double, _
                             vArrive As ETAT_VANNE, vSortie As ETAT_VANNE, dureeHeure As Double) As Double
    J´ai joint en piece jointe mon probleme pour que cela soit plus visuel.
    Fichiers attachés Fichiers attachés

  10. #10
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Bonjour,

    Est-ce que STATE_VAN n'est pas déjà utilisé comme type ailleurs dans le code?
    Est-ce qu'il n'est pas déclaré 2 fois (une fois dans un code de feuille, et une fois sur une autre feuille ou un module ?

    A+

  11. #11
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2013
    Messages : 7
    Par défaut
    Salut,

    Bien vu ! STATE_VAN etait declare 2 fois. Tout marche nickel, mon chef etait contant

    Mais bon du coup, il me demande de compliquer l´affaire

    On garde le meme schema que precedemment avec la cuve et ses deux tuyaux.Mais cette fois on definit un volume initial de 1m cube dans la cuve. La capacite maximale de la cuve est de 5m^ 3 ( mais je crois que cela nous importe peu vu la suite du probleme).

    Ce qu´on souhaite c´est que le volume dans la cuve reste le plus constant possible autour de 2.5M^ 3 sachant que si l´on ouvre la vanne d´entree a son maximum (100%) le debit est de 20M^ 3/h. La vanne de sortie reste toujours ouverte avec un debit de 10M^ 3/h non modulable.

    De plus on souhaite atteindre ce seuil de 2.5 M^ 3 de plus en plus doucement au fur et a mesure que l´on s´y rapproche. Pour cela il y a possibilite de moduler l´ouverture de la vanne d´entree autant que l´on le souhaite ( ex: 50% = 10M^ 3/h ; 0%= 0M^ 3/h ...)

    Pour finir on pourait voir evoluer a l´ecran en permanence toutes les secondes le niveau d´eau qui se trouve dans la cuve

    Des idees de code, ou je peux d´ores et deja pleureur devant mon ecran ?

    En vous remerciant,

  12. #12
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Salut,

    La fonction CalculOuverturePourVanneInput permet de calculer l'état d'ouverture de la vanne d'arrivée
    en % (valeur de 0 à 1) pour maintenir le remplissage de la cuve.

    La fonction GetVolEauSuivantEtatVannesA a été adaptée pour calculer le volume dans la cuve depuis cet état d'ouverture des vannes d'arrivée et de sortie.

    Si depuis Excel tu met des colonnes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    temps ; ouverture vanne arrivé ; ouverture vanne sortie ; Volume dans la cuve;
    ,
    avec ces formules tu pourras représenter graphiquement l'état de remplissage de la cuve en fonction 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
    24
    25
    26
    27
    28
    Const DEBIT_ARRIVE_M3_PER_S As Double = 20
    Const DEBIT_SORTIE_M3_PER_S As Double = 10
    Const REMPLISSAGE_SOUHAITE_M3 As Double = 2.5
     
    ' Retourne le volume d'eau en m^3 suivant l'état des vannes à une durée après l'ouverture / fermeture des vannes
    Public Function GetVolEauSuivantEtatVannesA(QEauInitialMCube As Double, _
                             vArriveOuverture As Double, vSortieOuverture As Double, dureeHeure As Double) As Double
        GetVolEauSuivantEtatVannesA = QEauInitialMCube
        If vArrive = VANNE_OUVERTE Then
            GetVolEauSuivantEtatVannesA = GetVolEauSuivantEtatVannesA + DEBIT_ARRIVE_M3_PER_S * vArriveOuverture * dureeHeure
        End If
        If vSortie = VANNE_OUVERTE Then
            GetVolEauSuivantEtatVannesA = GetVolEauSuivantEtatVannesA - DEBIT_SORTIE_M3_PER_S * vSortieOuverture * dureeHeure
            If GetVolEauSuivantEtatVannesA < 0 Then GetVolEauSuivantEtatVannesA = 0
        End If
    End Function
     
    Public Function CalculOuverturePourVanneInput(QEauCuve As Double, vSortieOuverture As Double) As Double
        CalculOuverturePourVanneInput = (REMPLISSAGE_SOUHAITE_M3 - QEauCuve) / REMPLISSAGE_SOUHAITE_M3
        If vSortie = VANNE_OUVERTE Then
            CalculOuverturePourVanneInput = CalculOuverturePourVanneInput + (vSortieOuverture * DEBIT_SORTIE_M3_PER_S) / DEBIT_ARRIVE_M3_PER_S
        End If
        If CalculOuverturePourVanneInput > 1 Then
            CalculOuverturePourVanneInput = 1
        ElseIf CalculOuverturePourVanneInput < 0 Then
            CalculOuverturePourVanneInput = 0
        End If
    End Function

  13. #13
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2013
    Messages : 7
    Par défaut
    Bonjour,

    Je n´arrive malheureusement pas a obtenir de resultats sous excel. Comme le montre ma piece jointe j´ai realise 6 colonnes:

    Les 4 qui suivent pour lesquelles je rentre les valeurs que je souhaite:

    QEauInitialMCube, VArriveOuverture, VSortieOuverture, dureeHeure.

    Et les 2 suivantes :

    Qeaucuve ( Pour laquelle je rentre ma fonction GetVolEauSuivantEtatVannesA associee aux valeurs QEauInitialMCube;VArriveOuverture;VSortieOuverture;dureeHeure)

    %ouverture vanne arrivee ( pour laquelle je rentre ma fonction CalculOuverturePourVanneInput associe aux valeurs QEauCuve
    vSortieOuverture)


    Comment dois je m´y prendre pour que cela fonctionne ?
    Fichiers attachés Fichiers attachés

  14. #14
    Invité
    Invité(e)
    Par défaut
    bonjour, regarde ça
    Fichiers attachés Fichiers attachés
    • Type de fichier : xls PID.xls (34,5 Ko, 115 affichages)

  15. #15
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Re.

    Sinon pour répondre à base des formules précédentes :
    Dans Excel En première ligne avec ces titres :
    Tps	EtatVIn	     EtatVOut	QEauTotal
    en 2ème ligne létat à Tps=0min :
    0	1	1	1
    en A3 : le temps écoulé en minutes
    en B3 : =CalculOuverturePourVanneInput(D2;C3),
    en C3 : 1 (= vanne toujours ouverte)
    en D3 : =GetVolEauSuivantEtatVannesA(D2;B3;C3;(A3-A2)/60)

  16. #16
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2013
    Messages : 7
    Par défaut
    re,

    Je dois etre la plus grosse cacahouette qui soit en informatique, mais malgre vos reponses , je n´arrive toujours pas a faire fonctionner mon programme. Aucunes valeurs n´apparait au niveau de mes fonctions, uniquement un #NAME?


    J´ai pourtant bien applique dans ma table visual basic le code donne precedemment et suivit a la lettre l´application des titres dans les bonnes cases sous excel...
    Fichiers attachés Fichiers attachés

  17. #17
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Re.

    Tu as ajouté le code posté ici dans un module VBA (pas dans le code d'une feuille) ?

  18. #18
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut probleme excel VBA code
    bonsoir,

    ma contribution sur la base du travail casefayere et ta seconde demande.

    j'aimerai que rdurupt explique le PID que je suis certain d'avoir déjà rencontré dans un code. Cela me conduit à penser qu'il qu'il s'agit d'une méthode de calcul reconnue.

    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
     
    ' version nibledispo : considère la vanne sortie toujours ouverte comme demandé
    ' ce code ne gère pas la vanne arrivée d'eau fermée
    Sub cuve2()
    Const Debit_Arrive_Max As Double = 20
    Const Debit_Sortie As Double = 10
    Const Remplissage_Souhaite As Double = 2.5
    Const QEauInitialMCube = 1
    Const dureeHeure = 0.008 'periode en heure de passage dans boucle (environ 30 s)
    Dim GetVolEau As Double
    Dim temps As Single
    temps = 0
    GetVolEau = QEauInitialMCube
    vanne_ouverte = 1                ' il s'agit de la vanne d'arrivée d'eau
    Do While vanne_ouverte = 1
        If GetVolEau >= 2.5 Then     ' volume d'eau stabilisé dans cuve
          Debit_Arrive = Debit_Sortie
        End If
     
       If GetVolEau < 2.5 And GetVolEau > 1.8 Then
          Debit_Arrive = Debit_Arrive_Max * (Remplissage_Souhaite - GetVolEau) / 0.7 'débit_arrive dégressif de 20 à 12m3
          If Debit_Arrive <= 12 Then Debit_Arrive = 12 ' débit_arrive > debit sortie
          'sinon le volume n'atteind jamais 2.5m3 mais seulement 2.25m3
       End If
     
       If GetVolEau <= 1.8 Then 'debit_arrive max jusqu'à 1.8 m3 (choix arbitraire)
          Debit_Arrive = Debit_Arrive_Max
       End If
       With Sheets("feuil1") 'pour controle visuel
            GetVolEau = GetVolEau + (Debit_Arrive - Debit_Sortie) * dureeHeure
            Cells(1, 2) = Debit_Arrive
            temps = temps + dureeHeure
            Cells(2, 2) = GetVolEau
            Cells(3, 2) = temps + dureeHeure
       End With
    Loop
     
    End Sub
    cordialement.

  19. #19
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Salut,

    Le fichier ci-joint permet de visualiser en temps réel sur un graph le remplissage de la cuve.
    Il est possible de jouer sur les scrollbar pour ajouter le débit de sortie.
    Le débit d'entré en lui ajouté automatiquement avec la macro (mais visible au iveau de la scrollbar).
    Tu peux aussi jouer en temps réel sur la consigne de remplissage de la cuve ou l'état de la vanne de sortie.



    Pour lancer le simulateur, clique sur <Start simulation> sous les graphiques.

    A+
    Fichiers attachés Fichiers attachés

  20. #20
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    La méthode de calcul PID repose sur 3 facteurs :

    Proportionnel : qui ouvre la vanne en fonction du débit (je pompe 1 litre, je verse 1 litre)

    Intégrale : je pompe 10 litres combien te temps me faudra-t-il pour comblé et qu’arriver-t-il si je pompe encor 10 litres je dois remplir le réservoir plus vite qu’il ne ce vide (on ce base sur la vitesse à la quelle ce creuse l’écart entre ce qui est et ce qui dois)

    Dérivé : dépend de la capacité de remplissage, je dois anticiper l’arrêt du remplissage de la cuve pour soit ne pas déborder, ne pas dépasser la consigne, permettre un arrêt en douceur de la vanne.
    C’est le principe du flotteur dans la cuvette des toilettes.

    Logiquement je devrais faire un échantillonnage pour déterminer un indice de pondération pour corriger l’écart entre ce qui est théorique et ce qui est réellement.
    Placer une consigne à 3M3 par exemple en vérifier à intervalle régulier avec un pige le niveau de la cuve.
    L’indice de pondération ce fait en fonction du temps de remplissage et de 2 prise à 82% et 92% de la consigne.
    Ensuite on trouve des abaques pour le calcul PID proprement dit.
    Ce principe on le retrouve dans l’ABS des bagnoles, dans les châteaux d’eau de la Lyonnaise, sur le fauteuil roulant des handicapés….
    Dernière modification par Invité ; 28/06/2013 à 14h29.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/04/2012, 17h43
  2. Probleme avec Checkboxen dans EXcel VBA
    Par mimane_01 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/05/2007, 15h02
  3. [VBA-E]Probleme macro VBA excel 2000 2003
    Par skichatchat dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/04/2007, 21h16
  4. EXCEL/ VBA Erreur sur le code VBA : rediriger l’erreur
    Par hiline6 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 28/12/2006, 16h28
  5. [VBA-E]Probleme dans mon code ??? merci de votre aide
    Par gregantibes dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/04/2006, 18h24

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