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-E] - Probleme sur un test conditionnel


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 26
    Points
    26
    Par défaut [VBA-E] - Probleme sur un test conditionnel
    Bonjour,
    j'ai un nouveau probleme sur un des tests conditionnel
    J'ai ecris 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
    Sub Logik_Compal()
     
    Dim MyCell As Range
    Dim AKNQty As Double
    Dim CurrentWeek As Integer
    CurrentWeek = DatePart("ww", Now(), 2)
    AKNQty = 0
     
        For Each MyCell In Range("A1:A60000")
            If MyCell.Value = "United Kingdom" _
               And MyCell.Offset(0, 1).Value = "COMPAL" _
                And MyCell.Offset(0, 2).Value = "WIP" _
                And IsDate(MyCell.Offset(0, 3).Value) = True _
                And CurrentWeek = DatePart("ww", MyCell.Offset(0, 3), 2) Then
                AKNQty = AKNQty + MyCell.Offset(0, 4).Value
            End If
            Next MyCell
            Range("H3").Value = AKNQty
     
    End Sub
    Le code compile mais lorsque je la lance, Excel affiche une erreur de type 13 "mismatch".
    J'ai pu mettre en evidence que c'est la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    And CurrentWeek = DatePart("ww", MyCell.Offset(0, 3), 2) Then
    qui pose probleme car en l'enlevant la macro marche nikel.
    Mais je dois sommer les quantites des commandes de la semaine en cours donc je ne peux me passer de cette condition.
    Je me suis servi de DatePart comme vous me l'avez conseille. C'est vraiment curieux car sur 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
    Sub Wk_COMPAL()
    Dim CurrentWeek As Integer
    Dim MyCell As Range
    Dim AKNQty As Double
    Set MyCell = Range("C4")
        CurrentWeek = DatePart("ww", Now(), 2)
         Range("C1").Select
           If DatePart("ww", MyCell.Offset(0, 1), 2) = CurrentWeek Then
                Range("A15").Value = "D4 est en semaine en cours"
                Else
                Range("A15").Value = "D4 : Pas semaine en cours"
            End If
            Range("A16").Value = DatePart("ww", MyCell.Offset(0, 1), 2)
    La comparaison se fait tres bien entre la Cell D4 et la semaine en cours, la macro tourne nikel!
    Ya vraiment kelkechose qui mechappe.

    Merci d'avance a la fine equipe de ce site tres reactif.

  2. #2
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Est-ce que, au moment de l'erreur, MyCell.Offset(0, 3) contient bien une date?
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    Je ne sais pas comment savoir si au moment de l'erreur MyCell.Offset(0, 3) contient une date: je ne sais pas ou la macro se stoppe pendant la boucle for.Desole...
    De plus, je viens de voir quelquechose de vraiment incomprehensible parce que si je change
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    And CurrentWeek = DatePart("ww", MyCell.Offset(0, 3), 2) Then
    en par example
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    And CurrentWeek = DatePart("ww", MyCell.Offset(0, 33), 2) Then
    la macro ne me met pas une error type 13 elle semble tourner...

  4. #4
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Utilises-tu les différentes fenêtres de l'interface VBE?
    Les plus intéressantes sont:
    La fenêtre Exécution
    Les Espions
    Les Variables locales

    Tu peux, par exemple, ajouter ces 2 espions
    MyCell.Offset(0, 3).Address
    et
    MyCell.Offset(0, 3).Value

    Ca te permettra de voir, en pas-à-pas l'adresse et le contenu de la cellule pointée par ton offset.

    Si tu ne veux pas placer des espions et pouvoir faire tourner ton code sans l'interrompre, tu peux placer 2 Debug.Print dans ton code et lire le résultat dans la fenêtre Exécution.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    Oui j'utilise parfois la fenetre Locals Window mais les pas autres que tu as cite.
    Je vais chercher comment mettre des espions comme tu me conseilles et je te tiens au courant si je trouve ou pas.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    D'accord j'ai utilise les espions que tu m'as dis.
    Alors, la macro plante des la premiere ligne avec :
    MyCell.Offset(0, 3).Address Value : $D$1 Type: String
    MyCell.Offset(0, 3).Value Value: "Date expedition" Type: Variant/String

    Voila,voila je sais pas si ca peut t'aider moi j'y vois pas forcement plus clair.

  7. #7
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Tu peux écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Debug.Print MyCell.Offset(0, 3).Address
    Debug.Print MyCell.Offset(0, 3).Value
    juste avant ton If MyCell...

    Tu récupères le résultat dans la fenêtre "Immediate Window", si tu travailles sur un Excel en Anglais.
    Pour afficher cette fenêtre par un raccourci, c'est Ctrl + G.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  8. #8
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    Les resultats donnes par debug.print sont bien les meme que j'ai obtenu avec les espions ( que j'ai donne un peu avant ).
    Debug.Print MyCell.Offset(0, 3).Address donne : $D$1
    Debug.Print MyCell.Offset(0, 3).Value donne : Date expedition

    C'est tout a fait coherent : la colonne est bien la D, je demarre la boucle en ligne1, et la valeur de D1 est bien "Date expedition" qui est l'intitule de la colonne sur laquelle je souhaite effectivement faire le test par rapport a la semaine en cours.
    Le mystere est pourquoi la macro s'arrete des cette 1ere ligne.
    Merci d'avance.

  9. #9
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    J'ai pas tout suivi, mais a priori tu as un problème avec des dates et qu'il econnait pas ta date. Or ta première contient des titres..Ce n'est pas une date non ? essaye peut etre de ocmmancer à la deuxième ligne ton test conditionnel ?
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  10. #10
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    Effectivement cela n'est pas une date et c'est pour cela que je realise le test suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    And IsDate(MyCell.Offset(0, 3).Value) = True _
    Ce test n'est pas celui qui plante la macro ( du moins je pense )mais c'est le suivant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    And CurrentWeek = DatePart("ww", MyCell.Offset(0, 3), 2)
    En faisant demarrer la boucle for a la 2ieme ligne le bug survient a la 8ieme ligne car la 2ieme est vide, et jusqua la 7ieme(incluse) on des dates mais a la 8ieme on a un #N/A(du a un VLOOKUP qui ne peut se faire ce qui traduit que la commande na pas ete recu ce qui en fait une donnee importante et exploite par l'entreprise .)

  11. #11
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Si tu as une erreur c'est normal que ça plante, car VBA ne reconnait pa sles valeurs et ça fait planter

    Tu fais un VlookUp ou une rechercheV a la main ?

    Dans le 2 cas, de toute façon avant de lancer cette macro la, il faut que tu fasse une gestion d'erreur. Par exemple si tu as écrit ta rechercheV a la main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(ESTERREUR(RECHERCHEV(...);"";RECHERCHEV(...))
    A toi de compléter comme tu le dois

    Si tu le fait par macro, rejoins la meme idée
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  12. #12
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    Je comprends pas quand tu dis que VBA ne reconnait pas les valeurs.
    Dans la colonne que je parcours, je peux avoir du texte, des dates ou un #N/A du a un recherche V qui n'a pas trouve la cellule cible.
    Je veux faire un test sur les cells de la colonne qui sont au format date et dont cette fameuse date est dans la semaine en cours.

    Dans l'esprit c'est simple mais ca fait 1 journee que je suis bloque.

  13. #13
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Il faut que tu enlève ces #N/A c'est ça que je te dit. Si tu parcoure des cellules ou il y a des N/A, la macro va planter car en prenant la valeur de la cellule il va voir une erreur et la macro va s'arreter. Me demande pas pourquoi j'en sais rien mais c'est comme ça et ça m'est arrivé pour ça que je dis ça
    Quand ça m'est arrivé j'ai remplacé les #N/A par rien et après ma macro remarchait correctement
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  14. #14
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    D'accord,
    dans ces cas la c'est foutu je peux pas toucher aux #N/A.
    Cette donnee est utilisee par d'autres services que le mien.
    J'ai reussi dans un autre code a gere les #N/A dans une boucle for en les detectant avec la fonction IsError().
    Je peux peut etre m'en servir en plus du IsDate pour que ma mcro ne plante pas quand elle va tomber dessus?
    Par contre je pourrai pas eviter qu'elle tombe sur une chaine de carac.
    C'est quans meme pas possible qu'a cause de #N/A je doive arreter.
    Je vais peter un plomb je sens.

  15. #15
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    je n'ai pas tout lu mais si tu mets tes deux tests dans le même "if", normal que tu plantes si not isdate. Sépare tes deux tests
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If isdate(MyCell.Offset(0, 3).Value) Then
          If CurrentWeek = DatePart("ww", MyCell.Offset(0, 3), 2) Then

  16. #16
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    T'es vraiment solide Ouskel.
    Je venais de voir qu'en changeant mes And en If ca passait mais ca prend un temps fou.
    J'ai donc pense que c'etait le 2ieme sur la meme Cell.
    Je vais tester je te tiens au courant.
    Merci.
    Et apres les etoiles c'est un maudit If qui me bloque 1 journee!

  17. #17
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Dans certains cas, on a intérêt à passer par un boolean. Plutôt qu'avoir à aligner les ifs, je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim ok as boolean
    ok = isdate(MyCell.Offset(0, 3).Value)
    ok = ok and CurrentWeek = DatePart("ww", MyCell.Offset(0, 3), 2)
    ok = ok and ....
    ok = ok and not ....
    if ok then
    Juste pour indication si ça peut te simplifier la vie

  18. #18
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    Effectivement cela etait bien le probleme.
    La macro tourne correctement.
    Merci bien

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

Discussions similaires

  1. Probleme sur les structures conditionnelles
    Par minus1992 dans le forum Général Python
    Réponses: 3
    Dernier message: 25/02/2015, 08h24
  2. {VBA Excel}Probleme sur macro mauvaise lecture de feuille excel
    Par Thomas69 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/08/2007, 15h38
  3. [VBA-E] Probleme sur création menu
    Par norkmassiv dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 08/12/2006, 17h12
  4. [XSLT] Problème sur le test du if
    Par *alexandre* dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 06/12/2006, 16h26
  5. [VBA excel] Probleme sur bouton commande
    Par RedBurn dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 22/11/2005, 10h10

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