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 :

Recherche date dans plage


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Recherche date dans plage
    Bonjour à tous

    Je voudrais savoir si les dates choisies par l'utilisateur dans un formulaire sont déjà dans mon tableau de réservation

    tableau de réservation


    [TH]Salle[/TH]
    [TH]Date deb[/TH]
    [TH]Date fin[/TH]
    Grande Salle 06/10/2020 06/10/2020
    Grande Salle 11/10/2020 11/10/2020
    Grande Salle 13/10/2020 13/10/2020
    Salle 2 13/10/2020 13/10/2020
    Grande Salle 18/10/2020 18/10/2020
    Grande Salle 24/10/2020 26/10/2020
    Grande Salle 05/11/2020 05/11/2020
    Grande Salle 16/10/2020 16/10/2020
    Salle 2 24/10/2020 25/10/2020

    Si l'utilisateur choisi dans le formulaire ces informations


    [TH]Salle[/TH]
    [TH]Date deb[/TH]
    [TH]Date fin[/TH]
    Grande Salle 25/10/2020 25/10/2020

    il soit prévenu par un message d’alerte

    Merci de votre aide

  2. #2
    Rédacteur/Modérateur

    Bonjour,

    pourrais-tu être plus précis stp ?

    En effet, tu nous parles de dates (j'en déduis de début et de fin), mais tu nous donnes un exemple (25/10 et 25/10), qui n'est que partiellement dans les données.

    Tu veux parler de dates qui se chevaucheraient ?

    Tu peux fonctionner simplement par gestion des cas possibles
    - parcours de toutes les lignes
    - comparaison du chevauchement ou non (à coup d'inégalités par exemple)
    - dès qu'une ligne pose soucis, tu sors de la boucle
    Cycle de vie d'un bon programme :
    1/ ca fonctionne 2/ ca s'optimise 3/ ca se refactorise

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

    Apprendre à programmer avec Access 2016 et Access 2019

    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
    Candidat au Club
    oui Je veux tester si les dates choisi par l'utilisateur ( date début 25/10/2020 et date fin = 25/10/2020 ) sont présentent dans le tableau des réservations

  4. #4
    Rédacteur/Modérateur

    Ok, mais là tu nous dis que tu veux une alerte, alors les date 25/10 - 25/10 ne sont pas présentes… ou alors tu nous as mal expliqué
    Cycle de vie d'un bon programme :
    1/ ca fonctionne 2/ ca s'optimise 3/ ca se refactorise

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

    Apprendre à programmer avec Access 2016 et Access 2019

    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

  5. #5
    Nouveau membre du Club
    Citation Envoyé par Jean-Philippe André Voir le message
    Ok, mais là tu nous dis que tu veux une alerte, alors les date 25/10 - 25/10 ne sont pas présentes… ou alors tu nous as mal expliqué
    Bonjour Jean-Philippe,

    Je pense que comme une des dates de réservation est Début 24/10 et Fin 26/10, la date 25/10 est bloqué.
    (2ième ligne après "Salle 2" : Grande Salle 24/10/2020 26/10/2020)

    Il faut donc vérifier les dates affiché + intervales entre début et fin.

    Un truc du style :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
     If Not Date_Début_testé > Date_fin_voulu Or Date_fin_testé < Date_début_voulu then Msgbox ("Problème")


    Avec une boucle pour tester toutes les lignes

    Zeabon

  6. #6
    Candidat au Club
    Oui tout a fait ça

  7. #7
    Expert éminent
    Bonjour,

    le mieux est d'utiliser une fonction qui renverra TRUE ou FALSE à la procédure appelante.

    Ici, c'est un tableau structuré appelé "PLANNING_RESA", composé de trois colonnes (mêmes noms que ton exemple de premier post)

    J'ai placé le nom de la salle / date début / date de fin directement sur une feuille excel, je te laisse adapter avec les champs de ton userform

    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
    Function ResaPossible(LeTablo As ListObject, Salle As String, Debut As Date, Fin As Date) As Boolean
    Dim Cell As Range
    ResaPossible = True
        With LeTablo
            .Range.AutoFilter
            .Range.AutoFilter .ListColumns("Salle").Index, Salle
     
            If .Range.SpecialCells(xlCellTypeVisible).Rows.Count = 1 Then
                ResaPossible = False
            Else
                For Each Cell In .ListColumns("Date deb").DataBodyRange.SpecialCells(xlCellTypeVisible).Cells
                    If Not Cell.Value > Fin Or Cell.Offset(0, 1).Value < Debut Then
                        ResaPossible = False
                        Exit For
                    End If
                Next Cell
            End If
     
            .Range.AutoFilter
        End With
    End Function


    Un exemple d'appel
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
    MsgBox ResaPossible(Feuil1.ListObjects("PLANNING_RESA"), Feuil1.Range("G1"), Feuil1.Range("G2"), Feuil1.Range("G3"))
    End Sub

  8. #8
    Nouveau membre du Club
    Bonjour Joe,

    J'ai une question sur le code du fil précédant :

    Ligne 8/9 :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
            If .Range.SpecialCells(xlCellTypeVisible).Rows.Count = 1 Then
                ResaPossible = False


    Si je compends bien : Si tu obtiens un seul résultat visible, tu ne peux pas réservé

    J'aurais dit l'inverse ...
    Peux-tu m'expliquer stp ?

    Zeabon

  9. #9
    Expert éminent
    Bonjour,

    je regarde si le résultat du filtre renvoi au moins une ligne de données.

    Pour se faire, et sans utiliser de gestion d'erreur sur le DataBodyrange (Zone des données) s'il est nul, je regarde le nombre de lignes visibles sur l'ensemble du tableau, ligne d'en-têtes incluses.

    Si on a une seule ligne, c'est qu'on a pas de données et uniquement les titres. Cela revient à dire que la salle choisie n'existe pas dans le tableau, j'ai choisi de refuser la réservation, mais suivant ton besoin tu peux inverser le traitement en passer le retour de fonction ResaPossible à True

  10. #10
    Candidat au Club
    Bonjour et merci pour vos réponses

    J'ai testé la macro mais je n'obtient pas ce que je voulais

    L’utilisateur à choisi la "Grande Salle" et les date début = 25/10/2020 et fin= 25/10/2020

    Dans mon tableau de réservation à la ligne 6 il y a une réservation "Grande Salle" du 24/10/2020 au 26/10/2020

    La salle et la date choisi par l'utilisateur est déjà présente dans mon tableau de réservation

    Donc message d'alerte car cette sale est déjà occupée à cette date

    Merci de votre aide

  11. #11
    Expert éminent
    Je n'ai pas de souci avec cette configuration

    J'ai bien l'impossibilité de réserver de mon côté



    As-tu bien contrôlé que les valeurs saisie par l'utilisateur sont correctes lors de l'exécution du code ?

    Peux-tu nous le montrer ?

  12. #12
    Candidat au Club
    Voila mon fichier

  13. #13
    Expert éminent
    ça fonctionne parfaitement sur ton fichier. J'obtiens le message Faux (donc réservation impossible)

    Après, à toi de réaliser le traitement souhaité au retour de la fonction.

    Ici, la procédure appelante se contente de dire si la réservation est possible : VRAI ou FAUX

    Un exemple autre

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test()
        If Not ResaPossible(Feuil1.ListObjects("PLANNING_RESA"), Feuil1.Range("G1"), Feuil1.Range("G2"), Feuil1.Range("G3")) Then
            MsgBox "La réservation n'est pas possible"
        Else
            MsgBox "La réservation est possible"
            ' ici le traitement souhaité
        End If
    End Sub

  14. #14
    Candidat au Club
    Ok pour les valeurs du 25/10/2020

    Essayer avec comme valeur le 15/10/2020 "Réservation impossible" alors qu'il n'y a aucune réservation pour le 15/10/2020

###raw>template_hook.ano_emploi###