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 :

FUNCTION provoque #VALEUR! sur une cellule


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 : 51
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2002
    Messages : 329
    Par défaut FUNCTION provoque #VALEUR! sur une cellule
    Bonjour,

    Le retour de la fonction suivante m'indique l'erreur #VALEUR! dans la cellule où elle s'applique.
    Son objectif est de donner le nombre de jours de lundi ou mardi ou ...vendredi (via numjour) comprise entre deux dates

    Par exemple en A1: 01/01/2013
    en A2 : 10/01/2013
    en A3 : =HP_nbjours(A1;A3;A4)


    La fonction est :
    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
     
    Function HP_nbjours(DateDebut As Date, DateFin As Date, Numjour as integer) As Long
        Dim n As Integer, i As Integer
     
        With Application
            n = 0
            For i = DateDebut To DateFin
                With .WorksheetFunction
                  If (.Weekday(i, 2) = NumJour And .Weekday(i, 2) <= 5 Then
                        n = n + 1
                   End If
                End With
            Next i
     
        End With
        End If
        HP_nbjours = n
    End Function
    Merci pour vos commentaires

  2. #2
    Membre éclairé
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 479
    Par défaut
    Hello

    En A3 tu mets ta fonction. Et tu appelles en parametre le range de ta fonction?

    Ensuite tu fais une boucle en déclarant i comme integer et tu boucles sur des dates que tu as déclarés.
    Tu as comme variables parametrés de ta fonction des dates ... et tu rentres des Range?
    Je pense que tu as un problème de déclaration de variables..
    Que veux tu faire calculer le Nb de jours entre 2 dates ?

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2002
    Messages : 329
    Par défaut
    Je te remercie.

    Voici la fonction corrigé qui fonctionne !
    Beaucoup trop d'erreur d'inattention de ma part.

    Le but de la fonction est de donner le nombre de lundi (numjour=1), mardi(numjour=2), ..., vendredi(numjour=5) compris entre deux dates en excluant les jours fériés répertoriés dans une plage nommée.
    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
    Function HP_nbjours(DateDebut As Range, DateFin As Range, NumJour As Integer, JoursFériés As Object)
        Dim n As Integer, i As Date
     
        With Application
            n = 0
            For i = CDate(DateDebut) To CDate(DateFin)
                'With .WorksheetFunction
                 '   If (.Weekday(i, 2) = NumJour And .Weekday(i, 2) <= 5 And .CountIf(JoursFériés, i) = 0) Then
                        n = n + 1
                  '  End If
               ' End With
            Next i
     
        End With
        'End If
        HP_nbjours = n
    End Function

  4. #4
    Membre éclairé
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 479
    Par défaut
    Je ne sais pas si cela fonctionne ce que tu as fait car tu déclares beaucoup de paramètre sde ta fonction que tu n'utilises pas ???

    Jours feriés as object ???
    Tu veux le nombre de jours de semaine d'un jour precis ( Lundi/Mardi) hors feries entre 2 dates ?
    Les jours féries sont calculables... 2 types de fériés ceux qui dependent du jour de paques ( que l'on peut calculer). ET ceux à dates fixes.

    Ci dessous je te mets ma fonction qui calcule le jour de paques selon l'année :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    Private Function DatePaques(ByVal annee As Integer) As Date ' Algorithme de Oudin
    Dim G As Integer
    Dim C As Integer
    Dim C_4 As Integer
    Dim E As Integer
    Dim H As Integer
    Dim K As Integer
    Dim P As Integer
    Dim Q As Integer
    Dim I As Integer
    Dim B As Integer
    Dim J1 As Integer
    Dim J2 As Integer
    Dim r As Integer
    Dim mois As Integer
    Dim jour As Integer
     
    G = annee Mod 19
    C = annee \ 100
    C_4 = C \ 4
    E = (8 * C + 13) \ 25
    H = (19 * G + C - C_4 - E + 15) Mod 30
    K = H \ 28
    P = 29 \ (H + 1)
    Q = (21 - G) \ 11
    I = (K * P * Q - 1) * K + H
    B = annee \ 4 + annee
    J1 = B + I + 2 + C_4 - C
    J2 = J1 Mod 7
    r = 28 + I - J2
    jour = r
    mois = 3
     
    If r > 31 Then
        jour = r - 31
        mois = 4
    End If
     
     
     
    DatePaques = DateSerial(annee, mois, jour)
     
     
    End Function
    Ceci est ma fonction qui te renvoi si le jour est ferié ou non ( Ferié du Lux à remplacer par ceux de ton pays).


    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
    Public Function dateferie(ByVal DT As Date) As Boolean
    Dim annee As Integer
    annee = Year(DT)
     
    If (DT = DateAdd("d", 1, (DatePaques(annee)))) Or (DT = DateAdd("d", 39, (DatePaques(annee)))) Or (DT = DateAdd("d", 50, (DatePaques(annee)))) Then
        dateferie = True
    End If
     
     
    If (DT = DateSerial(annee, 1, 1)) Or (DT = DateSerial(annee, 5, 1)) Or (DT = DateSerial(annee, 6, 23)) Or (DT = DateSerial(annee, 8, 15)) Or (DT = DateSerial(annee, 11, 1)) Or (DT = DateSerial(annee, 12, 25)) Or (DT = DateSerial(annee, 12, 26)) Then
        dateferie = True
    End If
     
     
    End Function
    Solution complete
    Le lundi étant le jour N°1


    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    Option Explicit
     
    Public Function DatePaques(ByVal annee As Integer) As Date ' Algorithme de Oudin
    Dim G As Integer
    Dim C As Integer
    Dim C_4 As Integer
    Dim E As Integer
    Dim H As Integer
    Dim K As Integer
    Dim P As Integer
    Dim Q As Integer
    Dim i As Integer
    Dim B As Integer
    Dim J1 As Integer
    Dim J2 As Integer
    Dim r As Integer
    Dim mois As Integer
    Dim jour As Integer
     
    G = annee Mod 19
    C = annee \ 100
    C_4 = C \ 4
    E = (8 * C + 13) \ 25
    H = (19 * G + C - C_4 - E + 15) Mod 30
    K = H \ 28
    P = 29 \ (H + 1)
    Q = (21 - G) \ 11
    i = (K * P * Q - 1) * K + H
    B = annee \ 4 + annee
    J1 = B + i + 2 + C_4 - C
    J2 = J1 Mod 7
    r = 28 + i - J2
    jour = r
    mois = 3
     
    If r > 31 Then
        jour = r - 31
        mois = 4
    End If
     
     
     
    DatePaques = DateSerial(annee, mois, jour)
     
     
    End Function
    Public Function dateferie(ByVal DT As Date) As Boolean
    Dim annee As Integer
    annee = Year(DT)
     
    If (DT = DateAdd("d", 1, (DatePaques(annee)))) Or (DT = DateAdd("d", 39, (DatePaques(annee)))) Or (DT = DateAdd("d", 50, (DatePaques(annee)))) Then
        dateferie = True
    End If
     
     
    If (DT = DateSerial(annee, 1, 1)) Or (DT = DateSerial(annee, 5, 1)) Or (DT = DateSerial(annee, 6, 23)) Or (DT = DateSerial(annee, 8, 15)) Or (DT = DateSerial(annee, 11, 1)) Or (DT = DateSerial(annee, 12, 25)) Or (DT = DateSerial(annee, 12, 26)) Then
        dateferie = True
    End If
     
     
    End Function
     
    Public Function HP_nbjours(DateDebut As Date, DateFin As Date, NumJour As Integer)
        Dim n As Integer, i As Date, Nb_Jours_diff As Integer
        Dim Date_Calculee As Date
     
        Nb_Jours_diff = DateDiff("d", DateDebut, DateFin)
     
            n = 0
            For i = 0 To Nb_Jours_diff
               Date_Calculee = DateAdd("d", i, DateDebut)
               If (dateferie(Date_Calculee) = False) And Weekday(Date_Calculee, vbMonday) = NumJour Then
                    n = n + 1
               End If
     
            Next i
     
        HP_nbjours = n
    End Function

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2002
    Messages : 329
    Par défaut
    Merci beaucoup

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 26/10/2014, 16h47
  2. Recuperer valeur d'une cellule sur double clic sur la ligne
    Par boboss123 dans le forum Composants
    Réponses: 2
    Dernier message: 18/01/2010, 08h54
  3. Contrôle de valeur sur une cellule
    Par devdev dans le forum Excel
    Réponses: 2
    Dernier message: 19/03/2009, 11h34
  4. Afficher la valeur d'une cellule sur une image
    Par alex830001 dans le forum Excel
    Réponses: 2
    Dernier message: 02/07/2008, 11h07
  5. [VBA-E] RechercheV si changement de valeur sur une cellule
    Par bonilla dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/01/2007, 16h22

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