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 :

Ismissing() dans une fonction [Toutes versions]


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
    Mai 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 102
    Par défaut Ismissing() dans une fonction
    Bonjour,

    J'ai un Userform qui traite des données, et une partie est traité par une fonction. J'envoie quelques variables, certaines obligatoires, d'autres optionnelles ...
    Voici une partie du code :
    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
    Function CptMag(Lang As String, Mois1 As String, Optional Mois2 As Variant, Optional Mois3 As Variant) ' As String
    Dim TabMois, Retour1, Retour2, Preposition, Liaison, MoisStop, MoisFact As String
     
    'Gestion du nbre de mois
    ReDim NumMois(0)
    NumMois(0) = ExtractionMois(Mois1)
     
    If Not IsMissing(Mois2) And (ExtractionMois(Mois2) <> NumMois(0)) Then
            ReDim Preserve NumMois(1)
            NumMois(1) = ExtractionMois(Mois2)
     
    If Not IsMissing(Mois3) And (ExtractionMois(Mois3) <> NumMois(0)) And (ExtractionMois(Mois3) <> NumMois(1)) Then
            ReDim Preserve NumMois(2)
            NumMois(2) = ExtractionMois(Mois3)
            End If
    End If
    La fonction Extraction() extrait simplement le mois d'une date.

    LE principe, c'est de placer le mois de la date "Mois1" dans Nummois(0)
    Ensuite, je veux tester si "Mois2" existe, et si oui, tester si le moi est le meme que précedemment ou non ...

    Bref, la théorie est simple ...
    ... mais ca ne marche pas !
    Meme si je ne transmet pas mois2 dans la function, le IF est a True quand meme ...
    Quelqu'un pourrait m'aider ???


    PS : je joins le fichier, la fonction se trouve dans le "module1"
    Fichiers attachés Fichiers attachés

  2. #2
    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
    Par défaut
    Bonsoir,

    Je n'ouvre jamais de fichier xls que je n'ai pas écrit moi-même (je n'ai donc pas regardé le tien...)

    J'ai vu ton bout de code et m'en contente donc.

    Tu peux rigoler et éviter tes redim Preserve, ainsi (exemple)
    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
     
    Private Sub Command1_Click()
     CptMag "F", "01/01/2001", "01/03/2001", "01/05/2001"   ' fais varier tes cas comme tu l'entends et constate
    End Sub
    Function CptMag(Lang As String, Mois1 As String, Optional mois2 As Variant, Optional Mois3 As Variant) As String
      Dim TabMois, Retour1, Retour2, Preposition, Liaison, MoisStop, MoisFact As String
      Dim toto As Integer
      toto = Abs(Not IsMissing(mois2)) + Abs(Not IsMissing(Mois3))
      If toto Then toto = toto - (Abs(extractionMois(Mois1) = extractionMois(mois2)) * 2)
      If toto = 2 Then toto = toto - Abs(extractionMois(mois2) = extractionMois(Mois3))
      ReDim nummois(toto)
      nummois(0) = extractionMois(Mois1)
      If toto >= 1 Then nummois(1) = extractionMois(mois2)
      If toto = 2 Then nummois(2) = extractionMois(Mois3)
     
      '--------------Juste pour vérifier, maintenant
      Dim i As Integer
      For i = 0 To UBound(nummois)
        MsgBox nummois(i)
      Next
    End Function
    Private Function extractionMois(m As Variant) As String
     extractionMois = Month(m)
    End Function
    Rigolo, non ?

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 102
    Par défaut
    Salut Ucfoutu,

    Soyons honnête, je n'ai pas compris le raisonnement de ton code pour l'instant, mais je me penche dessus ce soir ...
    Mais en tout cas ca marche !!
    !!!

    Je reviens dessus, ca m'intrigue un peu trop ...
    Ce que je ne comprends pas, c'est ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If toto Then toto = toto - (Abs(extractionMois(Mois1) = extractionMois(mois2)) * 2)
    Comment est-ce possible d'avoir 2 signe "=" ? En fait que signifie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    toto = toto - (Abs(extractionMois(Mois1) = extractionMois(mois2)) * 2)
    Rigolo ? Oui, mais je comprends pas bien la blague ;-)

  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
    Par défaut
    Laisse...

    Je me sens le courage de me lancer dans une explication concernant les deux signes = (ça va encore), mais je me vois mal me lancer dans un roman concernant le pourquoi du comment de la multiplication par 2 (qui correspond à ta démarche de ne continuer que si Mois2 est à la fois présent et d'un mois différent de Mois1 et de sauter ton 2ème If dans le cas contraire).

    Il s'agit là moins de la connaissance de VB que d'une démarche de l'esprit ...

    Bonne journée.

  5. #5
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    je me permet d'intervenir, pour tenter une petite explication qui me permettra au passage de vérifier mes propres connaissances
    (et surtout en profiter pour dire "rigolo? oui très", j'apprécie toujours autant cette façon de traiter les test booléen a l'aide de petit calcule mathématique)

    Pour les comprendre quelque clée

    faux <=> 0
    (ca tu doit le savoir)
    vrai <=> 1 ou -1 ou tout ce qui n'est pas 0 en fait
    En VBA j'obtiens à chaque fois -1 d'où les valeurs absolue sans doute

    Par exemple
    c= a et b
    devient
    c= a*b
    Pour les formule plus compliqué je te conseille de te faire les table de vérité (si je me souvient bien cela s'appelle ainsi)
    tu test avec les différente combinaison possible de 1 et de 0 a l'entré et tu calcule la sortie

    Pour comprendre le double =
    essaye ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    dim a as boolean
    msgbox 1+1=3
    msgbox 1+2=3
    'maintenant
    a=(1+1=3)
    msgbox a
    a=1+2=3
    msgbox a
    Maintenant remplacepar Tu peux maintenant envisager le triple =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = (1 + 1 = 2) * (2 + 2 = 4)
    un quadrule, quintuple,... un chiliotuple sera peut être mme
    (a=b) est un test qui renvoie soit vrai soit faux, a partir de la tu peux t'amuser avec autant que tu le souhaite


    Après faut se coltiner un peu de logique et bien bidouiller ca dans ca tête, après un ou de café peut être même une ou deux aspirines, tu verra que ca tourne très bien. (je suppose je n'ai pas le temps de m'y attaquer en profondeur, et je n'ai même pas de café pour m'aider)

    Comme souvent ton meilleur allié est un fichier vierge pour faire tous les tests possible et imaginable, afin de comprendre le pourquoi du comment

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 102
    Par défaut
    Salut Krovax,

    C'est un art de maitriser un domaine, c'en est un autre de l'expliquer !
    Merci à toi de maitriser ces deux arts !
    J'ai immédiatement compris grâce à ton explication, alors que j'aurais galéré peut-être longtemps sans !!!

    Un grand !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recuperation de formulaire dans une fonction
    Par arsgunner dans le forum ASP
    Réponses: 5
    Dernier message: 23/06/2004, 15h04
  2. Transmission d'un objet crée dans une fonction
    Par EvilAngel dans le forum ASP
    Réponses: 2
    Dernier message: 10/05/2004, 20h19
  3. Utilisez MinimizeName() dans une fonction
    Par James_ dans le forum C++Builder
    Réponses: 7
    Dernier message: 07/05/2004, 18h05
  4. [Postgresql]Connecter à une autre base dans une fonction
    Par alex2205 dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/05/2003, 11h30
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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