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 :

VBA - Condition If non parcouru


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2014
    Messages : 12
    Points : 5
    Points
    5
    Par défaut VBA - Condition If non parcouru
    Bonjour ami développeur,

    je réclame votre assistance car j'ai un souci avec un programme et une condition if non parcouru a l'intérieur de deux boucles for, ma valeur n vaut 3 et dès la première boucle, alors que j est bien égale a 3, la première condition n'est pas parcouru et va directement a la condition else, ce qui provoque bien entendu une erreur car la valeur Euro(1,4) ne doit pas exister. Voyez vous une erreur logique que j'aurai faite qui causerai cette erreur ??

    Merci d'avance a vous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    For j = n To 0 Step -1
        For i = 1 To j + 1
            If j = n Then
                Euro(i, j) = Application.WorksheetFunction.Max(optType * (Stk(i, j) - K), 0)
            Else
                Euro(i, j) = (p * Euro(i, j + 1) + (1 - p) * Euro(i + 1, j + 1)) * act
            End If
        Next i
    Next j

  2. #2
    Membre expérimenté Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 903
    Points : 1 364
    Points
    1 364
    Par défaut
    Bonjour,

    Là comme cela, il devrait passer dans la condition mais, comme on n'a pas d'informations sur le type de variables que tu utilises, ce n'est pas une certitude.
    Je suppose que i,j et n sont déclarés en tant qu'integer ou de type long ?

    Cordialement,
    Le sabre est une arme. Le kendo est un art de tuer. Quelles que soient les belles paroles pour l'expliquer, telle est sa vérité.

  3. #3
    Membre éprouvé
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Points : 1 124
    Points
    1 124
    Par défaut
    Bonjour Rsane,
    Quelle est la valeur de i lorsque j=3?
    Lorsque j=3 il faut que i soit compris entre 1 et 4, si i est en dehors de cette plage tu ne rentreras pas dans la boucle, si je ne me trompe pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For j = n To 0 Step -1
        For i = 1 To j + 1
    Eric
    "Vous n’avez cessé d’essayer ? Vous n’avez cessé d’échouer ? Aucune importance !
    Réessayez, échouez encore, échouez mieux." Samuel Beckett
    Pensez aux balises et
    Visitez les FAQ Excel et allez faire un tour ici
    Tutoriels de SilkyRoad

  4. #4
    Membre expérimenté Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 903
    Points : 1 364
    Points
    1 364
    Par défaut
    Lorsque j=3 il faut que i soit compris entre 1 et 4, si i est en dehors de cette plage tu ne rentreras pas dans la boucle.
    Euh... Ce n'est pas ce que fait déjà sa boucle ?
    Cordialement,
    Le sabre est une arme. Le kendo est un art de tuer. Quelles que soient les belles paroles pour l'expliquer, telle est sa vérité.

  5. #5
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 803
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 803
    Points : 32 058
    Points
    32 058
    Par défaut
    +1 avec Gado2600 : toute seule, la boucle me parait honnête. Ce sont donc des choses extérieurs qui provoquent le dysfonctionnement.

    Idéalement, toutes les variables, i, j, n, sont entières, et du même type(genre long pour être tranquille, même si integer convient aussi dans ce cas).

    Après, tu peux mettre un debug.print i & " " & j & " " & n juste avant le If. Histoire de voir si ça tourne bien comme tu veux dans la fenêtre de debug. Normalement, tu auras 40 lignes, et n toujours à 3. Une cause possible de souci, c'est si les traitements changent la valeur de n. Ca donne des résultats fort imprévisibles.
    Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
    1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
    2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
    3)le temps de comprendre toutes les exigences, le projet est terminé
    4)le temps de terminer le projet, les exigences ont changé
    Et le serment de non-allégiance :
    Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2014
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Je vais appliquez vos conseilles et voir ce que ca donne, en attendant voici le fichier en pièce jointe

    EDIT: je n'avais pas défini i et j comme des entiers mais laissé comme des variant... en rajoutant Dim i as integer, j as integer ca marche... Maintenant ma question c'est pourquoi cela n'a pas fonctionné en étant des variant ?
    Fichiers attachés Fichiers attachés

  7. #7
    Membre éprouvé
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Points : 1 124
    Points
    1 124
    Par défaut
    Bonjour,
    Gado a raison je me suis avancé un peu vite.
    Il faut, comme vous l'indiquez tous les deux, que i, j et n soient du même type.
    Il faudrait savoir aussi quelles sont les valeurs du couple Euro(i,j) autorisées car
    la valeur Euro(1,4) ne doit pas exister
    Si c'est la seule valeur interdite il faudrait écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If j<>n And j <> 4 Then ' lorsque i sera égal à 1 le couple interdit ne sera pas autorisé non plus
    Eric
    "Vous n’avez cessé d’essayer ? Vous n’avez cessé d’échouer ? Aucune importance !
    Réessayez, échouez encore, échouez mieux." Samuel Beckett
    Pensez aux balises et
    Visitez les FAQ Excel et allez faire un tour ici
    Tutoriels de SilkyRoad

  8. #8
    Membre expérimenté Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 903
    Points : 1 364
    Points
    1 364
    Par défaut
    EDIT: je n'avais pas défini i et j comme des entiers mais laissé comme des variant... en rajoutant Dim i as integer, j as integer ca marche... Maintenant ma question c'est pourquoi cela n'a pas fonctionné en étant des variant ?
    Le type variant regroupe tout un tas de type d'objets (les integer, les longs, double, string...), comme le type object mais il y a une différence entre les deux, cependant, je ne sais plus laquelle...
    Bref, tes variables pouvaient être n'importe quoi comme du string. Il fait en général, dans ton cas, un comparatif sous ce format, à mon avis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If j = n Then
    => if "3" = 3 then
    Le j devait être de type string lors de la comparaison, du texte VS du numérique, ce n'est pas bon pour lui.

    Cordialement,
    Le sabre est une arme. Le kendo est un art de tuer. Quelles que soient les belles paroles pour l'expliquer, telle est sa vérité.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2014
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Pourtant dès le debut de mon code je fais une opération mathématique avec mon : dt = T / n et cela ne posait pas de problème... Donc en cours de route le n a commencé a poser pb ??

  10. #10
    Membre expérimenté Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 903
    Points : 1 364
    Points
    1 364
    Par défaut
    Non, pas forcément.
    Il ne s'agit pas d'un problème, au niveau VBA, de calculs mais de comparaisons. En effet, tu utilises un type variant.

    Par exemple, si tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dim a as integer
    dim b as double
    a = 10
    b = 10
    a / b te renverra 1 mais a = b ne sera pas vrai car il verra b = 10.0 et non 10 alors que sur le papier, ce sont les mêmes valeurs. La même chose si b est de type variant
    C'est une conclusion que j'ai déduis suite à un problème que j'avais eu quand j'ai commencé le VBA.

    Utilises des fonctions VBA du type cdbl(a) ou cint(a) par exemple. Pour les comparaisons, c'est pas mal (plus de détails avec la touche F1 sur la fonction).
    De plus, pour t'aider à bien visualiser le soucis, en mode pas-à-pas, exécute ton code et regarde (en plaçant ta souris sur tes variables, tu as leurs valeurs) ce que tu as dans tes variables.
    Le sabre est une arme. Le kendo est un art de tuer. Quelles que soient les belles paroles pour l'expliquer, telle est sa vérité.

  11. #11
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 803
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 803
    Points : 32 058
    Points
    32 058
    Par défaut
    Citation Envoyé par Gado2600 Voir le message
    Le type variant regroupe tout un tas de type d'objets (les integer, les longs, double, string...), comme le type object mais il y a une différence entre les deux, cependant, je ne sais plus laquelle...
    de mémoire, integer, long ou string ne sont PAS des objets. Variant, c'est un objet...ou autre chose, même un string ou un currency. Object garantit qu'on a un objet(et donc on est obligé de faire un set). Variant, c'est vraiment tout et n'importe quoi, du pur typage dynamique.

    Sinon, c'est une bonne pratique de se forcer à faire une option explicit. (dans l'éditeur VB - outils - options - déclaration des variables obligatoires). ça évite ce genre de mauvaises surprises. Variant, c'est reservé à des cas ou on SAIT qu'on aura des choses variées dans la variable. Si, par définition, c'est un chiffre, il faut se forcer à mettre un long ou un integer. Sinon, de loin en loin, on a une mauvaise surprise...
    Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
    1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
    2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
    3)le temps de comprendre toutes les exigences, le projet est terminé
    4)le temps de terminer le projet, les exigences ont changé
    Et le serment de non-allégiance :
    Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.

Discussions similaires

  1. [VBA-E]Contrôles non visibles
    Par Pollux dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 07/02/2006, 14h17
  2. [VBA][Excel]CheckBox non editable
    Par Pollux dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 10/01/2006, 10h03
  3. [VBA] Conditions
    Par Virgile59 dans le forum Access
    Réponses: 2
    Dernier message: 14/10/2005, 15h38
  4. [VBA] Condition d'ouverture d'état
    Par Virgile59 dans le forum Access
    Réponses: 1
    Dernier message: 14/10/2005, 11h26
  5. [VBA] Condition - opérateurs logiques
    Par Virgile59 dans le forum Access
    Réponses: 6
    Dernier message: 07/10/2005, 10h22

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