Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Modélisation
Modélisation Le forum qui vous aide à résoudre vos questions relatives à la modélisation (tables et relations) de votre base de données sous Access. Pour les états et les formulaires, postez dans le forum IHM.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/06/2011, 14h20   #1
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 10
Points : 2
Points : 2
Par défaut Importer des données depuis un fichier texte

Bonjour,
je dispose de plusieurs dizaines de fichiers texte dans lesquels sont inscrits des milliers de mesures par des capteurs.
Le format des fichiers texte se présente comme suit :
4 colonnes (temps, Min, Max, Moyenne) répétées 240 fois (il y a 240 capteurs) et plusieurs milliers de lignes(une ligne toutes les 17 secondes).

J'aimerai créer une table par capteur (soit 240 tables ) avec dans chaque table les colonnes Temps, Min, Max et Moyenne. Il faut donc que pour chaque fichier texte je puisse récupérer les 4 colonnes correspondantes au capteur. J'ai essayé d'importer un fichier texte dans access : premier problème, mon fichier texte est trop large (240*4 colonnes!). Y a-t-il une solution avec access?

Une fois le fichier texte importer (appelons le Table1), j'aimerai donc créer 240 tables, sélectionner les colonnes appropriées dans Table1 et les coller dans l'une des 240 tables.
Je suis débutant sur access. Est-ce possible de faire ceci seulement avec des requêtes sql (je connais le langage ) ou dois-je utiliser VBE (je ne connais pas du tout le langage et les fonctions ) ? Comme il y a beaucoup de fichiers texte et beaucoup de tables, j'aimerai "automatiser" au maximum le traitement des données.

Merci d'avance pour tous vos conseils.

Even
Piedbaguette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 15h57   #2
Membre Expert
 
Homme Jacques Petiot
Indépendant développeur et formateur
Inscription : octobre 2007
Messages : 891
Détails du profil
Informations personnelles :
Nom : Homme Jacques Petiot
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Indépendant développeur et formateur
Secteur : Conseil

Informations forums :
Inscription : octobre 2007
Messages : 891
Points : 1 333
Points : 1 333
hello
c'est bien possible, mais à mon sens, uniquement en VBA, le programme devrait être assez court
par contre, je te conseille de tout mettre dans une seule table:
N°capteur,temps, Min, Max, Moyenne
ça sera beaucoup plus simple à manipuler et tu retrouvera par requête simple, le capteur de ton choix
à plus pour les détails du VB
__________________
-------------------Simplifi----------comme si tout était simple--------
Simplifi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 16h42   #3
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 10
Points : 2
Points : 2
OK, merci bien du conseil! je vais m'atteler au langage VBA alors.

Et concernant le trop grand nombre de colonnes de mon fichier texte, est-ce possible de l'importer en totalité? ou dois-je, lors de l'importation, décocher les (240*4)-4 soit 956 colonnes qui ne m'intéressent pas?
Piedbaguette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2011, 08h43   #4
Membre Expert
 
Homme Jacques Petiot
Indépendant développeur et formateur
Inscription : octobre 2007
Messages : 891
Détails du profil
Informations personnelles :
Nom : Homme Jacques Petiot
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Indépendant développeur et formateur
Secteur : Conseil

