Base de données Access 2003

M6sou Messages postés 71 Statut Membre -  
M6sou Messages postés 71 Statut Membre -
Salut à tous et à toute !

Alors voilà, pour la suite de mon projet (en résumé : tri et concaténation de fichier .csv que je peux convertir en fichier .txt si besoin + implantation dans une base de donnnées), je dois implanter des fichiers .csv/.txt dans une base de données. Mon problème est le suivant :
Les fichiers que je dois insérer dans ma base de données sont de la forme suivante (<ETX> correspond à un nouveau test)

La table "Réglage" servira surtout pour l'IHM par la suite, pour le moment ce n'est pas mon principal problème. J'aimerais implanter tout mes fichiers mais en répartissant les données. Les fichiers sont long et, dans un fichier, il peut y avoir plusieurs test. Comment dire à une base de données de prendre les deux premières lignes d'un test de les mettre dans la table FICHIER et le reste dans MESURE et ceux jusqu'au prochain test pour recommencer l'opération ?

Merci pour vos indications, aides ou conseils,
Bonne journée !

5 réponses

Résumé de la discussion

L’objectif est d’importer des fichiers CSV/TXT en les séparant par des marqueurs ETX, les deux premières lignes de test allant dans FICHIER et les lignes suivantes dans MESURE jusqu’au prochain ETX.
Plusieurs intervenants proposent d’utiliser VBA avec DAO pour lire les fichiers ligne par ligne, détecter les ETX et alimenter trois tables distinctes (ETX, TEST, MESURE) via des recordsets et AddNew.
D’autres solutions évoquent l’import via Docmd.TransfertSpreadsheet ou l’emploi de Dir pour parcourir les fichiers, puis d’adapter les champs Nom, Unite, Valeur min et Valeur max.
En cas de complexité, il est utile d’anticipant l’interaction avec les libellés et les données variables par des expressions Like et des contrôles conditionnels, afin d’éviter les erreurs de correspondance et les doublons.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. blux Messages postés 2045 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Salut,

    une procédure d'importation de fichier en VBA me semble être la solution la plus appropriée pour ce faire...
    0
    1. M6sou Messages postés 71 Statut Membre
       
      Salut blux,

      Je vous avouerais que je craignais un peu cette réponse :D
      J'ai des bases en vba (surtout sous excel et word), mais sous access, je vous cache pas que je pars de loin je pense.
      Auriez vous un lien avec des tutos sous la main par hasard ?
      0
    2. blux Messages postés 2045 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      Pas de tutos, mais j'ai du répondre à un certain nombre de sujet comme celui-ci dans le forum, cherche un peu au niveau 'importation' avec mon pseudo. On verra sur quoi on tombe et on avisera/adaptera en conséquence...
      0
    3. M6sou Messages postés 71 Statut Membre
       
      https://forums.commentcamarche.net/forum/affich-27798728-importation-automatique-sous-access-vba

      J'ai trouvé ce sujet, pour lequel tu as aidé à la résolution, qui semble se rapprocher de mon sujet. Mais je ne vois pas comment l'adapter à mon problème.
      Existe-il une commande access qui permet de dire "si format xx-xx-xx mettre dans la table Fichier sous date" ou "si commencce par '&' mettre dans la tabke Mesure sous VBasse" par exemple ?
      0
    4. blux Messages postés 2045 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      Cette commande n'existera dans aucun langage, puisque c'est toi qui fixe les règles de gestion.
      Tu devras donc importer ton fichier dans une table temporaire, lire ensuite cette table et en fonction de ce que tu y trouves, faire les traitements que tu souhaites.
      Mais tu verras, c'est finalement assez simple.
      L'importation peut être faite grâce au code VBA du post qui tu as retrouvé (moyennant modifs...).
      Quant à la suite, elle consiste à 'jouer' avec les recordset (jeu d'enregistrement) et avec des fonctions de découpage de chaine pour extraire les données intéressantes mâtiné d'un peu de tests et de boucles... Si tu connais le VBA, rien d'insurmontable.
      0
    5. M6sou Messages postés 71 Statut Membre
       
      Donc, je dois :
      -Importer, via VBA, tout mes fichiers dans une table X
      -Trier la table X en fonction des informations qui s'y trouve, et où je veux les mettre

      Concernant l'importation, si j'ai bien saisis, elle se fait grâce à l'outil "Docmd.Transfert" ?
      0
  2. blux Messages postés 2045 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Voila donc ce que je propose :


    Une table ETX, sachant que le numéro d'ETX sera unique.
    Une table TEST, sachant qu'on pourra avoir plusieurs tests par ETX, la discrimination sera faite avec l'horodatage, puisqu'on ne pourra pas tester un ETX plusieurs fois en même temps.
    Une table MESURE, sachant que pour chaque couple ETX-horodatage de test, on pourra avoir n composants avec chacun des unités différentes, des valeurs différentes.

    Par contre, je viens de regarder les fichiers d'un petit plus plus près, il y a des lignes qui n'ont pas le même nombre de champs, il va falloir des règles de gestion bien ciblées.

    Pour le recordset, on verra après, dès que tu penses que le modèle de données semble correct.
    0
    1. M6sou Messages postés 71 Statut Membre
       
      C'est presque ça, il manque juste deux petites données dans la table MESURE:
      valeur nominal (donné avec l'indication N devant la valeur) et la validité de la mesure du coups.

      Au passage pour information, la valeur min se voit avec l'indicateur '&' et la valeur max avec l'indicateur '$' avant la valeur. La valeur mesuré, elle, n'a pas d'indicateu, elle se trouve juste après sa référence et avant son unité.

      Mais sinon, le modèle de donnée est correcte avec ceux que je souhaite réaliser :D
      0
    2. M6sou Messages postés 71 Statut Membre
       
      Ah et autre chose que je viens de voir, le numéro de série est également a prendre en compte dans ETX, le nom et le numéro de série font l'ETX
      0
    3. blux Messages postés 2045 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      Les colonnes supplémentaires des tables peuvent être rajoutées après, si le besoin s'en fait sentir.
      Le principal problème est la définition des clés primaires et les relations entre tables.

      le nom et le numéro de série font l'ETX
      C'est pas grave, ce sera à toi de concaténer les infos que tu veux pour en faire une clé primaire.

      Crée donc tes tables et les relations (avec intégrité référentielle) et ensuite on attaquera le gros du boulot :

      - parcours d'un fichier
      - analyse et découpage de chaque ligne
      - remplissage des tables au fur et à mesure
      - ...
      0
  3. M6sou Messages postés 71 Statut Membre
     
    Voilà les tables et les relations avec toutes les informations nécéssaire faites !

    On va pouvoir passer au plus dur du boulot !
    0
    1. blux Messages postés 2045 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      Voilà comment on peut écrire dans la table ETX la clé de chaque etx trouvé dans un fichier (tu adapteras le nom du fichier) :

      Private Sub Commande0_Click()
      Dim RSETX As DAO.Recordset
      Dim RSTEST As DAO.Recordset
      Dim RSMESURE As DAO.Recordset
      Dim Ligne As String
      Dim Lig_Etx As String
      Set RSETX = CurrentDb.OpenRecordset("ETX", dbOpenTable)
      Set RSTEST = CurrentDb.OpenRecordset("TEST", dbOpenTable)
      Set RSMESURE = CurrentDb.OpenRecordset("MESURE", dbOpenTable)
      FicImport = "C:\toto.txt"
      'MsgBox FicImport
      Open FicImport For Input As #1
      Do While Not EOF(1)
          Line Input #1, Ligne
          If Left(Ligne, 5) = "<ETX>" Then
              Lig_Etx = Mid(Ligne, 6)
              With RSETX
                  .AddNew
                  .Fields("Etx").Value = Lig_Etx
                  .Fields("Nom").Value = "toto"
                  .Update
              End With
          End If
      Loop
      Close #1
      RSETX.Close
      RSTEST.Close
      RSMESURE.Close
      Set RSETX = Nothing
      Set RSTEST = Nothing
      Set RSMESURE = Nothing
      End Sub


      Bien sûr, il n'y a pas d'interception d'erreur (etx déjà présent, par exemple), mais ça te donne la méthode d'écriture en vba dans une table.
      J'ai mis la description des autres recordset car on va s'en servir au fil de l'eau.

      Je n'ai toutefois pas testé le code, il est possible que tu aies des erreurs, mais on corrigera....

      Si toutefois tu as une erreur sur librairie ou bibliothèque non trouvée au niveau de la définition dao, tu vas aller (une fois que le code est planté et que tu est dans la fenêtre code) dans le menu 'Outils/référence' et vas chercher dans la liste de ce qui n'est pas coché un 'microsoft DAO xx.x object library que tu cocheras, ça devrait résoudre ce problème éventuel.
      0
    2. M6sou Messages postés 71 Statut Membre
       
      Merci pour la méthode d'écriture, je regarderais ça de plus près demain matin et reviendrais vers toi. :-)
      0
    3. M6sou Messages postés 71 Statut Membre
       
      Salut Blux, désolez pour le temps de réponse j'ai eu quelques soucis personnel à régler.
      J'ai bien lancé le code que tu m'as passé, néanmoins j'ai une erreur 3022:
      Modifications non effectuées : risques de doublons dans champs index, clé principale, ou relation interdisant les doublons. Modifiez les données des champs contenant les doublons, enlevez ou redefinissez l'index pour permettre les doublons et recommencez"

      Je cherche de mon côté d'où cela peut provenir, mais si tu as une idée je suis preneur !
      0
    4. blux Messages postés 2045 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      C'est ce que je disais, tu as sûrement une clé primaire qui existe déjà, cas typique : un etx déjà enregistré dans la table etx...
      Dans ce cas, il ne faudra pas enregistrer cet etx mais seulement les informations qu'il apporte dans les autre tables...
      0
    5. M6sou Messages postés 71 Statut Membre
       
      En faites, le problème si j'ai bien saisis, c'est que lorsqu'il trouve un etx déjà dans la base de données, il se met en erreur pour ne pas faire de doublon. Donc lorsqu'il y a deux etx identique, le programme doit faire abstraction de cette ligne et ne prendre en compte que l'horodatage + mesure.
      Mais pour le faire, il faut réaliser le recordset de mesure c'est ça ?
      0
  4. blux Messages postés 2045 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Voilà ce qu'on peut faire :

    Private Sub Commande0_Click()
    Dim RSETX As DAO.Recordset
    Dim RSTEST As DAO.Recordset
    Dim RSMESURE As DAO.Recordset
    Dim Ligne As String
    Dim Etx As String
    Dim Test As String
    Set RSETX = CurrentDb.OpenRecordset("ETX", dbOpenTable)
    Set RSTEST = CurrentDb.OpenRecordset("TEST", dbOpenTable)
    Set RSMESURE = CurrentDb.OpenRecordset("MESURE", dbOpenTable)
    FicImport = "D:\*****\ACC\etx\Tss_data0204131343.txt"
    'MsgBox FicImport
    Open FicImport For Input As #1
    Line Input #1, Ligne
    Do While Not EOF(1)
        ' La première ligne est toujours ETX
        If Left(Ligne, 5) = "<ETX>" Then
            Etx = Mid(Ligne, 6)
            With RSETX
                .AddNew
                .Fields("Etx").Value = Etx
                .Fields("Nom").Value = "toto"
                On Error Resume Next
                .Update
                ' MsgBox "etx"
                ' Si erreur 3022, clé primaire déjà connue -> on continue
                ' sinon erreur à traiter...
                If Err.Number <> 3022 And Err.Number <> 0 Then
                    MsgBox "Erreur " & Err.Number & vbCrLf & Err.Description, vbCritical, "Erreur insertion ETX"
                End If
            End With
        Else
            MsgBox "La ligne n'est pas une ligne ETX " & Ligne & vbCrLf, vbCritical, "Erreur lecture fichier"
        End If
        ' La ligne suivante est toujours un horodatage
        Line Input #1, Ligne
        If Mid(Ligne, 2, 8) Like "##-##-##" Then
            With RSTEST
                .AddNew
                .Fields("etx").Value = Etx
                .Fields("horo").Value = Ligne
                'MsgBox "test"
                .Update
            End With
        Else
            MsgBox "La ligne n'est pas une ligne d'horodatage " & Ligne & vbCrLf, vbCritical, "Erreur lecture fichier"
        End If
        ' Boucle sur mesure tant que etx non trouvé
        Do
            Line Input #1, Ligne
            'MsgBox Ligne
            If Left(Ligne, 5) = "<ETX>" Or EOF(1) Then
                'MsgBox "nouveau etx"
                Exit Do
            End If
            With RSMESURE
                .AddNew
                .Fields("nom").Value = Ligne
                'MsgBox "mesure"
                .Update
            End With
        Loop While True
    Loop
    Close #1
    RSETX.Close
    RSTEST.Close
    RSMESURE.Close
    Set RSETX = Nothing
    Set RSTEST = Nothing
    Set RSMESURE = Nothing
    End Sub


    La gestion des erreurs est faite a minima, on considère que le flux est toujours correctement structuré : pas de mesures orphelines, un horodatage suit toujours un etx, pas de lignes blanches...

    Reste ensuite à savoir comment tu découpes chaque ligne de mesure, savoir si tu découpe l'horodatage en date et heure, si tu rajoutes la durée... Mais je pense que l'essentiel y est.

    Je n'ai pas non plus mis la boucle pour traiter tous les fichiers d'un répertoire choisi par l'utilisateur.

    <edit> : lorsque tu feras des essais, la table mesure ne va faire que se remplir car la clé primaire est un numéroauto, tu n'auras jamais de doublons, pense à la vider quand tu feras des vérifications

    A+ blux
     "Les cons, ça ose tout.
    C'est même à ça qu'on les reconnait"
    0
    1. M6sou Messages postés 71 Statut Membre
       
      Merci beaucoup, c'est exactement ça.
      Là je travaille sur la table de mesure, je voulais savoir si lorsque j'écris cela :
      Mid(Ligne, InStr(Ligne, " "), InStr(Ligne," ") + 1))

      Cela dit ien de prendre la donnée entre le premier espace et le second ?
      Parce que j'essaye de la mettre dans le programme mais rien ne se passe du côté de la table mesure. Elle reste vide...
      0
    2. blux Messages postés 2045 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      Tu peux faire beaucoup mieux, à mon avis, car je vois ta problématique : récupérer les mesures séparées par des espaces.
      ...
      Dim ListeMesure() As String
      Dim I As Integer
      ...
      ListeMesure = Split(Ligne)
      For I = 0 To ListeMesure - 1
          Msgbox ListeMesure(I)
      Next
      ...


      Avec ça, tu sépares la ligne en chaines qui sont mises une par une dans le tableau ListeMesure (séparateur par défaut : espace). Ca devrait éviter beaucoup de instr, len, mid, left et autres fonctions... A toi ensuite de les mettre dans les champs de RSMESURE en fonction de ce qui i t'intéresse.
      0
    3. blux Messages postés 2045 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      Et puis en mettant un peu de code pour choisir un répertoire et boucler sur tous les fichiers .txt qui y sont, ça donne ça :

      Private Sub Commande0_Click()
      Dim Repertoire As Office.FileDialog
      Dim Rep As String
      Dim RSETX As DAO.Recordset
      Dim RSTEST As DAO.Recordset
      Dim RSMESURE As DAO.Recordset
      Dim Ligne As String
      Dim Etx As String
      Dim Test As String
      Dim ListeMesure() As String
      Set RSETX = CurrentDb.OpenRecordset("ETX", dbOpenTable)
      Set RSTEST = CurrentDb.OpenRecordset("TEST", dbOpenTable)
      Set RSMESURE = CurrentDb.OpenRecordset("MESURE", dbOpenTable)
      'Choix du répertoire de travail
      Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)
      Repertoire.Title = "Sélectionnez un répertoire..."
      Repertoire.Show
      If Repertoire.SelectedItems.Count < 1 Then
          MsgBox "Aucun répertoire sélectionné !!!", vbOKOnly
          Exit Sub
      End If
      MsgBox Repertoire.SelectedItems(1)
      Rep = Dir(Repertoire.SelectedItems(1) & "\", vbDirectory)
      ' Boucle tant que le répertoire n'a pas été entièrement parcouru
      Do While (Rep <> "")
          ' Teste si c'est un fichier ou un répertoire
          If (GetAttr(Repertoire.SelectedItems(1) & "\" & Rep) And vbDirectory) <> vbDirectory Then
              If Right(Rep, 4) = ".txt" Then
                  Ficimport = Repertoire.SelectedItems(1) & "\" & Rep
                  MsgBox Ficimport
                  'Ouvre le fichier et lit son contenu
                  Open Ficimport For Input As #1
                  Line Input #1, Ligne
                  Do While Not EOF(1)
                      ' La première ligne est toujours ETX
                      If Left(Ligne, 5) = "<ETX>" Then
                          Etx = Mid(Ligne, 6)
                          With RSETX
                              .AddNew
                              .Fields("Etx").Value = Etx
                              .Fields("Nom").Value = "toto"
                              On Error Resume Next
                              .Update
                              ' MsgBox "etx"
                              ' Si erreur 3022, clé primaire déjà connue -> on continue
                              ' sinon erreur à traiter...
                              If Err.Number <> 3022 And Err.Number <> 0 Then
                                  MsgBox "Erreur " & Err.Number & vbCrLf & Err.Description, vbCritical, "Erreur insertion ETX"
                              End If
                          End With
                      Else
                          MsgBox "La ligne n'est pas une ligne ETX " & Ligne & vbCrLf, vbCritical, "Erreur lecture fichier"
                      End If
                      ' La ligne suivante est toujours un horodatage
                      Line Input #1, Ligne
                      If Mid(Ligne, 2, 8) Like "##-##-##" Then
                          With RSTEST
                              .AddNew
                              .Fields("etx").Value = Etx
                              .Fields("horo").Value = Ligne
                              'MsgBox "test"
                              .Update
                          End With
                      Else
                          MsgBox "La ligne n'est pas une ligne d'horodatage " & Ligne & vbCrLf, vbCritical, "Erreur lecture fichier"
                      End If
                      ' Boucle sur mesure tant que etx non trouvé
                      Do
                          Line Input #1, Ligne
                          'MsgBox Ligne
                          If Left(Ligne, 5) = "<ETX>" Or EOF(1) Then
                              'MsgBox "nouveau etx"
                              Exit Do
                          End If
                          ListeMesure = Split(Ligne)
                          With RSMESURE
                              .AddNew
                              .Fields("nom").Value = Ligne
                              'MsgBox "mesure"
                              .Update
                          End With
                      Loop While True
                  Loop
                  Close #1
              End If
          End If
          ' Passe au fichier suivant
          Rep = Dir
      Loop
      RSETX.Close
      RSTEST.Close
      RSMESURE.Close
      Set RSETX = Nothing
      Set RSTEST = Nothing
      Set RSMESURE = Nothing
      End Sub


      J'ai laissé des msgbox pour voir où on en est, tu pourras bien sûr les faire sauter...
      Si tu as une erreur sur la définition de l'objet Office.FileDialog, tu fais comme pour DAO, tu vas dans les références et tu coches 'Microsoft Office xx.x Object LIbrary
      0
    4. M6sou Messages postés 71 Statut Membre
       
      Cool, merci je regarderais ça demain matin ! En tout cas, merci tu m'auras grandement aidé !
      0
    5. M6sou Messages postés 71 Statut Membre
       
      Dernier petit problème au niveau du code, et de la table MESURE. Les tables TEST et ETX se remplissent parfaitement bien mais pas la table MESURE qui elle ne se remplit pas du tout, elle reste vide...

      Private Sub Commande0_Click()
      Dim Repertoire As Office.FileDialog
      Dim Rep As String
      Dim RSETX As DAO.Recordset
      Dim RSTEST As DAO.Recordset
      Dim RSMESURE As DAO.Recordset
      Dim Ligne As String
      Dim Etx As String
      Dim Test As String
      Dim ListeMesure() As String
      Dim I As Integer
      Set RSETX = CurrentDb.OpenRecordset("ETX", dbOpenTable)
      Set RSTEST = CurrentDb.OpenRecordset("TEST", dbOpenTable)
      Set RSMESURE = CurrentDb.OpenRecordset("MESURE", dbOpenTable) 'Choix du répertoire de travail
      Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)
      Repertoire.Title = "Sélectionnez un répertoire..."
      Repertoire.Show
      If Repertoire.SelectedItems.Count < 1 Then
      MsgBox "Aucun répertoire sélectionné !!!", vbOKOnly
      Exit Sub
      End If
      MsgBox Repertoire.SelectedItems(1)
      Rep = Dir(Repertoire.SelectedItems(1) & "\", vbDirectory) ' Boucle tant que le répertoire n'a pas été entièrement parcouru
      Do While (Rep <> "") ' Teste si c'est un fichier ou un répertoire
      If (GetAttr(Repertoire.SelectedItems(1) & "\" & Rep) And vbDirectory) <> vbDirectory Then
      If Right(Rep, 4) = ".txt" Then Ficimport = Repertoire.SelectedItems(1) & "\" & Rep
      'MsgBox Ficimport 'Ouvre le fichier et lit son contenu
      Open Ficimport For Input As #1
      Line Input #1, Ligne
      Do While Not EOF(1) ' La première ligne est toujours ETX
      If Left(Ligne, 5) = "<ETX>" Then
      Etx = Mid(Ligne, 6)
      With RSETX
      .AddNew
      .Fields("Etx").Value = Etx
      .Fields("NomCarte").Value = Mid(Etx, 1, InStr(Etx, " "))
      .Fields("NS").Value = Mid(Etx, InStr(Etx, " ") + 1, 6)
      On Error Resume Next
      .Update
      ' MsgBox "etx"
      ' Si erreur 3022, clé primaire déjà connue -> on continue
      ' sinon erreur à traiter...
      If Err.Number <> 3022 And Err.Number <> 0 Then
      MsgBox "Erreur " & Err.Number & vbCrLf & Err.Description, vbCritical, "Erreur insertion ETX"
      End If
      End With
      Else
      'MsgBox "La ligne n'est pas une ligne ETX " & Ligne & vbCrLf, vbCritical, "Erreur lecture fichier"
      End If ' La ligne suivante est toujours un horodatage
      Line Input #1, Ligne
      If Mid(Ligne, 2, 8) Like "##-##-##" Then
      horo = Ligne
      With RSTEST
      .AddNew
      .Fields("Etx").Value = Etx
      .Fields("horo").Value = Mid(horo, 1, 17)
      .Fields("Durée").Value = Mid(horo, 19, 8)
      'MsgBox "test"
      .Update
      End With
      Else
      'MsgBox "La ligne n'est pas une Ligne d 'horodatage " & Ligne & vbCrLf, vbCritical, "Erreur lecture fichier"
      End If
      ' Boucle sur mesure tant que etx non trouvé
      Do
      Line Input #1, Ligne
      'MsgBox Ligne
      If Left(Ligne, 5) = "<ETX>" Or EOF(1) Then
      'MsgBox "nouveau etx"
      Exit Do
      End If
      Line Input #1, Ligne
      ListeMesure = Split(Ligne)
      For I = 0 To ListeMesure(I) - 1
      'MsgBox ListeMesure(I)
      Next
      With RSMESURE
      .AddNew
      .Fields("Etx").Value = Etx
      .Fields("horo").Value = horo
      .Fields("Nom").Value = ListeMesure(I) = 0
      .Fields("Unite").Value = ListeMesure(I) = 2
      .Fields("Valeur mesuree").Value = ListeMesure(I) = 1
      .Fields("Valeur min").Value = ListeMesure(I) = 3
      .Fields("Valeur max").Value = ListeMesure(I) = 4
      .Fields("Valeur nomi").Value = ListeMesure(I) = 5
      'MsgBox "mesure"
      .Update
      End With
      Loop While True
      Loop
      Close #1
      End If
      ' Passe au fichier suivant
      Rep = Dir
      Loop
      RSETX.Close
      RSTEST.Close
      RSMESURE.Close
      Set RSETX = Nothing
      Set RSTEST = Nothing
      Set RSMESURE = Nothing
      End Sub
      

      Je ne sais pas si c'est un problème lié à la boucle For (mais ça m'étonnerais pcq elle découpe bien , le seul soucis c'est qu'elle découpe une ligne du premier fichier et s'arrête..)
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. blux Messages postés 2045 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Voila ce que ça donne (le code a été repensé, je te conseille de faire un copier/coller chez toi) :

    Private Sub Commande0_Click()
    Dim Repertoire As Office.FileDialog
    Dim Rep As String
    Dim RSETX As DAO.Recordset
    Dim RSTEST As DAO.Recordset
    Dim RSMESURE As DAO.Recordset
    Dim Ligne As String
    Dim Etx As String
    Dim Horod As String
    Dim Test As String
    Dim Complement As String
    Dim ListeMesure() As String
    Dim I As Integer
    Dim Boo_Etx As Boolean
    Dim Boo_Test As Boolean
    Set RSETX = CurrentDb.OpenRecordset("ETX", dbOpenTable)
    Set RSTEST = CurrentDb.OpenRecordset("TEST", dbOpenTable)
    Set RSMESURE = CurrentDb.OpenRecordset("MESURE", dbOpenTable)
     'Choix du répertoire de travail
    Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)
    Repertoire.Title = "Sélectionnez un répertoire..."
    Repertoire.Show
    If Repertoire.SelectedItems.Count < 1 Then
        MsgBox "Aucun répertoire sélectionné !!!", vbOKOnly
        Exit Sub
    End If
    'MsgBox Repertoire.SelectedItems(1)
    Rep = Dir(Repertoire.SelectedItems(1) & "\", vbDirectory)
     ' Boucle tant que le répertoire n'a pas été entièrement parcouru
    Do While (Rep <> "")
        ' Teste si c'est un fichier ou un répertoire
        If (GetAttr(Repertoire.SelectedItems(1) & "\" & Rep) And vbDirectory) <> vbDirectory Then
            If Right(Rep, 4) = ".txt" Then
                Ficimport = Repertoire.SelectedItems(1) & "\" & Rep
                'MsgBox Ficimport
                'Ouvre le fichier et lit son contenu
                Open Ficimport For Input As #1
                Line Input #1, Ligne
                Boo_Etx = False
                Boo_Test = False
                Do While Not EOF(1)
                    ' La première ligne est toujours ETX
                    If Left(Ligne, 5) = "<ETX>" Then
                        Etx = Mid(Ligne, 6)
                        ' Marquage si etx trouvé
                        Boo_Etx = True
                    Else
                        MsgBox "La ligne n'est pas une ligne ETX " & Ligne & vbCrLf, vbCritical, "Erreur lecture fichier"
                    End If
                    On Error Resume Next
                    ' La ligne suivante est toujours un horodatage
                    Line Input #1, Ligne
                    If Err.Number = 62 Then
                        Exit Do
                    ElseIf Err.Number <> 0 Then
                        MsgBox "Erreur " & Err.Number & vbCrLf & Err.Description, vbCritical, "Erreur lecture horodatage"
                        Exit Do
                    End If
                    On Error GoTo 0
                    If Mid(Ligne, 2, 8) Like "##-##-##" Then
                        Horod = Mid(Ligne, 1, 17)
                        ' Marquage si horo trouuvé
                        Boo_Test = True
                    Else
                       MsgBox "La ligne n'est pas une Ligne d'horodatage " & Ligne & vbCrLf, vbCritical, "Erreur lecture fichier"
                    End If
                    ' Boucle sur mesure tant que etx non trouvé
                    Do
                        Line Input #1, Ligne
                        If Err.Number = 62 Then
                            Exit Do
                        ElseIf Err.Number <> 0 Then
                            MsgBox "Erreur " & Err.Number & vbCrLf & Err.Description, vbCritical, "Erreur lecture horodatage"
                            Exit Do
                        End If
                        On Error GoTo 0
                        'MsgBox Ligne
                        If Left(Ligne, 5) = "<ETX>" Or EOF(1) Then
                            'MsgBox "nouveau etx"
                            Exit Do
                        End If
                        ListeMesure = Split(Ligne)
                        'For I = 0 To UBound(ListeMesure)
                        'MsgBox ListeMesure(I)
                        'Next
                        ' Si etx et horo trouvés, on les écrit
                        If Boo_Etx And Boo_Test Then
                            With RSETX
                                .AddNew
                                .Fields("Etx").Value = Etx
                                .Fields("NomCarte").Value = Mid(Etx, 1, InStr(Etx, " "))
                                .Fields("NS").Value = Mid(Etx, InStr(Etx, " ") + 1, 6)
                                On Error Resume Next
                                .Update
                                ' MsgBox "etx"
                                ' Si erreur 3022, clé primaire déjà connue -> on continue
                                ' sinon erreur à traiter...
                                If Err.Number <> 3022 And Err.Number <> 0 Then
                                    MsgBox "Erreur " & Err.Number & vbCrLf & Err.Description, vbCritical, "Erreur insertion ETX"
                                End If
                                On Error GoTo 0
                            End With
                            With RSTEST
                                .AddNew
                                .Fields("Etx").Value = Etx
                                .Fields("horo").Value = Horod
                                .Fields("Durée").Value = Mid(Ligne, 19, 8)
                                On Error Resume Next
                                .Update
                                'MsgBox "test"
                                ' Si erreur 3022, clé primaire déjà connue -> on continue
                                ' sinon erreur à traiter...
                                If Err.Number <> 3022 And Err.Number <> 0 Then
                                    MsgBox "Erreur " & Err.Number & vbCrLf & Err.Description, vbCritical, "Erreur insertion TEST"
                                End If
                                On Error GoTo 0
                            End With
                            ' On remet à faux pour n'écrire qu'une fois le couple pour les mesures trouvées
                            Boo_Etx = False
                            Boo_Test = False
                        End If
                        ' Ecriture de la mesure
                        With RSMESURE
                            .AddNew
                            .Fields("Etx").Value = Etx
                            .Fields("horo").Value = Horod
                            Complement = ""
                            If Left(ListeMesure(0), 1) = "S" Then
                                .Fields("Nom").Value = Mid(ListeMesure(0), 4, 20)
                                .Fields("Valeur mesuree").Value = Replace(ListeMesure(1), ".", ",")
                                .Fields("Unite").Value = ListeMesure(2)
                                For I = 3 To UBound(ListeMesure)
                                    If Left(ListeMesure(I), 1) = "&" Or Left(ListeMesure(I), 1) = ";" Then
                                        .Fields("Valeur min").Value = Replace(Mid(ListeMesure(I), 2, 30), ".", ",")
                                    ElseIf Left(ListeMesure(I), 1) = "$" Or Left(ListeMesure(I), 1) = "?" Then
                                        .Fields("Valeur max").Value = Replace(Mid(ListeMesure(I), 2, 30), ".", ",")
                                    ElseIf Left(ListeMesure(I), 1) = "N" Then
                                        .Fields("Valeur nomi").Value = Replace(Mid(ListeMesure(I), 2, 30), ".", ",")
                                    Else
                                        Complement = Complement & " " & ListeMesure(I)
                                    End If
                                Next
                            End If
                            .Fields("Complement").Value = Complement
                            On Error Resume Next
                            .Update
                            'MsgBox "mesure"
                            ' Erreur à traiter...
                            If Err.Number <> 0 Then
                                MsgBox "Erreur " & Err.Number & vbCrLf & Err.Description, vbCritical, "Erreur insertion MESURE"
                            End If
                            On Error GoTo 0
                        End With
                    Loop While True
                Loop
                Close #1
            End If
        End If
        ' Passe au fichier suivant
        Rep = Dir
    Loop
    RSETX.Close
    RSTEST.Close
    RSMESURE.Close
    Set RSETX = Nothing
    Set RSTEST = Nothing
    Set RSMESURE = Nothing
    End Sub
     

    0
    1. M6sou Messages postés 71 Statut Membre
       
      Je l'essaierais après, là j'ai compris pourquoi j'ai une erreur 9 constamment.
      Par moment dans les fichiers il y a des lignes :
      Su'DECHARGE

      du coups il ne sais pas quoi en faire. Alors je lui ai dis que Si il trouvait un "S*" il faisait le programme normalement sinon si il trouve "Su'" il va directement a Next For sans prendre en compte la ligne
      0
    2. blux Messages postés 2045 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      D'où l'intérêt d'avoir un inventaire exhaustif, patati et patata...
      0
    3. M6sou Messages postés 71 Statut Membre
       
      De base j'avais déjà réalisé une macro de tri des données, je pensais avoir enlevé toutes les données en trop, faut croire que j'avais oublié celle là
      0