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 :

transformer table en texte par lignes


Sujet :

VBA Access

  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Vatican

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2004
    Messages : 144
    Points : 238
    Points
    238
    Par défaut transformer table en texte par lignes
    bonjour,

    je me retrouve un peu coincé sur ce sujet.
    en effet il s'agit de parcourir une table avec N colonnes, pui pour chaque valeur distinct dans le champ(0) je dois afficher en ligne toutes les données dans un fichier txt.

    au fait j'ai réussi par ce code à parcourir la table et de grouper les données pour chaque nom de société je rajoute toutes les données la concernant sur une même ligne séparé par virgule.
    l'inconvéniant est que je collecte cela dans une variable à la fin que j'affiche, je voudrais écrire directement dans un fichier texte au lieu de collecter dans une variable puis l'exporter vers du txt.
    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
    Dim donne As String
     
        Set db = CurrentDb()
        sSQL1 = "SELECT distinct societe FROM matable"
     
        Set rst1 = db.OpenRecordset(sSQL1)
    rst1.MoveFirst
    While Not rst1.EOF
     
    n = 0
    While n < rst1.Fields.Count
     valeur1 = rst1.Fields(n).Value
        sSQL = "SELECT * FROM colonne WHERE societe =" & "'" & valeur1 & "'"
        Set rst = db.OpenRecordset(sSQL)
        rst.MoveFirst
        While Not rst.EOF
             j = 3
            While j < rst.Fields.Count
            val_champ = rst.Fields(j).Value
            If IsNull(val_champ) Then
            donne = ""
            Else
            donne = val_champ & ";"
            End If
     
             j = j + 1
            la_ligne = la_ligne & donne
           Wend
       rst.MoveNext
       total_ligne = total_ligne & la_ligne
       donne = ""
       la_ligne = ""
      Wend
    rst.MoveFirst
     
    n = n + 1
    ligne_soc = rst.Fields(0).Value & ";" & rst.Fields(1).Value & ";" & rst.Fields(2).Value & ";" & jj
    Wend
    rst1.MoveNext
    rst.Close
    capture = capture & ligne_soc & Chr(13)
    ligne_soc = ""
    total_ligne = ""
    Wend
    Texte1.Value = capture
    rst1.Close
     
    End Sub
    merci

  2. #2
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    voici un petit exemple simple :
    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
    Dim fl As Integer
    Dim rs As DAO.Recordset, iCol As Integer
    Dim strLigne As String
     
    On Error GoTo ErrH
    Set rs = CurrentDb.OpenRecordset("tblVbRefs")
    If Not rs.EOF Then
       ' obtenir numéro de fichier libre
       fl = FreeFile()
       ' ouvrir fichier texte
       Open "E:\Monfichier.txt" For Output As #fl
       ' ligne d'en-têtes
       For iCol = 0 To rs.Fields.Count - 1
           strLigne = strLigne & ";" & rs.Fields(iCol).Name
       Next
       strLigne = Mid(strLigne, 2)
       ' Ecrire la ligne dans le fichier
       Print #fl, strLigne
       ' parcourir les enregistrements
       Do While Not rs.EOF
          strLigne = ""
          For iCol = 0 To rs.Fields.Count - 1
              strLigne = strLigne & ";" & Nz(rs.Fields(iCol))
          Next
          strLigne = Mid(strLigne, 2)
          ' Ecrire la ligne dans le fichier
          Print #fl, strLigne
          ' Enregistrement suivant
          rs.MoveNext
       Loop
    End If
     
    Sortie:
    ' fermer le fichier
    If fl <> 0 Then Close #fl
     
    Exit Sub
     
    ErrH:
    MsgBox "Erreur " & Err.Number & " : " & Err.Description
    Resume Sortie
    J'ai mis une petite gestion d'erreur pour s'assurer qu'on passe bien par le code qui ferme le fichier.

    Remarque :
    Print # ajoute automatiquement un retour à la ligne (Chr(13) & Chr(10))
    Il te faudra donc enlever le Chr(13) que tu ajoutes dans ton code.

    A+

  3. #3
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Vatican

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2004
    Messages : 144
    Points : 238
    Points
    238
    Par défaut
    bonsoir,

    Merci pour le code au fait mon cas il un peu plus compliqué, peut être que j'ai mal expliqué dans mon sujet j'essaierais de mieux illustrer.

    ma table contient ceci

    société, adresse, poste, nom, tel1, tel2,fax

    disons qu'une société X a une dizaine de responsable. le code que j'ai mis ci haut fait le nécessaire qui est le suivant :

    x; adressex, postei,nomi,tel1i,tel2i,faxi,postej,nomj,tel1j,tel2j,faxj,......,postek,nomk,tel1k,tel2k,faxk

    y,adressey, nomi,......,nomk

    ce qui revient à dire que pour une requete col1=val1 on créé une ligne où on ajoute successivement le contenu des champs de cette requête successivement sur la même ligne et puis passer à la ligne suivante où on fait de même pour col1=val2.

    Le code que j'ai mis le fait déja mais le problème est qu'il collecte dans la variable capture que j'imprime à la fin d'execution de toutes les boucles.

    J'aurais aimer trouver un code plus simple qui alimente le fichier de sortie en écrivant au fur et à mesure, pour alleger le stockage dans les variable qui risque d'être pénalisant sur une table trop remplie.

    Merci

  4. #4
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Mon exemple te montre comment écrire dans un fichier.

    1ère étape : ouvrir le fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       ' obtenir numéro de fichier libre
       fl = FreeFile()
       ' ouvrir fichier texte
       Open "E:\Monfichier.txt" For Output As #fl
    2ème étape : écrire les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       ' Ecrire la ligne dans le fichier
       Print #fl, strLigne
    Si tu as une ligne par société, il me semble que cette ligne est à placer après
    Dernière étape : fermer le fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ' fermer le fichier
    If fl <> 0 Then Close #fl
    A+

  5. #5
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Vatican

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2004
    Messages : 144
    Points : 238
    Points
    238
    Par défaut
    bonjour,

    j'ai finit mon petit code, j'ai bien voulu le partager avec vous, peut être que ça pourrait être utile à quelqu'un un de ces jours.

    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
    68
    69
    70
    71
    72
    73
    Private Sub Commande5_Click()
    Dim fl As Integer
    Dim SQL As String
    Dim db As dao.Database, rst As dao.Recordset, fld As dao.Field, rst1 As dao.Recordset, rst2 As dao.Recordset
    Dim sSQL As String
    Dim sSQL1 As String
    Dim sSQL2 As String
    Dim donne As String
     
        Set db = CurrentDb()
        sSQL1 = "SELECT distinct societe FROM colonne"
        sSQL2 = "SELECT * FROM colonne"
        Set rst1 = db.OpenRecordset(sSQL1)
        Set rst2 = db.OpenRecordset(sSQL2)
    rst1.MoveFirst
    fl = FreeFile()
    Open "c:\Monfichier1.txt" For Output As #fl
    aff_colonne = "societe;adresse;domaine"
    k = 3
    While k < rst2.Fields.Count
    val_col = "nom_responsable" & (k - 3) & ";" & "fonction_Responsable" & (k - 3) & ";" & "tel1_responsable" & (k - 3) & ";" & "tel2_responsable" & (k - 3) & ";" & "tel3_responsable" & (k - 3) & ";" & "Fax_responsable" & (k - 3) & ";" & "Adresse mail responsable" & (k - 3) & ";"
    k = k + 1
    recup_col = recup_col & val_col
    val_col = ""
    Wend
    colonnes = aff_colonne & ";" & recup_col
    Print #fl, colonnes
    rst2.Close
    While Not rst1.EOF
     
    n = 0
    While n < rst1.Fields.Count 'selection de valeur1 qui va être appliqué comme filtre de regroupement
     
     valeur1 = rst1.Fields(n).Value
        sSQL = "SELECT * FROM colonne WHERE societe =" & "'" & valeur1 & "'"
        Set rst = db.OpenRecordset(sSQL)
        rst.MoveFirst
     
        While Not rst.EOF 'parcourir les lignes
             j = 3
            While j < rst.Fields.Count
            var_champ = rst.Fields(j).Value
            If IsNutot_lignes(var_champ) Then
            donne = ""
            Else
            donne = var_champ & ";"
            End If
             j = j + 1
            cap_champ = cap_champ & donne 'additionner  les champs
           Wend
       rst.MoveNext
       champs_lignes = champs_lignes & cap_champ 'additionner les lignes champs
       donne = ""
       cap_champ = "" 'reinitialiser les variable de capture
      Wend
    rst.MoveFirst
     
    n = n + 1
    tot_lignes = rst.Fields(0).Value & ";" & rst.Fields(1).Value & ";" & rst.Fields(2).Value & ";" & champs_lignes 'stocker la ligne
     
    Wend
    rst1.MoveNext 'passer au filtre suivant
    Print #fl, tot_lignes 'ecrire dans le fichier text
    rst.Close
     
    tot_lignes = ""
    champs_lignes = "" 'reinitialisation
    Wend
     
    rst1.Close
    If fl <> 0 Then Close #fl
     
    End Sub

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/08/2011, 11h12
  2. Réponses: 14
    Dernier message: 22/05/2011, 12h21
  3. [XSLT] Séparation texte par ligne
    Par Definol dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 15/12/2008, 13h36
  4. Réponses: 3
    Dernier message: 12/08/2008, 13h26
  5. aditionner les champs d'une table ligne par ligne
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/08/2005, 08h38

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