Informations forums :
Inscription : octobre 2007
Messages : 891
Points : 1 333
Points : 1 333
Hello
en programmation, on va lire des enregistrements (d'une certaine longueur) ou des lignes complètes input ou line input
à toi de nous dire quelle est la forme du fichier texte, est ce que le nombre de chiffres est toujours le même ou pas? y a t il des séparateurs, genre ; ou , ou seulement un espace?
exemple de programmation: (j'ai mis le chemin dans ma table de paramêtres...)
Code :
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
Dim bidon As String 'texte pour lecture à vide
lieu_passage = DLookup("texte", "Parametres", "variable like 'lieu_échange'")
 
 
DoCmd.SetWarnings False
'
' Transfert des xxxxxxxxxxxx
'
nom_fich = lieu_passage & "acc_ascl.csv"
nom_fich_old = lieu_passage & "acc_ascl_old.csv"
If Len(Dir(nom_fich)) > 0 Then 'pour vérifier la présence du fichier
    Open nom_fich For Binary Access Read Lock Read As #1
    Line Input #1, bidon 'on lit la ligne de textes de titres et on s'en fout
'on va utiliser partiellement cette table pour éviter d'en créer une nouvelle, on la vide au paragraphe suivant
    DoCmd.RunSQL "Delete * from tempo"
    Set rs_fich = CurrentDb.OpenRecordset("tempo")
    With rs_fich
    Do
        .AddNew
        bidon = Input(1, #1) 'pour pouvoir lire le EOF qui suit le CrLf à la fin du fichier
        If EOF(1) Then Exit Do
        .Fields("CLIENT") = Input(7, #1)
        bidon = Input(3, #1) ' lecture de ";"
        .Fields("CHIFF AFFAIRES") = Input(7, #1)   ' on range dans la colonne CA 
        bidon = Input(3, #1) ' lecture de " Cr Lf
        On Error Resume Next
        .Update
    Loop Until EOF(1)
    Close #1
    .Close
    If Len(Dir(nom_fich_old)) > 0 Then Kill nom_fich_old
    FileCopy nom_fich, nom_fich_old
    Kill nom_fich
End With
End If
dans ce prog, je ne fais qu'ouvrir un fichier .csv, le lire, et assigner les valeurs lues à un recordset (une table 'tempo')
à l'intérieur de ce programme, on peut bien gérer une boucle sur les 240x4 valeurs et traiter les caractères lus comme on veut
on peut rajouter le N° de capteur, le rang de la lecture, etc...

à bientôt
__________________
-------------------Simplifi----------comme si tout était simple--------
Simplifi est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/06/2011, 15h13   #5
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 10
Points : 2
Points : 2
Bonjour!
Merci beaucoup pour tes informations.

J'ai lu quelques tutoriels du langage VBA mais je n'arrive tout de même pas à comprendre ton code. J'ai remarqué que dans des sujets similaires sur le forum, les messages parlaient souvent de la fonction "DoCmd.TransferText acImportDelim" mais je n'arrive pas à comprendre la syntaxe ni le sens des différents arguments.

Mes fichiers texte sont de la forme suivante :

Séparateur : tabulation

1ère colonne : nombre réel représentant le nombre de secondes écoulées depuis le 01/01/1904 00:00:00 jusqu'au moment de l'acquisition de la mesure : exemple : 3343737137.0650 (toujours 4 chiffres après la virgule)
2ème,3ème et 4ème colonne : un réel :exemple : 18.5857 (toujours 4 chiffres après la virgule)
Les 4 colonnes sont répétées 240 fois ( donc la 5ème est du même type que la première).
Le nombre de lignes est différent pour chaque fichier texte.

Je ne suis pas feignant mais il y a vraiment beaucoup de tutoriels et je n'arrive même pas à voir lesquels se rapprochent de mon projet. Est-ce que ceux du thème "Accès aux données ==> Avec Requêtes; Avec DAO; Avec ADO" etc sont intéressants pour moi?

Dans tous les cas merci pour les efforts que vous faites!
Piedbaguette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 08h14   #6
Rédacteur/Modérateur
 
Avatar de Philippe JOCHMANS
 
Homme Philippe JOCHMANS
Développeur informatique
Inscription : mai 2005
Messages : 17 616
Détails du profil
Informations personnelles :
Nom : Homme Philippe JOCHMANS
Âge : 44
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Communication - Médias

Informations forums :
Inscription : mai 2005
Messages : 17 616
Points : 30 954
Points : 30 954
Envoyer un message via MSN à Philippe JOCHMANS Envoyer un message via Skype™ à Philippe JOCHMANS
Bonjour

Tu ne pourras jamais mettre autant de colonne dans une table Access, la limite est de 250.

Il faut décomposer le tout en plusieurs tables.

Philippe
__________________
Détaillez vos questions, sinon vous aurez des réponses erronées et vous irez tout droit dans le et lisez les règles sinon
Si vous pensez commencer sans un livre, oublier : livres pour débuter
Vous pouvez consulter mes articles sur Access et PowerPoint
Le blog Office.

Inutile de m'envoyer un MP pour des questions techniques ou de me relancer , je n'y répondrais pas.
Philippe JOCHMANS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 21h27   #7
Membre Expert
 
Homme Jacques Petiot
Indépendant développeur et formateur
Inscription : octobre 2007
Messages : 891
Détails du profil
Informations personnelles :
Nom : Homme Jacques Petiot
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Indépendant développeur et formateur
Secteur : Conseil

Informations forums :
Inscription : octobre 2007
Messages : 891
Points : 1 333
Points : 1 333
Hello
bonjour à tous
désolé Philippe mais pour le coup, je pense à une table à 6 colonnes:
N°capteur (en espérant qu'ils soient toujours dans le même ordre)
Temps
min
max
moyenne

ce qui permet bien de retrouver toutes les mesures dans une seule table....

la commande TransfertText (pour laquelle, on pourrait te donner des explications et des exemples) ne peut traiter ton cas, fichier texte trop large, trop de colonnes, etc

par contre rien n'interdit d'ouvrir le fichier par open "fichier" as #1
et de lire les caractères l'un après l'autre, puis ensuite de traiter cette lecture comme bon nous semble

Je serais preneur d'un exemple tronqué (juste 5 capteurs et 10 lignes) pour vérifier la faisabilité
Autre info: quelle est la taille globale de tes fichiers texte? si >2Go alors problème....
__________________
-------------------Simplifi----------comme si tout était simple--------
Simplifi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 13h15   #8
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 10
Points : 2
Points : 2
Bonjour,

Les numéros de capteur sont toujours dans le même ordre donc c'est déjà un bon point

La taille des fichiers va de moins de 1mo à 200Mo donc je pense qu'il n'y aura pas de soucis de ce côté là.
Voici un morceau de mes fichiers texte, 5 colonnes, 10 lignes. Les séparateurs sont des tabulations.

3346395405.4965 7.3234 -7.1558 -0.0032 3346395405.4965
3346395473.7625 7.3234 -7.1558 0.023 3346395473.7625
3346395542.0285 7.1726 -7.3066 0.0278 3346395542.0285
3346395610.2944 7.1726 -7.1558 -0.0418 3346395610.2945
3346395678.5604 5.966 -5.9492 0.018 3346395678.5604
3346395746.8264 7.1726 -7.005 0.0074 3346395746.8264
3346395815.0924 6.8709 -6.4017 0.0118 3346395815.0924
3346395883.3584 6.1168 -5.9492 0.0415 3346395883.3584
3346395951.6244 5.966 -5.9492 0.0191 3346395951.6244
3346396019.8903 5.966 -5.9492 0.046 3346396019.8904

Merci pour toutes vos infos! J'avance lentement mais au moins j'avance!!!
Piedbaguette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 14h22   #9
Membre Expert
 
Homme Jacques Petiot
Indépendant développeur et formateur
Inscription : octobre 2007
Messages : 891
Détails du profil
Informations personnelles :
Nom : Homme Jacques Petiot
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Indépendant développeur et formateur
Secteur : Conseil

Informations forums :
Inscription : octobre 2007
Messages : 891
Points : 1 333
Points : 1 333
Hello
petit prog à venir d'ici 2 à 3 jours
__________________
-------------------Simplifi----------comme si tout était simple--------
Simplifi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 14h50   #10
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 10
Points : 2
Points : 2
En algo, le programme que je voudrais réaliser ressemblerait à ça :

Ouverture d'une boîte de dialogue où on rentre l'adresse du fichier texte
Récupération de l'adresse du fichier
Ouverture du fichier
Compter le nombre de lignes = N
Pour i allant de 0 à 239 :
Mettre i+1 dans le champ Numéro_de_Capteur sur N lignes dans la Table Mesures
Mettre la colonne 4*i+1 dans le champ Temps dans la table Mesures
Mettre la colonne 4*i+2 dans le champ Max dans la table Mesures
Mettre la colonne 4*i+3 dans le champ Min dans la table Mesures
Mettre la colonne 4*i+4 dans le champ Moyenne dans la table Mesures
Fin de la procédure
Fin du programme
Piedbaguette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 22h26   #11
Membre Expert
 
Homme Jacques Petiot
Indépendant développeur et formateur
Inscription : octobre 2007
Messages : 891
Détails du profil
Informations personnelles :
Nom : Homme Jacques Petiot
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Indépendant développeur et formateur
Secteur : Conseil

Informations forums :
Inscription : octobre 2007
Messages : 891
Points : 1 333
Points : 1 333
Hello
à la programmation, je me rends compte que pour tester un peu j'ai besoin de 5 capteurs soit 20 colonnes
De plus, pour dimensionner les tables au mieux, il est utile de savoir quelles sont les grandeurs mesurées: à combien peut monter le max, on ne prendra pas les mêmes types de données si max = 10 ou si max = 100000000000
le coeur du prog devrait tenir en quelques lignes

edit: j'ai oublié de demander en quelle version tu veux la base: mdb ou accdb, version avant Access 2007 ou après?
__________________
-------------------Simplifi----------comme si tout était simple--------
Simplifi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 10h44   #12
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 10
Points : 2
Points : 2
Bonjour,
les grandeurs mesurées sont de trois types : capteur de déformation, capteur de déplacement, capteur de force. Du coup les valeurs sont très variables mais pour l'ensemble des capteurs les valeurs sont comprises dans l'intervalle [-10000;+10000] que ce soit, pour le Max, le Min et donc la Moyenne.
Pour le Temps la plus faible valeur est : 3343737137.0650
Et la valeur la plus grande est : 3385971836.3509
Comme la base de données peut être complétée si d'autres mesures sont effectuées, la valeur la plus grande du Temps est susceptible de changer.

J'utilise Access 2003 et enregistre ma base de données en .mdb

Je joint un petit fichier de mesures si tu veux faire des tests sur ton code.

Merci encore pour tous vos conseils et vos efforts!
Fichiers attachés
Type de fichier : xls Mesures_Piedbaguette.xls (19,5 Ko, 1 affichages)
Piedbaguette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 10h56   #13
Membre Expert
 
Homme Jacques Petiot
Indépendant développeur et formateur
Inscription : octobre 2007
Messages : 891
Détails du profil
Informations personnelles :
Nom : Homme Jacques Petiot
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Indépendant développeur et formateur
Secteur : Conseil

Informations forums :
Inscription : octobre 2007
Messages : 891
Points : 1 333
Points : 1 333
hello
SVP
Citation:
j'ai besoin de 5 capteurs soit 20 colonnes
programme dispo dès ce soir
__________________
-------------------Simplifi----------comme si tout était simple--------
Simplifi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 19h44   #14
Membre Expert
 
Homme Jacques Petiot
Indépendant développeur et formateur
Inscription : octobre 2007
Messages : 891
Détails du profil
Informations personnelles :
Nom : Homme Jacques Petiot
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Indépendant développeur et formateur
Secteur : Conseil

Informations forums :
Inscription : octobre 2007
Messages : 891
Points : 1 333
Points : 1 333
Hello
commence bien par fixer le nb de capteur de ton fichier texte
normalement, je livre mes bases sans mode d'emploi
Simplifi est un peu synonyme d'intuitif

A plus
Fichiers attachés
Type de fichier : zip Premier_essai.zip (41,4 Ko, 7 affichages)
__________________
-------------------Simplifi----------comme si tout était simple--------
Simplifi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2011, 10h41   #15
Membre Expert
 
Homme Jacques Petiot
Indépendant développeur et formateur
Inscription : octobre 2007
Messages : 891
Détails du profil
Informations personnelles :
Nom : Homme Jacques Petiot
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Indépendant développeur et formateur
Secteur : Conseil

Informations forums :
Inscription : octobre 2007
Messages : 891
Points : 1 333
Points : 1 333
Hello
pour ceux qui ne veulent pas charger la base j'aurais pu mettre le VB pour montrer le programme
j'ai seulement mis trois boutons sur le formulaire de démarrage:
farfouiller (équivalent de browse) pour chercher le fichier de mesures
charger pour le mettre dans la table
voir pour visualiser le tableau d'un capteur et/ou celui des 240 capteurs à un moment donné
Code :
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
 
Private Sub Charger_Click()
Dim Car As String, Chaîne As String, Demi_Date As Date, Date_Mesure As Date
Dim Rst As DAO.Recordset
If Len(Dir(Répertoire & Fichier)) > 0 Then
    Open Répertoire & Fichier For Input As #1
End If
Set Rst = CurrentDb.OpenRecordset("Table_Mesures")
With Rst
Do
    Do Until Car = vbTab
    On Error GoTo Sortie
    Car = Input(1, #1)
    Chaîne = Chaîne & Car
    Loop
    Demi_Date = DateAdd("s", Int(Replace(Chaîne, ".", ",") / 2), #1/1/1904#)
    Date_Mesure = DateAdd("s", Int(Replace(Chaîne, ".", ",") / 2), Demi_Date)
    For i = 1 To NbCapteurs
        .AddNew
        .Fields(0) = i
        .Fields(1) = Date_Mesure
        Chaîne = ""
        Car = ""
        Do Until Car = vbTab
            Car = Input(1, #1)
            Chaîne = Chaîne & Car
        Loop
       .Fields(2) = CDbl(Replace(Chaîne, ".", ","))
        Chaîne = ""
        Car = ""
        Do Until Car = vbTab
            Car = Input(1, #1)
            Chaîne = Chaîne & Car
        Loop
        .Fields(3) = CDbl(Replace(Chaîne, ".", ","))
        Chaîne = ""
        Car = ""
        Do Until Car = vbTab
            Car = Input(1, #1)
            If Car = Chr(13) Then Exit Do
            Chaîne = Chaîne & Car
        Loop
        .Fields(4) = CDbl(Replace(Chaîne, ".", ","))
        Chaîne = ""
        Car = ""
        .Update
    Next i
Loop
Sortie:
End With
Close #1
End Sub
 
Private Sub Farfouiller_Click()
If IsNull(Répertoire) Then
    Répertoire = OuvrirUnFichier(Me.Hwnd, "Où est le ficher contenant les enregistrements?", 1)
    Répertoire = Left(Répertoire, Len(Répertoire) - Len(Dir(Répertoire)))
    Fichier = Dir(Répertoire)
Else
    Répertoire = OuvrirUnFichier(Me.Hwnd, "Où est le ficher contenant les enregistrements?", 1, , , Répertoire)
    Répertoire = Left(Répertoire, Len(Répertoire) - Len(Dir(Répertoire)))
    Fichier = Dir(Répertoire)
End If
End Sub
 
Private Sub Fichier_DblClick(Cancel As Integer)
Farfouiller_Click
End Sub
 
Private Sub Répertoire_DblClick(Cancel As Integer)
Farfouiller_Click
End Sub
 
Private Sub Voir_Click()
If Temps_sélectionné > 0 Then
    DoCmd.OpenQuery "Un_temps"
    DoCmd.MoveSize 1000, 0, 3000, 6000
End If
If Capteur_sélectionné > 0 Then
    DoCmd.OpenQuery "Un_capteur"
    DoCmd.MoveSize 4000, 0, 3000, 6000
End If
End Sub
et puis un module (merci developpez.net)
Code :
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
Option Compare Database
Option Explicit
 
 'Déclaration de l'API
 'Private Declare Sub PathStripPath Lib "shlwapi.dll" Alias "PathStripPathA" (ByVal pszPath As String)
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
                   "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
 
 'Structure du fichier
Private Type OPENFILENAME
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    lpstrFilter As String
    lpstrCustomFilter As String
    nMaxCustFilter As Long
    nFilterIndex As Long
    lpstrFile As String
    nMaxFile As Long
    lpstrFileTitle As String
    nMaxFileTitle As Long
    lpstrInitialDir As String
    lpstrTitle As String
    flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    lpstrDefExt As String
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As String
End Type
 
 'Constantes
Private Const OFN_READONLY = &H1
Private Const OFN_OVERWRITEPROMPT = &H2
Private Const OFN_HIDEREADONLY = &H4
Private Const OFN_NOCHANGEDIR = &H8
Private Const OFN_SHOWHELP = &H10
Private Const OFN_ENABLEHOOK = &H20
Private Const OFN_ENABLETEMPLATE = &H40
Private Const OFN_ENABLETEMPLATEHANDLE = &H80
Private Const OFN_NOVALIDATE = &H100
Private Const OFN_ALLOWMULTISELECT = &H200
Private Const OFN_EXTENSIONDIFFERENT = &H400
Private Const OFN_PATHMUSTEXIST = &H800
Private Const OFN_FILEMUSTEXIST = &H1000
Private Const OFN_CREATEPROMPT = &H2000
Private Const OFN_SHAREAWARE = &H4000
Private Const OFN_NOREADONLYRETURN = &H8000
Private Const OFN_NOTESTFILECREATE = &H10000
 
Private Const OFN_SHAREFALLTHROUGH = 2
Private Const OFN_SHARENOWARN = 1
Private Const OFN_SHAREWARN = 0
 
 
Public Function OuvrirUnFichier(Handle As Long, _
                                Titre As String, _
                                TypeRetour As Byte, _
                                Optional TitreFiltre As String, _
                                Optional TypeFichier As String, _
                                Optional RepParDefaut As String) As String
 'OuvrirUnFichier est la fonction a utiliser dans votre formulaire pour ouvrir
 'la boîte de dialogue de sélection d'un fichier.
 'Explication des paramètres
    'Handle = le handle de la fenêtre (Me.Hwnd)
    'Titre = Titre de la boîte de dialogue
    'TypeRetour (Définit la valeur, de type String, renvoyée par la fonction)
        '1 = Chemin complet + Nom du fichier
        '2 = Nom fichier seulement
    'TitreFiltre = Titre du filtre
        'Exemple: Fichier Access
        'N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
    'TypeFichier = Extention du fichier (Sans le .)
        'Exemple: MDB
        'N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
    'RepParDefaut = Répertoire d'ouverture par defaut
        'Exemple: C:\windows\system32
        'Si vous laissé l'argument vide, par defaut il se place dans le répertoire de votre application
 
Dim StructFile As OPENFILENAME
Dim sFiltre As String
 
 'Construction du filtre en fonction des arguments spécifiés
If Len(TitreFiltre) > 0 And Len(TypeFichier) > 0 Then
  sFiltre = TitreFiltre & " (" & TypeFichier & ")" & Chr$(0) & "*." & TypeFichier & Chr$(0)
End If
sFiltre = sFiltre & "Tous (*.*)" & Chr$(0) & "*.*" & Chr$(0)
 
 
 'Configuration de la boîte de dialogue
  With StructFile
    .lStructSize = Len(StructFile) 'Initialisation de la grosseur de la structure
    .hwndOwner = Handle 'Identification du handle de la fenêtre
    .lpstrFilter = sFiltre 'Application du filtre
    .lpstrFile = String$(254, vbNullChar) 'Initialisation du fichier '0' x 254
    .nMaxFile = 254 'Taille maximale du fichier
    .lpstrFileTitle = String$(254, vbNullChar) 'Initialisation du nom du fichier '0' x 254
    .nMaxFileTitle = 254  'Taille maximale du nom du fichier
    .lpstrTitle = Titre 'Titre de la boîte de dialogue
    .flags = OFN_HIDEREADONLY  'Option de la boite de dialogue
 
    'indique le repertoire par défaut
    If ((IsNull(RepParDefaut)) Or (RepParDefaut = "")) Then
        RepParDefaut = CurrentDb.Name
    Else
        .lpstrInitialDir = RepParDefaut
    End If
  End With
 
If (GetOpenFileName(StructFile)) Then 'Si un fichier est sélectionné
    Select Case TypeRetour
      Case 1: OuvrirUnFichier = Trim$(Left(StructFile.lpstrFile, InStr(1, StructFile.lpstrFile, vbNullChar) - 1))
      Case 2: OuvrirUnFichier = Trim$(Left(StructFile.lpstrFileTitle, InStr(1, StructFile.lpstrFileTitle, vbNullChar) - 1))
    End Select
End If
 
End Function
__________________
-------------------Simplifi----------comme si tout était simple--------
Simplifi est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/07/2011, 10h47   #16
Membre Expert
 
Homme Jacques Petiot
Indépendant développeur et formateur
Inscription : octobre 2007
Messages : 891
Détails du profil
Informations personnelles :
Nom : Homme Jacques Petiot
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Indépendant développeur et formateur
Secteur : Conseil

Informations forums :
Inscription : octobre 2007
Messages : 891
Points : 1 333
Points : 1 333
Avec mes excuses, j'avais pas vu le fichier Excel en réponse à la demande de 5 capteurs et j'en ai bricolé 1,
par contre j'ai bricolé comme si le stemps n'était là qu'une seule fois au début de chaque ligne
je vais donc modifier légèrement le VB

edit: le voilà, seule la routine charger a changée
Code :
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
Private Sub Charger_Click()
Dim Car As String, Chaîne As String, Demi_Date As Date, Date_Mesure As Date
Dim Rst As DAO.Recordset
If Len(Dir(Répertoire & Fichier)) > 0 Then
    Open Répertoire & Fichier For Input As #1
End If
Set Rst = CurrentDb.OpenRecordset("Table_Mesures")
With Rst
Do
    For i = 1 To NbCapteurs
        .AddNew
        .Fields(0) = i
        Do Until Car = vbTab
            On Error GoTo Sortie
            Car = Input(1, #1)
            Chaîne = Chaîne & Car
        Loop
        Demi_Date = DateAdd("s", Int(Replace(Chaîne, ".", ",") / 2), #1/1/1904#) 'ajout de la date en deux fois car dépassement de capacité
        Date_Mesure = DateAdd("s", Int(Replace(Chaîne, ".", ",") / 2), Demi_Date)
        .Fields(1) = Date_Mesure
        Chaîne = ""
        Car = ""
        Do Until Car = vbTab
            Car = Input(1, #1)
            Chaîne = Chaîne & Car
        Loop
       .Fields(2) = CDbl(Replace(Chaîne, ".", ","))
        Chaîne = ""
        Car = ""
        Do Until Car = vbTab
            Car = Input(1, #1)
            Chaîne = Chaîne & Car
        Loop
        .Fields(3) = CDbl(Replace(Chaîne, ".", ","))
        Chaîne = ""
        Car = ""
        Do Until Car = vbTab
            Car = Input(1, #1)
            If Car = Chr(13) Then Exit Do
            Chaîne = Chaîne & Car
        Loop
        .Fields(4) = CDbl(Replace(Chaîne, ".", ","))
        Chaîne = ""
        Car = ""
        .Update
    Next i
Loop
Sortie:
End With
Close #1
End Sub
__________________
-------------------Simplifi----------comme si tout était simple--------
Simplifi est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/07/2011, 11h45   #17
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 10
Points : 2
Points : 2
Bonjour!
Merci beaucoup! C'est génial, ça fonctionne!
C'était bien au dessus de mes capacités de débutants!

Quelle est la modification à apporter dans la routine charger pour ne s'occuper que des 156 premiers capteurs?
Piedbaguette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 12h36   #18
Membre Expert
 
Homme Jacques Petiot
Indépendant développeur et formateur
Inscription : octobre 2007
Messages : 891
Détails du profil
Informations personnelles :
Nom : Homme Jacques Petiot
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Indépendant développeur et formateur
Secteur : Conseil

Informations forums :
Inscription : octobre 2007
Messages : 891
Points : 1 333
Points : 1 333
Hello
aucune modification de programmation
il suffit de taper 156 dans le formulaire à NbCapteurs
__________________
-------------------Simplifi----------comme si tout était simple--------
Simplifi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 14h44   #19
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 10
Points : 2
Points : 2
Re!


Petites explications : pour des raisons expérimentales, certains capteurs ont été enlevés/remplacés à partir d'une certaine date. On retire 84 capteurs et on en remet 30 nouveau. Donc les 240-84=156 premières colonnes sont les mêmes capteurs. Les 30 dernières colonnes sont nouvelles. Ces nouveaux capteurs étant mal configurés les colonnes temps sont remplies de zéros. La colonne Minimum ( donc la colonne Moyenne) présente des valeurs incohérentes de l'ordre de -10^41. J'aimerai donc ne pas importer ces 30*4 dernières colonnes.
Je joint un fichier texte en exemple.

Je pense que l'importation s'arrête à cause d'une erreur car que je choisisse NbCapteurs=156 ou NbCapteurs=240 il n'importe que les 156 premiers capteurs de la première ligne.


Voilà ce que j'ai compris de la routine "Charger" :
On déclare les variables, on ouvre une table tempo.
On met i dans le champ 1.
On lit, caractère après caractère le fichier texte en concaténant les caractères jusqu'à la tabulation suivante. On convertis le string en date ou numérique. On le met dans le champs correspondant.

Mes questions :
-Une fois la boucle for terminée (i=240), on vient de terminé de lire la première ligne. Comment le programme fait pour passer à la ligne suivante?
-Pourquoi n'y a-t-il pas de condition d'exécution à la boucle "Do" qui englobe la boucle "for"? A quoi sert-elle?
-A quoi servent les commandes ".AddNew" et ".Update"?

C'est un peu le bazarre et je ne vous en voudrai pas d'abandonner mon affaire vu tout ce que vous avez fait pour moi!
Merci encore
Fichiers attachés
Type de fichier : txt exemple_Piedbaguette.txt (58,4 Ko, 2 affichages)
Piedbaguette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 17h45   #20
Membre Expert
 
Homme Jacques Petiot
Indépendant développeur et formateur
Inscription : octobre 2007
Messages : 891
Détails du profil
Informations personnelles :
Nom : Homme Jacques Petiot
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Indépendant développeur et formateur
Secteur : Conseil

Informations forums :
Inscription : octobre 2007
Messages : 891
Points : 1 333
Points : 1 333
Hello
Citation:
On déclare les variables, on ouvre une table tempo.
on n'ouvre pas de table temporaire mais:
- on ouvre le fichier à lire
- on ouvre la table "Table_Mesures" dans un recordset (un tableau immense facilement manipulable)
Citation:
Une fois la boucle for terminée (i=240), on vient de terminé de lire la première ligne. Comment le programme fait pour passer à la ligne suivante?
en fait, on s'arrête à 1 = nbcapteurs ce qui est censé donner la fin de la ligne et pour passer à la suivante, on teste si on trouve 'fin de ligne' chr(13) alors on sort de la boucle et comme i a atteint nbcapteurs, on boucle sur la grande boucle do par dessus la boucle for (c'est t'y pas clair...)
Citation:
-Pourquoi n'y a-t-il pas de condition d'exécution à la boucle "Do" qui englobe la boucle "for"? A quoi sert-elle?
la condition de sortie est "on error goto sortie" ce qui explique l'arrêt au 156° capteur
Citation:
-A quoi servent les commandes ".AddNew" et ".Update"?
c'est des commandes de recordset qui permettent de passer à un nouvel enregistrement (ici de la table) et de l'enregistrer. Elles vont avec "With Rst" c'est pourquoi elles commencent par un point

En fait, j'ai pas du tout blindé le programme pour qu'il reste simplissime (on ne peut pas se refaire), on pourrait peut être modifier la gestion d'erreur pour lui permettre de continuer à lire les 240 capteurs en n'écrivant rien si une erreur de conversion intervient dans l'un des champs

Je cherche un peu plus ce soir et je poste l'amélio
A+
__________________
-------------------Simplifi----------comme si tout était simple--------
Simplifi est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h07.


 
 
 
 
Partenaires

Hébergement Web