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 :

[ACCESS_2003]Conversion de plusieurs lignes d'un champs en heure minute seconde


Sujet :

VBA Access

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [ACCESS_2003]Conversion de plusieurs lignes d'un champs en heure minute seconde
    Bonjour,

    Après plusieurs jours de recherche dans ce forum et autre, je bloque toujours.
    Je souhaiterai convertir en heure minute seconde toutes les lignes d'un champs 'temps' appartenant à une table, qui sont actuellement en seconde. Pour cela, j'ai écrit un programme sous Matlab que j'ai adapté à un programme VBA trouvé sur le net. Je me retrouve avec une table et un code, mais je ne sais pas comment les lier?
    Ne connaissant pas très bien ACCESS, j'ai du mal à saisir la signification des formulaires, requêtes ...
    Dois je intégrer le champs temps et la table sous forme de boucle dans mon code? Ou dois je utiliser un bouton évenementiel avec un formulaire, ou faire une requête?
    Ma question est peut être tellement simple que je ne trouve pas de réponse dans les tutoriels.

    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
     
    Public Function ConvertirSSenHHMMSS(Valeur As Double) As String
     
        End Function
        On Error GoTo Erreur
     
        Dim Heures, Minutes, Secondes As Double
        Dim HeuresRest, MinutesRest, SecondesRest As Double
        Dim Resultat As Double
     
        s = 1
        m = 60                //60 secondes pour une minute
        h = 3600            // 3600 secondes pour une heure
     
        If T >= h Then   /// T correspond au champs temps dans la table
        Heures = Int(T / h)   
        HeuresRest = Format(Heures)
        Else
        Heures = 0
        End If
     
        T = T - (Heures * h)
     
        If Valeur >= m Then
        Minutes = Int(T / m)
        MinutesRest = Format(Minutes)
        Else
        Minutes = 0
        End If
     
        T = T - (Minutes * s)
     
        If T > 0 Then
        Secondes = T
        SecondesRest = Format(Secondes)
        Else
        Secondes = 0
        End If
     
        Resultat = HeuresRest & " " & MinutesRest & " " & SecondesRest
     
        Exit Function
    Je me rends compte que je ne spécifie pas la table que j'utilise, mais je ne sais pas si je peux le faire dans le code ?
    Je précise aussi que je dois obtenir le résultat sous forme de table pour faire une jointure avec d'autres tables.

    J'espère avoir été assez explicite.
    Merci par avance

  2. #2
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Bonjour.

    Il me semble inepte (excuse-moi si je te choque) de vouloir transformer des données temporelles en chaines de caractères. Tu ne pourras plus effectuer aucune opération de calcul sur ces données. Le mieux serait, à mon avis, de transfomer ces données en date/heure, puis d'adapter le format d'affichage du champ concerné ( et des contrôles des formulaires/états).

    En tenant compte de cela, et sachant que tes données sont en secondes et que tu veux les transformer en date/heure, il faut juste savoir (se souvenir) que Access stocke les dates/heures sous format numérique, les jours étant la partie entière de la valeur stockée, les heures étant la partie décimale.

    Il y a 3600 secondes dans 1 heure et 24 heures dans une journée, soit 86400 secondes dans une journée.

    Dès lors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sql = "udpate MaTable set Temps=Temps/86400"
    currentdb.execute sql
    Je sais que je ne réponds pas à ta question mais je trouve vraiment tordu de transformer cela en texte...

    Ok?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta réponse,
    Je me suis peut être mal expliqué, je ne veux pas transformer le temps en texte (peut être que le programe est mauvais);
    J'ai une première table d'à peu près 80 lignes avec un temps en seconde. D'un autre côté j'ai une seconde table de 500 lignes avec un temps en heure minute seconde. Si je prends un exemple, dans la première table, au point 4 j'ai T=46448,246 le programme me convertit T en T=125408,246 (format utilisé dans la seconde table) c'est à dire 12h 54min 8,246 s . Je pourrai ensuite joindre les 2 tables pour ne garder que les 80 lignes qui m'intéresse parmi les 500. Ensuite je pourrai récupérer 2 autres champs de la seconde table à partir de ce champs commun. Dans ma nouvelle table, j'aurai donc par exemple au point 4 , T=125408,246 , X= et Y= . Pour finir, je ne souhaite plus effectuer de calcul sur le temps, il me sert juste de lien, ce sont les 3 autres champs qui m'intéressent.

    Quand je mets cela ne veut pas dire que le résulat sera sous forme numérique?

    Si j'ai bien compris ton explication, Access me donne un résultat en date/heure ensuite je peux choisir le format d'affichage, mais est ce que ce format correspondra à celui que je souhaite obtenir ?

  4. #4
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Bonjour

    A ta place, j'utiliserais une requête de mise à jour sql

    En considérant que la table à mettre à jour s'appelle MaTable et que le champ contenant les secondes qui doit être transformé s'appelle Temps, tu pourrais utiliser la requête suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        Dim sql As String
        sql = "update matable set temps=(int(temps/3600)*10000)+(int((temps-(int(temps/3600)*3600))/60)*100)+(temps-((int(temps/3600)*3600)+(int((temps-(int(temps/3600)*3600))/60)*60)))"
        CurrentDb.Execute sql
    Si tu le souhaites, tu peux aussi copier le texte de la requête dans une nouvelle requête Access, à utiliser sans code vba... A toi de voir.

    J'ai testé, c'est ok chez moi. Fais toutefois une copie de ta table avant de lancer la requête

    Ok?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  5. #5
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci pour le code.

    J'ai tout de même un petit problème, j'ai crée une "requête mise à jour" où j'ai inséré le code mais il y a une erreur qui s'affiche ;"instruction sql non valide; DELET, INSERT, UPDATE .... attendus" , j'ai essayé de voir s'il ne manquait pas quelquechose mais vu que ça marche chez toi ....
    J'ai également essayé avec un formulaire avec un bouton évenementiel mais rien ne se passe. Il faut dire que je maîtrise très mal l'outil ...

    Aurais tu une idée du problème ?

  6. #6
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Vérifie que tu as bien repris tout le code, c'est-à-dire tout ce qui se trouve dans les guillemets.

    Si tu crées une requête de mise à jour, je te conseille de procéder comme suit
    - Crée une requête normale via Créer une requête en mode création (sans l'assistant).
    - Lorsqu'il propose la boite de dialogue de sélection des tables, clique sur fermer sans choisir de table.
    - Passe en mode de visualisation sql. Normalement, tu verras le texte Select;.
    - Sélectionne tout le texte et remplace-le par ce qui suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    update matable set temps=(int(temps/3600)*10000)+(int((temps-(int(temps/3600)*3600))/60)*100)+(temps-((int(temps/3600)*3600)+(int((temps-(int(temps/3600)*3600))/60)*60)))
    Modifie MaTable par le nom de ta table et temps par le nom du champ concerné. Il faut être très rigoureux et attentif lors de cette modification.
    Après, si tu lances ta requête, elle devrait fonctionner.

    Ok?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Génial ça marche!

    J'ai juste un fait quelques copier/coller, car ma table était importer d'un fichier excel et apparemment on ne peut pas effectuer de mise à jour sur une table lié à un fichier excel ou texte. Il faut également faire attention au format avant d'importer ...
    Mais j'ai réussi, merci beaucoup pour ton aide.

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

Discussions similaires

  1. [AC-2007] concaténer plusieurs lignes dans un champ
    Par rogerfon dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 28/03/2014, 09h21
  2. Réponses: 2
    Dernier message: 18/12/2009, 14h42
  3. Réponses: 2
    Dernier message: 21/09/2009, 14h20
  4. concaténer plusieurs lignes dans un champs
    Par papoulouis dans le forum SQL
    Réponses: 10
    Dernier message: 30/01/2009, 20h08
  5. fusionner plusieurs lignes d'un champs dans un select?
    Par gwena54 dans le forum Requêtes
    Réponses: 13
    Dernier message: 25/01/2008, 13h29

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