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 :

utilisation de Match qui remonte toujours un bolean "Vrai" [XL-365]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Contrôle de gestion
    Inscrit en
    Février 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Contrôle de gestion

    Informations forums :
    Inscription : Février 2014
    Messages : 19
    Par défaut utilisation de Match qui remonte toujours un bolean "Vrai"
    Bonjour, je tente d'utiliser un module vba qui compare des dates. Il calcul d'abord les jours fériés d'une année. Puis, il crée un second tableau contenant toutes les dates de l'année. Enfin, il compare ces dates et va rechercher par la fonction match, si la date du second tableau est bien dans le tableau des jours fériés afin de modifier le fond de la cellule. Mon souci, c'est que sur mon test, je ne retourne que des valeurs "vrai" et donc, toutes mes cellules sont colorées.
    Voici mon 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
    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    Sub Jours_Feries()
     
     
        Dim JFeries(11) As Long
        Dim Nb, Epacte, i, j, k, tmp, nbjouran, o As Long
        Dim PLune As Date, LPaques, v, firstDay, lastDay, q, Val, www As Date
        Dim An, r As Integer
        Dim Plage, Cell, PlageZ, Cellw As Range
        Dim p As Variant
     
        ' Valeur de l'année pour remplir le tableau
        An = Application.InputBox("Entrez l'année")
     
        '   Calcul du Lundi de Pâques
        Nb = (An Mod 19) + 1
        '   Différence entre calendrier solaire et lunaire
        Epacte = (11 * Nb - (3 + Int(2 + Int(An / 100)) * 3 / 7)) Mod 30
        PLune = DateSerial(An, 4, 19) - ((Epacte + 6) Mod 30)
        If Epacte = 24 Then PLune = PLune - 1
        '   Valable entre 1900 et 2199 : on verra bien ?
        If Epacte = 25 And (An >= 1900 And An < 2200) Then PLune = PLune - 1
        '   Lundi de Pâques
        LPaques = PLune - Weekday(PLune) + vbMonday + 7
     
        Erase JFeries
     
        '   Jour de l'An
        JFeries(1) = DateSerial(An, 1, 1)
        '   Paques
        JFeries(2) = LPaques
        '   Ascension
        JFeries(3) = LPaques + 38
        '   Pentecôte
        JFeries(4) = LPaques + 49
        '   Fete du travail
        JFeries(5) = DateSerial(An, 5, 1)
        '   Anniversire 1945
        JFeries(6) = DateSerial(An, 5, 8)
        '   Fete Nationale
        JFeries(7) = DateSerial(An, 7, 14)
        '   Assomption
        JFeries(8) = DateSerial(An, 8, 15)
        '   Toussaint
        JFeries(9) = DateSerial(An, 11, 1)
        '   Armistice 1918
        JFeries(10) = DateSerial(An, 11, 11)
        '   Noel
        JFeries(11) = DateSerial(An, 12, 25)
     
        '   Tri Tableau JFeries()
        For i = LBound(JFeries) To UBound(JFeries)
            j = i
            For k = j + 1 To UBound(JFeries)
                If JFeries(k) <= JFeries(j) Then j = k
            Next k
            If i <> j Then
                tmp = JFeries(j)
                JFeries(j) = JFeries(i)
                JFeries(i) = tmp
            End If
        Next i
     
     
        Set Plage = Range("A1:A11")
        i = 1
     
        For Each Cell In Plage
            Cell.Value = JFeries(i)
            i = i + 1
        Next
     
     
     
     
        firstDay = "1/1/" & An
        lastDay = "31/12/" & An
        nbjouran = DateDiff("d", firstDay, lastDay) + 1
     
        Dim montab() As Variant
     
        ReDim montab(nbjouran) As Variant
     
     
        firstDay = CDate(firstDay) - 1
        For r = 1 To nbjouran
     
        montab(r) = CDate(firstDay) + 1
        firstDay = CDate(firstDay) + 1
        Debug.Print (firstDay)
        Next r
     
     
     
        p = "C1:c" & nbjouran
        Set PlageZ = Range(p)
     
            o = 1
            For Each Cellw In PlageZ
            Cellw.Value = montab(o) + 1
            o = o + 1
        Next
     
     
     
        Dim aa, xx, pp As Variant
        aa = montab
        xx = "08/01/1944"
        pp = Application.Match(xx, aa, 0)
     
        Dim Rep As Boolean
     
        For i = LBound(montab) To UBound(montab)
        Val = montab(i)
        Cells(i, 5).Select
        Cells(i, 5).Value = Val
        Rep = Application.Match(CLng(Val), JFeries, 1)
            If Rep = True Then
            ActiveCell.Interior.Color = RGB(174, 240, 194)
            Else
            ActiveCell.Interior.Color = RGB(255, 255, 255)
            End If
     
        Next
     
        End Sub
    Merci pour votre aide.

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    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 : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pourquoi utiliser le VBA pour effectuer ce genre de travail ?
    Avoir une feuille contenant les paramètres du classeur avec une table contenant tous les jours fériés d'une année donnée ou même plusieurs et utiliser ensuite la mise en forme conditionnelle (fonctionnalité native d'excel) qui mettra dans un format particulier les cellules contenant une date fériée me semble plus simple à mettre en place mais peut-être n'ai je rien compris à la finalité du travail a effectuer.

    Petite remarque : La fonction Match renvoie la position d'une valeur cherchée en ligne ou en colonne ou une erreur si la valeur n'est pas trouvée donc je ne comprends pas ces lignes de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Rep = Application.Match(CLng(Val), JFeries, 1)
    If Rep = True Then
    ActiveCell.Interior.Color = RGB(174, 240, 194)
    Else
    ActiveCell.Interior.Color = RGB(255, 255, 255)
    End If

    [EDIT]
    J'ajouterai, que le troisième argument de la fonction Match dans ce cas ci doit avoir comme valeur 0 et pas 1 car sinon elle cherche la valeur la plus proche et en utilisant 0 évidemment la fonction renverra une erreur, c'est inévitable.

    Un simple test dans excel avec la fonction EQUIV (pour la version anglaise c'est MATCH) te permettra de comprendre
    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

  3. #3
    Membre averti
    Homme Profil pro
    Contrôle de gestion
    Inscrit en
    Février 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Contrôle de gestion

    Informations forums :
    Inscription : Février 2014
    Messages : 19
    Par défaut
    Bonsoir, en fait, je débute avec l'utilisation des tableaux. Sur le fond, vous avez raison, une feuille excel serait suffisante mais c'est plutôt à titre d'apprentissage que je réalise ce code. Je recherche par le test sur lequel vous vous interrogez, à savoir si la valeur que je lis dans ma table "jours de l'année" est bien présente dans ma table "jours fériés". Si oui, j'applique un fond vert, sinon un fond blanc. Si je comprends bien, ce n'est pas la fonction match qu'il faut utiliser ?
    D'avance merci.
    Philippe

  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
    13 173
    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 : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La fonction Match est évidemment un bon choix encore faut-il la connaître et la meilleure manière de l'appréhender est de l'utiliser d'abord manuellement avec Excel

    [EDIT]
    Voici un petit exemple illustré plus bas.

    Dans une feuille "paramètre", nous avons un tableau perpétuel qui calcule dans la plage nommée pPublicHolidays_1 (E3:E13) les jours fériés de l'année courante et dans pPublicHolidays_2 les jours fériés de l'année qui suit.
    On place en cellule H3 une date quelconque (ici 20/04/2019) de l'année courante (2019)

    Exemple 1 - On utilise la fonction EQUIV avec comme 3ème argument la valeur 1 soit la valeur proche inférieure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =EQUIV(H3;pPublicHollidays_1;1)
    La valeur renvoyée est 1 parce-que la valeur la plus proche inférieure est le 01/01/2019 qui est la position 1 dans la plage pPublicHolidays_1

    Exemple 2 - On utilise la fonction EQUIV avec comme 3ème argument la valeur 0 soit correspondance exacte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =EQUIV(H3;pPublicHollidays_1;0)
    La valeur renvoyée est #N/A puisque la fonction n'a pas trouvé la correspondance exacte

    Nom : Match Equiv Exemple.png
Affichages : 67
Taille : 39,0 Ko
    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 averti
    Homme Profil pro
    Contrôle de gestion
    Inscrit en
    Février 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Contrôle de gestion

    Informations forums :
    Inscription : Février 2014
    Messages : 19
    Par défaut
    Bonjour,

    J'ai donc appliqué If IsError(Rep) Then à mon test et cela fonctionne.

    Merci

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    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 : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Entendu. Mais comment tester la valeur #N/A ?
    En excel, avec la fonction ESTNA qui renverra VRAI si la fonction renvoie une erreur #N/A et pour renverser la valeur booléenne on utilisera la fonction NON

    Autrement dit, si je reprends l'exemple que j'ai placé dans ma réponse du post #4, la fonction ci-dessous renverra VRAI si la date en H3 se trouve dans la plage nommée pPublicHollidays_1 et FAUX si la date ne s'y trouve pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =NON(ESTNA(EQUIV(H3;pPublicHollidays_1;0)))
    [EDIT]
    Et si l'on souhaite vérifier si la date cherchée est présente ou pas dans les plages de données pPublicHollidays_1 ou pPublicHollidays_2, on écrira
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =OU(NON(ESTNA(EQUIV(H3;pPublicHollidays_1;0)));NON(ESTNA(EQUIV(H3;pPublicHollidays_2;0))))
    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

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/05/2013, 09h11
  2. [Débutant] utilisation du Count() qui génère toujours une exception
    Par patxy dans le forum Linq
    Réponses: 3
    Dernier message: 06/04/2012, 01h15
  3. [XSL include]chemin relatif qui remonte d'un répertoire
    Par snoop dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 05/09/2007, 23h05
  4. Comment utiliser maChaine.match()?
    Par franculo_caoulene dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 03/03/2006, 16h51
  5. [...] doit utiliser une requête qui peut être mise à jour
    Par requiemforadream dans le forum ASP
    Réponses: 4
    Dernier message: 26/04/2005, 09h12

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