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 :

Comparaison de temps avec TimeValue [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2002
    Messages : 329
    Par défaut Comparaison de temps avec TimeValue
    Bonjour,

    Je tente de comparer deux temps pour en extraire le plus petit mais l'erreur "Type d'argument ByRef incompatible" apparait !

    Voici le code utilisé :
    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
    'Minimum
    Function Minimum(a As Date, b As Date) As Date
        If (a > b) Then
            Minimum = b
        Else
            Minimum = a
        End If
    End Function
    
    Dim h_ini, h_fin As Date
        h_ini = TimeValue("12:00:00")
        h_fin = TimeValue("08:00:00")
    
        Debug.Print "Minimum : " & Minimum(h_ini, h_fin)     <----- Erreur ici !
    Je ne comprends pas le problème.
    Quelqu'un peut m'aiguiller ?

    Merci

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 684
    Par défaut
    Bonjour,

    une des premieres notions a apprendre quand aux declarations de variable :
    - utiliser dans la mesure du possible un type precis
    - dans le cas d'une multi declaration de variable, chaque variable doit avoir un type, sinon la variable sera de type Variant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim h_ini, h_fin As Date
    et ici h_ini est un Variant

    La syntaxe correcte est la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim h_ini As Date, h_fin As Date
    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 :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel (3e édition)
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    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 Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Bonjour,

    Tu as un problème dans la déclaration de tes variables.
    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim h_ini, h_fin As Date
    h_ini n'est pas de type Date (Variant en fait)

    Tu dois utiliser la syntaxe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim h_ini As Date, h_fin As Date
    Edit :
    Trop lent

  4. #4
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2002
    Messages : 329
    Par défaut
    Bonjour,

    En effet !

    Merci beaucoup !

    Bonne journée

  5. #5
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    également, quand tu crées des paramètres au sein d'une fonction (ou d'une procédure), les arguments sont par défaut passés Par Référence (ByRef), c'est à dire que la procédure travaille directement sur la vraie variable, et peut donc en modifier la valeur intiale.
    si tes arguments n'ont pas vocation à être modifiés (ce qui est le cas ici, ils sont simplement comparés), il faut prendre la bonne habitude de préciser qu'on travaille sur une copie de ces variables, on passe l'argument Par Valeur (ByVal)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function MaFonction(ByVal MaDate1 As Date, ByVal MaDate2 As Date) As Date
    au passage, cette fonction est peu utile, puisqu'une unique ligne de code peut te donner le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub ee()
    Dim h_ini As Date, h_fin As Date
        h_ini = TimeValue("12:00:00")
        h_fin = TimeValue("05:30:00")
        MsgBox Format(Application.WorksheetFunction.Min(h_ini, h_fin), "hh:mm:ss")
    End Sub
    en revanche, si tu dois réaliser cette opération dans des tonnes de procédures, effectivement la Function devient pertinente, mais au moins tu as ici une autre méthode pour réduire ta Function à une unique ligne de code

    la version directe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub ee()
        MsgBox Format(Application.WorksheetFunction.Min(TimeValue("12:00:00"), TimeValue("05:30:00")), "hh:mm:ss")
    End Sub

  6. #6
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2002
    Messages : 329
    Par défaut
    Bonjour joe.levrai

    Ces précisions sont vraiment sympas et précieuses.

    Merci

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

Discussions similaires

  1. [XL-2007] Erreur comparaison de temps avec timevalue
    Par isfet dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/08/2010, 13h59
  2. [MySQL] probleme requete avec comparaison du temps ecoule
    Par arnogef dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 24/11/2006, 21h11
  3. Comment lancer 2 serveur X en même temps avec Xorg ?
    Par narmataru dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 10/01/2006, 19h55
  4. Réponses: 8
    Dernier message: 21/11/2005, 07h59
  5. [DEBUTANT]comparaison une ligne avec un STRing
    Par Battosaiii dans le forum Langage
    Réponses: 2
    Dernier message: 05/05/2005, 21h15

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