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 :

Problème de déclaration de variable [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Août 2017
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2017
    Messages : 363
    Points : 79
    Points
    79
    Par défaut Problème de déclaration de variable
    Bonjour,

    Un problème de déclaration de variable plante (semble t-il) ma procédure.

    Voici un extrait des déclarations ci-dessous (je n'ai indiqué que les variables concernées par le pb) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Recup_donnees_pour_TDB()
     
    'Déclaration des variables
    '
    Dim PO_Date As Variant
    Dim check_PO_Date As String
    Petite précision : La variable "PO_Date" est une date. Elle peut cependant être vide. Au départ j'avais déclaré cette variable comme une date mais du fait de plantages j'ai dû la transformer en Variant.

    Dans mon cas du moment, PO_Date est vide (cellule vide).

    Lorsque j'exécute la macro, à un moment donné, je passe par ce qui est indiqué juste en dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    '
    '------PO_Date------
    '
    check_PO_Date = IsDate(Range("C9").Value)
    If check_PO_Date = "Vrai" Or check_PO_Date = "True" Then
    PO_Date = Range("C9").Value
    MsgBox ("check PO Date VRAI")
    Else
    MsgBox ("check PO Date FAUX")
    PO_Date = ""
    MsgBox ("PO_Date = ") & PO_Date
    End If
    '

    En mode débugage pas à pas j'obtiens :
    check PO Date Faux

    Je clique sur "OK" et j'obtiens :
    PO_Date = (vide)

    Je clique à nouveau sur "OK" et j'obtiens :

    Run time error 13
    Type mismatch.

    Après avoir cliqué sur "debugage" le programme m'affiche les lignes suivantes (ligne avec le "if" en fluo)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    '
    '------PO_Date------La formulation ci-dessous permet d'éviter l'inversion jour / mois
    '
    If IsDate(PO_Date) = "Vrai" Or IsDate(PO_Date) = "True" Then
    Range("E" & y).NumberFormat = ""
    Range("E" & y).Value = CDate(PO_Date)
    Else
    Range("E" & y).Value = PO_Date
    End If
    '
    Je ne comprends pas mon erreur. Pouvez-vous éclairer ma lanterne ? Merci par avance.

    Cdlt.
    Jérôme.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 256
    Points
    34 256
    Par défaut
    Salut,

    la fonction IsDate te retournera True ou False, donc ta ligne de test doit être modifiée de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    check_PO_Date = IsDate(Range("C9").Value)
    If check_PO_Date = "Vrai" Or check_PO_Date = "True" Then
    à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    check_PO_Date = IsDate(Range("C9").Value)
    If check_PO_Date  Then
    voire même

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    check_PO_Date = IsDate(Range("C9").Value)
    If check_PO_Date Then
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If IsDate(Range("C9").Value) Then
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Août 2017
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2017
    Messages : 363
    Points : 79
    Points
    79
    Par défaut
    (Re)bonjour,

    Je ne vois pas de différence entre les deux premières propositions ??

    Quand tu écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    check_PO_Date = IsDate(Range("C9").Value)
    If check_PO_Date  Then
    If check_PO_Date then --> cela signifie t-il "si check_PO_Date est vrai alors" ?

    Cdlt.
    Jérôme.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 760
    Points : 28 618
    Points
    28 618
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Lorsque l'on effectue un test logique comme par exemple ici pour tester si la cellule A2 contient une valeur <>0
    Cela sous-entends
    En VBA c'est pareil comme par exemple pour une variable booléenne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Flag then MsgBox "Test réussi")
    Même chose que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Flag = True then MsgBox "Test réussi")
    pour tester l'inverse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not Flag then MsgBox "Test raté")
    Identique à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Flag = False Then MsgBox "Test raté"
    Alors qu'en faisant ce test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If IsDate(PO_Date) = "Vrai" Or IsDate(PO_Date) = "True" Then
    tu vérifies un texte et pas un booléen. (pour VBA uniquement True ou False et pas de guillemets qui sont réservés aux constantes alphanumériques
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Août 2017
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2017
    Messages : 363
    Points : 79
    Points
    79
    Par défaut
    Re,

    Un grand MERCI pour ces explications très claires. Je teste tout de suite....

    Cdlt.
    Jérôme.

  6. #6
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 256
    Points
    34 256
    Par défaut
    Citation Envoyé par licpegpon Voir le message
    Je ne vois pas de différence entre les deux premières propositions ??
    une erreur de recopie, la premiere des deux était

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If check_PO_Date = True Then
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  7. #7
    Membre régulier
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Août 2017
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2017
    Messages : 363
    Points : 79
    Points
    79
    Par défaut
    Cette modification semble fonctionner. Je m'interroge sur la partie suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    '------Deliv_Target_Date (H6)------
    '
    check_Deliv_Target_Date = IsDate(Range("H6").Value)
    MsgBox ("Deliv_Target_Date = ") & check_Deliv_Target_Date & Range("H6").Value
    If check_Deliv_Target_Date = "Vrai" Or check_Deliv_Target_Date = "True" Then
    Deliv_Target_Date = Range("H6").Value
    MsgBox ("VRAI")
    Else
    MsgBox ("FAUX")
    Deliv_Target_Date = ""
    MsgBox ("Deliv_Target_Date = ") & Deliv_Target_Date
    End If
    Sachant que j'ai mis "17/03/2019" dans la cellule relative à "Deliv_Target_Date" et que la variable "Deliv_Target_Date" est déclarée comme Variant.

    J'obtiens :
    Deliv_Target_Date = True17/03/2019

    Comment expliquer que je n'ai aucun plantage dans ce cas alors que j'ai conservé "If check_Deliv_Target_Date = "Vrai" Or check_Deliv_Target_Date = "True" Then" ??

    Cdlt.
    Jérôme

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 760
    Points : 28 618
    Points
    28 618
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Comment expliquer que je n'ai aucun plantage dans ce cas alors que j'ai conservé "If check_Deliv_Target_Date = "Vrai" Or check_Deliv_Target_Date = "True" Then" ??
    C'est en effet une de ces curiosités du VBA avec la version française d'excel (VRAI et FAUX dans excel sont des valeurs dont VRAI vaut d'ailleurs 1 et FAUX 0) et donc il interprète aussi bien VRAI que True et FAUX que False

    Cependant si tu veux que ton application soit perenne et que tu ne souhaites pas passer des heures de recherche dans plusieurs mois quand tu auras oublié cette discussion, je ne peux que te conseiller de travailler selon les bonnes règles en utilisant True ou False car ta société peut demain t'imposer une version anglaise d'excel ou si tu partages ton programme avec des collègues qui eux ont une version anglaise d'excel et alors les problèmes vont commencer

    De même, il faut bannir la propriété FormulaLocal et utiliser Formula

    Evite aussi autant que possible de déclarer tes variables comme Variant

    C'est toi qui voit
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  9. #9
    Membre régulier
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Août 2017
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2017
    Messages : 363
    Points : 79
    Points
    79
    Par défaut
    OK. Merci beaucoup !!

    Cdlt.
    Jérôme.

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

Discussions similaires

  1. Problème de déclaration de variable
    Par popy67 dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 15/01/2009, 13h09
  2. [Débutant] Problème de déclaration de variable
    Par cagri dans le forum MATLAB
    Réponses: 10
    Dernier message: 13/06/2008, 12h20
  3. Réponses: 2
    Dernier message: 15/11/2007, 15h15
  4. [Configuration] Problème de déclaration de variable en php5
    Par domray dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 11/04/2007, 01h22
  5. Réponses: 8
    Dernier message: 03/11/2006, 15h55

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