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

VBA Access Discussion :

Boucle pour lister les jours entre 2 dates : format des dates non reconnu ? [AC-2016]


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2019
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2019
    Messages : 13
    Points : 10
    Points
    10
    Par défaut Boucle pour lister les jours entre 2 dates : format des dates non reconnu ?
    Bonjour à tous !

    Je suis totalement débutante en VBA et je suis en train de mettre en place une base de données pour la gestion de prés dans un élevage.
    L'idée est de pouvoir sélectionner à l'aide d'un formulaire (déjà créé actuellement) une date de début d'entrée et une date de début de sortie du cheptel dans un pré.
    Mais ensuite, j'aimerais récupérer dans une table le pré et le cheptel jour par jour.

    Pour illustrer :

    Id_Passage date_initiale date_finale commentaire
    1 5/07/2019 7/07/2019 Grand pré

    Doit devenir :

    Id_Passage date commentaire
    1 5/07/2019 Grand pré
    1 6/07/2019 Grand pré
    1 7/07/2019 Grand pré

    J'ai récupéré un code VBA à ajouter sur le formulaire et je l'ai adapté à mes champs. Cela fait 3 jours que je suis dessus et après avoir corriger les erreurs de syntaxe qui apparaissaient au fur et à mesure, j'ai actuellement le code suivant, associé au formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Commande15_Click()
    DtDeb = Me.[Date début]
    DtFin = Me.[Date fin]
    For Boucle = 0 To DateDiff("d", DtDeb, DtFin)
        MaDate = DateAdd("d", Boucle, DtDeb)
        DoCmd.SetWarnings False
        DoCmd.RunSQL ("INSERT INTO Passages_Calendrier ([Année], [Date_pâturage]) SELECT " & [Année] & " AS [Année]," & Format(MaDate, "dd/mm/yyyy") & " AS [Date_pâturage];")
        DoCmd.SetWarnings True
        Next
        Me.Requery
     
     
    End Sub
    Je n'ai pas ajouté encore les champs Cheptel et Pâturage, je compte faire ça petit à petit.

    Mon problème est au niveau des dates : je n'ai pas du tout les dates que j'entre dans le formulaire dans les champs [Date début] et [Date fin] mais tout le temps la date "30/12/1899".
    J'ai compris que cette date est la date initiale pour compter les dates mais je ne comprends pas pourquoi c'est elle qui s'affiche, comme s'il n'y avait aucune infos.

    J'ai changé le format de la date "dd/mm/yyyy" en "yyyy/mm/dd" pour voir : j'obtiens une suite de dates de février 1900. Bref, je ne comprends pas comment corriger ça et après toutes les difficultés que j'ai eues, je me tourne vers vous pour un petit coup de main.

    Il y aussi de nombreux sigles et infos que je ne comprends pas/connais pas, si jamais vous trouvez ce qu'il ne va pas dans ce que j'ai fait, pouvez-vous me l'expliquer de façon claire ?

    Merci par avance et belle journée à tous !

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 747
    Points : 14 772
    Points
    14 772
    Par défaut
    bonjour,
    - la boucle est mal faite, il est préférable de faire une boucle Tant que date début < date fin
    - avec INSERT INTO si il n'y a pas de table ou de requête en sélection il faut utiliser VALUES.
    Essaie ce code (non testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Commande15_Click()
    Dim I as integer
    Dim MaDate as date,DtDeb as date,DtFin as date
    DtDeb = Me.[Date début]
    DtFin = Me.[Date fin]
     
    Do While MaDate < DtFin
        MaDate = DateAdd("d", I, DtDeb)
        Currentdb.Execute "INSERT INTO Passages_Calendrier ([Année], [Date_pâturage]) VALUES(" & Year(MaDate) & ",'" & Format(MaDate, "dd/mm/yyyy") & "');" , dbfailonerror
        I = I+1
    Loop
    Me.Requery
     
    End Sub
    J'ai mis Year(MaDate) pour l'année, mais si ce champ existe dans le formulaire, tu peux le remplacer par Me.[Année]
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2019
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2019
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Génial ! Ca marche parfaitement, merci infiniment !!

    J'ai testé avec les nouveaux champs [Pâturage], [Cheptel] et [Commentaire] :

    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
     
    Private Sub Commande15_Click()
    Dim I As Integer
    Dim MaDate As Date
    DtDeb = Me.[Date début]
    DtFin = Me.[Date fin]
     
    Do While MaDate < DtFin
        MaDate = DateAdd("d", I, DtDeb)
        CurrentDb.Execute ("INSERT INTO Passages_Calendrier ([Année], [Date_pâturage], [Cheptel], [Pâturage], [Commentaire]) VALUES(" & Me.[Année] & ",'" & Format(MaDate, "dd/mm/yyyy") & "', " & Me.[Cheptel] & ", " & Me.[Pâturage] & ", " & Me.[Commentaire] & ");")
        I = I + 1
    Loop
    Me.Requery
     
    End Sub
    J'ai le message d'erreur suivant : "Erreur de syntaxe (opérateur absent) : dans l'expression "Grand Pré"" à savoir que Grand pré est une entrée du formulaire du champ [Pâturage]. Quelle est est l'erreur de syntaxe ?

    Merci encore pour ton aide qui m'a fait comprendre bien des choses !

  4. #4
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 747
    Points : 14 772
    Points
    14 772
    Par défaut
    tout ce qui est variable texte doit être entre guillemets (ce qui doit être aussi le cas pour Commentaire) et il faut les doubler puisqu'il se trouvent entre d'autres guillemets ", """ & Me.[Pâturage] & """, """:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurrentDb.Execute ("INSERT INTO Passages_Calendrier ([Année], [Date_pâturage], [Cheptel], [Pâturage], [Commentaire]) VALUES(" & Me.[Année] & ",'" & Format(MaDate, "dd/mm/yyyy") & "', " & Me.[Cheptel] & ", """ & Me.[Pâturage] & """, """ & Me.[Commentaire] & """);")
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2019
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2019
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Merci, merci !!! En effet, ça marche bien mieux !
    Pour des futures personnes qui se questionneraient, je précise que j'ai aussi rajouté des doubles guillemets autours de qui est aussi une variable texte.

    Je ne comprends pas bien pourquoi on double les guillemets : " " " [Cheptel] " " "

    En rouge : les guillemets qui encadrent le champ
    En bleu : les guillemets du fait que ce soit un texte
    En vert : les guillemets doublés mais pourquoi ?

    Si tu as une réponse qui connait un site où se renseigner, je suis preneuse !

    Merci encore !

  6. #6
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 014
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 014
    Points : 24 567
    Points
    24 567
    Par défaut
    Bonjour,

    Pourquoi on double les guillemets ?

    Voici une explication par l'exemple :

    Lorsqu'on crée une chaine, un string en VBA le séparateur est le guillemet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    maChaine = "toto"
    ? maChaine
    toto


    Donc un guillemet au début et un à la fin. VBA sait que tout ce qui est à l'intérieur est le contenu de cette string.

    Maintenant on veut insérer dans cette chaine un guillemet. VBA va considérer le prochain guillemet par la fin de la chaine, sauf si on le double, dans ce cas il saura que c'est un guillemet. Mais il faut finir la chaine par un guillemet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    machaine = "toto_""_"
    ? maChaine
    toto_"_
    Maintenant on veut insérer une string dans une string, cas typique d'une instruction SQL dans VBA.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    maChaine = "SELECT * FROM matable WHERE monchamp=""toto"" AND ... ;"
    ? maChaine
    SELECT * FROM matable WHERE monchamp="toto" AND ... ;
    Pour SQL certain remplace le guillemet par une apostrophe, plus simple à écrire et dérivé de la notation anglo-saxone standard SQL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    maChaine = "SELECT * FROM matable WHERE monchamp='toto' AND ... ;"
    ? maChaine
    SELECT * FROM matable WHERE monchamp='toto' AND ... ;
    En effet plus facile à écrire et à lire par contre lorsqu'on on recherche une chaine texte (string) qui comporte une apostrophe, ça coince.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    maChaine = "SELECT * FROM matable WHERE monchamp='L'apostrophe' AND ... ;"
    ? maChaine
    SELECT * FROM matable WHERE monchamp='toto' AND ... ;
    VBA ne bronche pas, pour lui une chaine correctement délimitée "..." reste une chaine. Par contre le moteur SQL ne va pas toléré.
    Pour lui il va interprété ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM matable WHERE monchamp='L'
    La suite :
    sera une erreur de syntaxe.

    Enfin voici une notation SQL qui mélange variable VBA et SQL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    monparam = "toto"
    maChaine = "SELECT * FROM matable WHERE monchamp=""" & monparam & """ AND ... ;"
    ? maChaine
    SELECT * FROM matable WHERE monchamp="toto" AND ... ;
    On triple le guillemet. Un double pour figurer le séparateur du paramètre et un de terminaison de chaine SQL, puis un de début de chaine SQL, 2 pour figurer le guillemet de terminaison de la chaine paramètre.

    Je passe sur l'utilisation sur chr(34).

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2019
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2019
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Eh bien, merci beaucoup Loufab pour cette réponse détaillée !

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

Discussions similaires

  1. [XL-2013] Sélection non contiguë de cellules dans une boucle For each
    Par Wiiizz14 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 26/05/2017, 16h20
  2. Variable non reconnue dans une boucle
    Par Runsh63 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 03/11/2011, 10h33
  3. exception non levée malgré throw dans une boucle for
    Par marion5515 dans le forum Langage
    Réponses: 12
    Dernier message: 14/05/2009, 17h53
  4. [batch] incrémentation dans une boucle for
    Par bart64 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 08/09/2004, 20h05
  5. Réponses: 3
    Dernier message: 06/07/2004, 10h21

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