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 :

Diviser un champ date en vba


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut Diviser un champ date en vba
    bonjour,

    j'ai un formulaire ou est inseré:
    - une Liste_box
    - un texte_box
    - un bouton de commande.

    La texte_box contient la variable date "VJournee". Lorsque j'insere une date en format en format jj/mm/aaa et en cliquant ensuite sur le bouton de commande, des données s'affichent dans la listebox.

    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
    Option Compare Database
    Dim VJournee As Date
    Dim txt_ChaineSQL As String
    Dim strSQLSELECT As String
    Dim strSQLWHERE As String
    Dim strSQLGROUPBY As String
    Dim strSQLORDERBY As String
     
     
     
     
    Private Sub Cmd_envoyer_Click()
    VJournee = CDate(Texte_journee) + TimeSerial(5, 0, 0)
     
     
     
    With Me.liste_recirculation
    .RowSourceType = "Table/Requête"
    .ColumnCount = 8 ' nombre de colonne que dois avoir le formulaire intitulé "Listerecirculation"
    .BoundColumn = 1 ' la colonne de reference
     
    strSQLSELECT = " SELECT [table_Affich-general].DESTINATION, [table_Affich-general].[Chute (format access)], [table_Affich-general].Type, FormatDateTime([DischargeEventTime],2) AS jour, Sum(dbo_vwItemData.RecirculationCount) AS [nbre de colis en recirculation], Round((Sum([RecirculationCount])/Count([ItemID])*100),2) AS taux , FormatDateTime((CVDate((Fix([DischargeEventTime]*24*1)/24/1))),4) AS [tranche horaire], FormatDateTime(CVDate(Fix([DischargeEventTime]*24*6)/24/6),4) AS [10 min]" & _
    " FROM dbo_vwItemData INNER JOIN (dbo_vwParts INNER JOIN [table_Affich-general] ON dbo_vwParts.DisplayName = [table_Affich-general].[Chute (format access)]) ON dbo_vwItemData.DischargePartID = dbo_vwParts.ID "
     
    strSQLORDERBY = " ORDER BY FormatDateTime([DischargeEventTime],2)ASC "
     
    strSQLGROUPBY = " GROUP BY [table_Affich-general].DESTINATION, [table_Affich-general].[Chute (format access)], [table_Affich-general].Type, FormatDateTime([DischargeEventTime],2), FormatDateTime((CVDate((Fix([DischargeEventTime]*24*1)/24/1))),4), FormatDateTime(CVDate(Fix([DischargeEventTime]*24*6)/24/6),4) "
     
    strSQLWHERE = " WHERE (dbo_vwItemData.DischargeEventTime) BETWEEN #" & VJournee & "# And  #" & VJournee + 1 & "# "
     
     
    txt_ChaineSQL = strSQLSELECT & vbCrLf & _
                    strSQLWHERE & vbCrLf & _
                    strSQLGROUPBY & vbCrLf & _
                    strSQLORDERBY
     
    .RowSource = txt_ChaineSQL
    .Requery
    End With
     
     
    End Sub

    Mon superieur me demande d'apporter une modification à ce formulaire en inserant non plus une date mais en selectionnant des vacations:

    matin : >=([DATE format jj/mm/aaaa])+#05:00:00# Et <=([DATE format jj/mm/aaaa])+#12:30:00#

    apres_midi :>([DATE format jj/mm/aaaa])+#12:30:00# Et <=([DATE format jj/mm/aaaa])+#19:30:00#

    nuit : >([DATE format jj/mm/aaaa])+#19:30:00# Et <(([DATE format jj/mm/aaaa])+1)+#05:00:00#
    L idée serait d'integrer dans le formulaire, une liste déroulante ou je choisirais soit:
    -matin
    -apres-midi
    -nuit
    - journée compléte : ( qui correspondrait à la variable Vjournee)

    Trés facile à l'ecrire mais trés difficile à le trancrire en vba
    C'est pourquoi, je viens vers vous pour une aide..

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 849
    Par défaut
    Bonjour,

    1 - Il faudrait rajouter la zone de liste ChampVacationFormulaire dans le formulaire.
    2 - Ajouter un deuxième variable dans ton code pour avoir le moment de début et fin :ex : VJourneeDébut et VJourneeFin.
    3 - Définir ces valeurs selon les 4 cas qui seraient choisis.
    4 - Modifier en conséquence les limites de tes dates dans la partie Where (extrait du 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
    Option Compare Database
    Dim VJourneeDebut As Date, VJourneeFin As Date, VTrancheHoraire As Date
    .....
    .....
    Private Sub Cmd_envoyer_Click()
    VTrancheHoraire = ChampVacationFormulaire
    Select Case VTrancheHoraire
    Case Matin 'A faire correctement si string ou numérique VTrancheHoraire
        VJourneeDebut = CDate(Texte_Journee) + TimeSerial(5, 0, 0)
        VJourneeFin = CDate(Texte_Journee) + TimeSerial(12, 30, 0)
    Case Apres_Midi
        VJourneeDebut = CDate(Texte_Journee) + TimeSerial(12, 30, 0)
        VJourneeFin = CDate(Texte_Journee) + TimeSerial(19, 30, 0)
    Case Nuit
        VJourneeDebut = CDate(Texte_Journee) + TimeSerial(19, 30, 0)
        VJourneeFin = (CDate(Texte_Journee) + 1) + TimeSerial(5, 0, 0)
    Case Journee_Complete
        VJourneeDebut = CDate(Texte_Journee) + TimeSerial(5, 0, 0)
        VJourneeFin = (CDate(Texte_Journee) + 1) + TimeSerial(5, 0, 0)
    End Select
    ...
    ....
    strSQLWHERE = " WHERE (dbo_vwItemData.DischargeEventTime) BETWEEN #" & VJourneeDebut & "# And  #" & VJourneeFin & "# "
    ...
    ...
    @+

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Bonjour madefemere
    Merci pour ta réponse.

    mais le code bug...
    lorsque je rentre une date (format jj/mm/aaaa) dans le texte_box et que je clic sur le buton de commande, le code bug avec un message d'erreur qui apparait :
    " erreur d'éxecution 94. Utlisation inconnu de null"

    Et sur le code, c'est la ligne
    VTrancheHoraire = ChampVacationFormulaire
    qui est surlignéé en jaune

    PS : la zone de liste "ChampVacationFormulaire" reste vide.

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 849
    Par défaut
    Bonjour,
    Mais il te faut créer les sources dans ta zone de liste.

    Ex :
    Origine source : Liste valeurs
    Contenu : "Journée";"Matin";"Après_Midi";"Nuit"
    Valeur par défaut : "Journée"

    Et tu choisis une de ces valeurs avant de lancer la commande.

    Le code ne gère pas les cas classiques comme non-existence de date et vacations.

    @+

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    oups..
    j'avais mis la liste "Journée";"Matin";"Après_Midi";"Nuit" dans le ligne " Origine source" ..shame on me..

    Le message d'erreur précédente à disparu mais un autre message d'erreur s'affiche :
    Erreur d'éxecution "13". Incompatibilité de type

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    En fin de compte, la variable VTrancheHoraire est défini comme un String.
    et non comme une date

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    madefemere,

    En definissant VTrancheHoraire comme un String et non comme une Date, je n'ai plus de message d'erreur .
    Mais lorsque je lance le code, je n'ai pas de donnée qui s'affiche dans ma ListeBox.

    J'ai donc fait defilé le code pas à pas et je me rend compte que dans les 4 cas : "Journée";"Matin";"Après_Midi";"Nuit" ,
    les varibales VJourneeDebut et VJourneeFin affichent toutes le meme reslulat "00:00:00".

    est cela qui fait que ma listebox reste vide ?

  8. #8
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 849
    Par défaut
    Oups, Désolé pour cette petite contradiction dans le type de VTrancheHoraire.

    1- Est-ce que tu as bien mis entre guillemets "Matin","Après_Midi","Nuit","Journée" dans les Case

    2 - Tu as bien ton code dans un évènement sur click d'un bouton du formulaire?
    Dans ce cas, utilises Me. pour faire référence à ses éléments :
    Me.Texte_Journee au lieu de Texte_Journee et
    Me.ChampVacationFormulaire au lieu de ChampVacationFormulaire

    J'espère que c'est bon
    @+

  9. #9
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    j'avais bien mis les guimmets sur les noms "Matin","Après_Midi","Nuit","Journée".
    j'ai rajouté le Me. dans les expressions Me.Texte_Journee et Me.ChampVacationFormulaire .

    Et rien n'y fait...j'ai toujours la valeur 00:00:00 qui s'affiche lorsque je passe le curseur sur les variables VJourneeDebut et VJourneeFin
    Et rien ne s'affiche sur ma listebox..

  10. #10
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    madefemere, je pense sque c'est ma requete sql qui pose problème.
    je vais la refaire et je reviendrais vers toi pour te tenir au courant

  11. #11
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 469
    Par défaut
    Bonjour,

    J'arrive peut-etre tard avec ma proposition mais as-tu pensé à utiliser dans ton Form l'activeX Control Calendar. Cela te permet de montrer un calendrier à l'utilisateur qui clique sur un jour plutot que de taper une date du genre 04/05/07 que tu traites comme du texte. Cela t'offre une présentation assez professionnelle.
    Le danger des dates est de confondre les jours et les mois. "04/05/07" peut être le 4 mai 2007 ou le 5 avril ou le 7 mai 2004. Suivant les pays, les cultures des utilisateurs et leurs settings Windows, tu risques d'avoir des problemes.

  12. #12
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Bonjour pipo,
    C'est interessant ton idée . Je reviendrais vers toi pour la mettre en place..
    Mais là , j'ai un soucis avec ma requete sql ..elle ne me donne aucun resultat sur ma listebox.

    Et je ne vois vraiment pas d'ou viens le soucis..

    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
    Option Compare Database
    Dim VJournee As Date
    Dim VJourneeDebut As Date, VJourneeFin As Date, VTrancheHoraire As String
    Dim txt_ChaineSQL As String
    Dim strSQLSELECT As String
    Dim strSQLWHERE As String
    Dim strSQLGROUPBY As String
    Dim strSQLORDERBY As String
    Dim strSQLHAVING As String
     
    Private Sub Cmd_envoyer_Click()
     
    VJournee = CDate(Texte_journee) + TimeSerial(5, 0, 0)
     
    VTrancheHoraire = ChampVacationFormulaire
    Select Case VTrancheHoraire
    Case "Matin" 'A faire correctement si string ou numérique VTrancheHoraire
        VJourneeDebut = CDate(Texte_journee) + TimeSerial(5, 0, 0)
        VJourneeFin = CDate(Texte_journee) + TimeSerial(12, 30, 0)
     
    Case "Apres_Midi"
        VJourneeDebut = CDate(Texte_journee) + TimeSerial(12, 30, 0)
        VJourneeFin = CDate(Texte_journee) + TimeSerial(19, 30, 0)
     
    Case "Nuit"
        VJourneeDebut = CDate(Texte_journee) + TimeSerial(19, 30, 0)
        VJourneeFin = (CDate(Texte_journee) + 1) + TimeSerial(5, 0, 0)
     
    Case "Journee_Complete"
        VJourneeDebut = CDate(Texte_journee) + TimeSerial(5, 0, 0)
        VJourneeFin = (CDate(Texte_journee) + 1) + TimeSerial(5, 0, 0)
     
     
    With Me.Listerecirculation
    .RowSourceType = "Table/Requête"
    .ColumnCount = 8 ' nombre de colonne que dois avoir le formulaire intitulé "Listerecirculation"
    .BoundColumn = 1 ' la colonne de reference
     
    strSQLSELECT = "SELECT dbo_vwParts.DisplayName, Count(dbo_vwItemEventHistory.ItemID) AS CompteDeItemID, [table_Affich-general].DESTINATION, [table_Affich-general].[Nom Porte principale], [table_Affich-general].Type, CVDate(Fix(([EventTime]-5/24))) AS journee, MonthName(Month(FormatDateTime([EventTime]-5/24))) AS Mois, Year(CVDate(Fix(dbo_vwItemEventHistory!EventTime-5/24))) AS année, [table_Affich-general].Département, WeekdayName((Weekday((FormatDateTime((CVDate(Fix(([EventTime]-5/24)))))))),0,1) AS [jour semaine], DatePart('ww',CVDate(Fix(([EventTime]-5/24))),2,2) AS n°semaine" & vbCrLf & _
     "FROM (dbo_vwItemEventHistory INNER JOIN dbo_vwParts ON dbo_vwItemEventHistory.PartID = dbo_vwParts.ID) INNER JOIN [table_Affich-general] ON dbo_vwParts.DisplayName = [table_Affich-general].[Chute (format access)]"
     
    strSQLWHERE = "WHERE (((dbo_vwItemEventHistory.EventTime) BETWEEN #" & VJourneeDebut & "# And  #" & VJourneeFin & "# "
     
    strSQLGROUPBY = "GROUP BY dbo_vwParts.DisplayName, [table_Affich-general].DESTINATION, [table_Affich-general].[Nom Porte principale], [table_Affich-general].Type, CVDate(Fix(([EventTime]-5/24))), MonthName(Month(FormatDateTime([EventTime]-5/24))), Year(CVDate(Fix(dbo_vwItemEventHistory!EventTime-5/24))), [table_Affich-general].Département, WeekdayName((Weekday((FormatDateTime((CVDate(Fix(([EventTime]-5/24)))))))),0,1), DatePart('ww',CVDate(Fix(([EventTime]-5/24))),2,2), dbo_vwItemEventHistory.ItemEventTypeID, dbo_vwItemEventHistory.ResultTypeID"
     
    strSQLHAVING = "HAVING (((dbo_vwItemEventHistory.ItemEventTypeID) = 4) And ((dbo_vwItemEventHistory.ResultTypeID) = 23))"
     
    strSQLORDERBY = "ORDER BY CVDate(Fix(([EventTime]-5/24))) DESC;"
     
     
     
    txt_ChaineSQL = strSQLSELECT & vbCrLf & _
                    strSQLWHERE & vbCrLf & _
                    strSQLGROUPBY & vbCrLf & _
                    strSQLHAVING & vbCrLf & _
                    strSQLORDERBY
     
     
    .RowSource = txt_ChaineSQL
    .Requery
     
    MsgBox txt_ChaineSQL
     
    End With
     
     
    End Sub

  13. #13
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 469
    Par défaut
    Lorsque je construis un Statement SQL comme tu le fais ici, je ne mets pas les vbcrlf. Je ne sais pas si cela fera la difference mais tu peux essayer sans ceux-ci.

    En outre, lorsque j'ai un probleme de contruction de statemet SQL semblable au tien, j'utilise un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    debug.print txt_ChaineSQL
    Cela me permet souvent de corriger l'une ou l'autre erreur.

  14. #14
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 469
    Par défaut
    Je vois que tu utilises un SELECT CASE ... mais je ne vois pas de END SELECT.

  15. #15
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    madefemere
    J'ai copié ma requete sql défaillante et je l'ai éxécute .
    j'ai fait une impression d'écran pour te montrer le type d'erreur qui s'affiche.
    c'est le doc joint.
    je ne sais pas envoyer l'impression d'écran directement.
    Fichiers attachés Fichiers attachés

  16. #16
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    c'est un oublie lorque j'ai copie le code.
    le
    End Select
    est bien dans mon code.

    La difficulté est que je n'ai pas de message d'erreur lorsque j 'éxecute le code.

  17. #17
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 469
    Par défaut
    C'est pas toujours facile de corriger un statement SQL....
    Ce que je fais dans ces cas là, c'est de simplifier le statement en supprimant, un champ ou un critère jusqu'à ce que cela fonctionne. Cela me permets de voir quel champ ou critère cause le probleme.

    Ce que tu peux auusi faire, c'est utiliser la vue graphique pour construire ta query. Lorsque ta query fonctionnera, regarde le statement SQL et compare avec celui que tu as pour le moment.

  18. #18
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    pipo, peux tu t'expliquer..lorsque tu dis
    Ce que tu peux auusi faire, c'est utiliser la vue graphique pour construire ta query. Lorsque ta query fonctionnera, regarde le statement SQL et compare avec celui que tu as pour le moment

  19. #19
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 469
    Par défaut
    Oui, tu essayes de refaire manuellement ce que ta SUB construit automatiquement. Ce que je veux dire c'est que tu peux essayer de construire une query où te vas prendre la table vWItemEvent History, la table (ou vue) vWPARTS. Tu vas constuire le lien en cliquant PARTID pour construire le lien et voir la petite ligne sur l'écran entre tes deux tables / vues. Tu vas selectionner les champs pour qu'ils apparaissent dans la partie inferieure de l'ecran, tu vas introduire tes critères sur les date avec le BETWEEN.....
    Personnellement, je trouve plus facile de travailler avec l'écran graphique pour contruire mes queries. Quand tu travailles avec la vue graphique, MS Access ecrit le statement SQL sans erreur de syntaxe. Une fois que j'ai une query satisfaisante, je copie le statement SQL vers VBA et je le retravaille en chaine de caractères comme tu l'as fait avec ta txt_ChaineSQL. Biensur, il y a des ajustements (laisser tomber le dbo_ , utiliser ' plutôt que " pour les critères de recherche, laisser tomber le ; de la fin, s'assurer qu'il n'y a pas de ' dans les variables issues de ton traitement).

    Bonne journée,

  20. #20
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Pipo, lorsque tu dis
    Personnellement, je trouve plus facile de travailler avec l'écran graphique pour contruire mes queries
    qu est ce que tu sous entend spar l'écran graphique ?
    veux tu parler du mode "création de le requete" ou autre chose ?

Discussions similaires

  1. Champ date vidé par vba
    Par clickandgo dans le forum IHM
    Réponses: 4
    Dernier message: 21/03/2016, 16h03
  2. Récupérer la valeur d'un champ date pour un calcul en VBA
    Par dede tabby dans le forum VBA Word
    Réponses: 6
    Dernier message: 14/09/2011, 15h08
  3. Insertion champ date en VBA dans Access
    Par spud96 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 23/06/2010, 16h49
  4. [VBA DAO]Enregistrer un champs Date
    Par Bejarid dans le forum VBA Access
    Réponses: 3
    Dernier message: 01/09/2008, 14h24
  5. VBA - champs Date
    Par Terminator dans le forum Access
    Réponses: 3
    Dernier message: 15/02/2007, 01h31

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