OVH Cloud OVH Cloud

Données en ligne

12 réponses
Avatar
Bubu
Bonjour à tous,

Je voudrais exporter plusieurs enregistrements au format texte avec
séparateur tabulation pour les récupérer dans un document formulaire pdf.
Mais pour que mes données s'incorporent comme il faut dans mon pdf, il
faudrait que l'exportation me regroupe les enregistrements d'un champ donné
en les mettant bout à bout. Plus concretement j'ai une requete qui affiche
les enregistrements souhaités comme suit :

Champ1 Champ2
A 12
B 35
H 43
...

Dans mon fichier texte, je ne peux avoir que deux lignes : la premiere
contenant le nom des champs séparés par une tab, la deuxième avec les
données, séparées par une tab lorsqu'on change de champ.
Il faudrait donc que je puisse exporter les données dans un fichier texte de
la forme suivante :
Champ1 [Tab] Champ2...
A [Entrée] B [Entrée] H ...[Tab] 12 [Entrée] 35 [Entrée] 43...

La mention [Entrée] qui sépare les données d'un même champ fait référence au
symbole correspondant en fichier texte, c'est une sorte de petit rectangle
vertical. On obtient ce symbole quand on enregistre au format texte un
classeur excel contenant des cellules à plusieurs lignes.

Je ne sais pas si j'ai été clair alors n'hésitez pas à me dire si ma
question est compréhensible ou non. Merci de votre aide.
Bubu

10 réponses

1 2
Avatar
Eric
Bonjour,

Avec la procédure ci-dessous peut-être. A copier dans un module de
portée globale.
Par contre, je ne suis pas sur que l'équivalent du rectangle de retour à
la ligne dans une cellule d'Excel soit la constante vbLf. Cela peut être
aussi vbCr. Je te laisse le soin de vérifier.

La procédure sera appelée dans le code par
Call zz("NomRequete")

Sub zz(NomTableRequête As String)
' Charger la référence Microsoft DAO 3.x Object Library
Dim rst As DAO.Recordset, fld As DAO.Field
Dim f As Integer, cpt As Long
Dim varTemp(), i As Long, j As Byte
Dim strChaine As String
' Adapter le nom de la table/requête
Set rst = CurrentDb.OpenRecordset(NomTableRequête)
For Each fld In rst.Fields
If Len(strChaine) = 0 Then
strChaine = fld.Name
Else
strChaine = strChaine & vbTab & fld.Name
End If
Next fld
f = FreeFile
' Adapter le chemin et le nom du fichier .txt
Open CurrentProject.Path & "" & "Fichier.txt" For Output As f
Print #f, strChaine ' écriture des noms des champs
' Traitement des valeurs
strChaine = ""
If Not rst.BOF And Not rst.EOF Then
rst.MoveLast: rst.MoveFirst
cpt = rst.RecordCount
ReDim varTemp(cpt - 1)
' on récupère le jeu d'enregistrements dans un tableau
varTemp = rst.GetRows(cpt)
For j = 0 To UBound(varTemp, 1) ' compteur de champs
For i = 0 To UBound(varTemp, 2) ' compteur d'enregistrements
' vbLF ou vbCr (ou vbCrLf mais je crois pas)
' je crois que sous Excel il s'agit de vbLf, à vérifier
' au pire, tester pour trouver le bon
strChaine = strChaine & varTemp(j, i) & vbLf
Next i
strChaine = Left(strChaine, Len(strChaine) - 1)
strChaine = strChaine & vbTab
Next j
Print #f, strChaine
End If
Close #f
rst.Close
Set rst = Nothing
Erase varTemp
End Sub


Bonjour à tous,

Je voudrais exporter plusieurs enregistrements au format texte avec
séparateur tabulation pour les récupérer dans un document formulaire pdf.
Mais pour que mes données s'incorporent comme il faut dans mon pdf, il
faudrait que l'exportation me regroupe les enregistrements d'un champ donné
en les mettant bout à bout. Plus concretement j'ai une requete qui affiche
les enregistrements souhaités comme suit :

Champ1 Champ2
A 12
B 35
H 43
...

Dans mon fichier texte, je ne peux avoir que deux lignes : la premiere
contenant le nom des champs séparés par une tab, la deuxième avec les
données, séparées par une tab lorsqu'on change de champ.
Il faudrait donc que je puisse exporter les données dans un fichier texte de
la forme suivante :
Champ1 [Tab] Champ2...
A [Entrée] B [Entrée] H ...[Tab] 12 [Entrée] 35 [Entrée] 43...

La mention [Entrée] qui sépare les données d'un même champ fait référence au
symbole correspondant en fichier texte, c'est une sorte de petit rectangle
vertical. On obtient ce symbole quand on enregistre au format texte un
classeur excel contenant des cellules à plusieurs lignes.

Je ne sais pas si j'ai été clair alors n'hésitez pas à me dire si ma
question est compréhensible ou non. Merci de votre aide.
Bubu



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Eric
....
Erreur

Declarer varTemp par Dim VarTemp et non Dim varTemp()
et supprimer la ligne ReDim varTemp(cpt - 1)


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr
Avatar
Bubu
Bonjour Eric,

désolé d'être un peu long à la détente mais je n'arrive pas toujours à me
dégager le temps que je voudrais pour travaille à mon projet. La procédure
que tu m'as donnée a l'air bien mais je ne connais pas grand chose au vba et
au développement sous access. Et donc peux tu être plus clair quand tu dis :

Procedure a copier dans un module de portée globale.
et

La procédure sera appelée dans le code par Call zz("NomRequete")


Concretement comment dois-je faire ? J'ai essayé de copier la procédure dans
un module que j'ai appelé Module 1 mais je ne sais pas comment la lancer. En
fait je ne sais pas ce qu'est un "module de portée globale" et je ne sais pas
quoi faire de Call zz("NomRequete"). Je n'ai jamais créé de module avant ça.

Merci de ton aide.
Bubu

Avatar
Eric
Bonsoir,

Un module de portée globale est un module qui contient des procédures et
fonctions (souvent générales) qui peuvent être appelées soit sur des
évènements soit dans des requêtes, formulaires... Il s'agit des modules
créés dans l'onglet Modules de la fenêtre Base de données, ce que tu as
fait en copiant la procédure dans le module nommé Module1.

Supposons que tu veux exporter une requête nommée Test en cliquant sur
un bouton de formulaire. Soit Formulaire1 le nom du formulaire et
Commande0 le nom du bouton de commande. Sur l'évènement clic du bouton
Commande0 (Fenêtre Propriétés du bouton|Onglet Evènements), tu crées une
procédure évènementielle en cliquant sur les 3 points en bout de ligne
(...).

Il s'écrit automatiquement :
Private Sub Commande0_Click()

End Sub

entre ces 2 lignes tu écris Call zz("Test") pour obtenir:

Private Sub Commande0_Click()
Call zz("Test")
End Sub
Cette derniere procédure est écrite dans le module du formulaire. Tu
remarqueras qu'elle est de type privée, donc visible uniquement dans ce
module de ce formulaire. De plus elle est dite évènementielle car liée à
l'évènement Cliquer sur le bouton nommé Commande0.

J'espère avoir été clair ;-)

PS: Si la procédure zz(NomTableRequête As String) n'est utilisée que
dans le formulaire Formulaire1, on aurait pu tout aussi bien la copier
dans ce formulaire là. Mais bon, avançons pas à pas.



Bonjour Eric,

désolé d'être un peu long à la détente mais je n'arrive pas toujours à me
dégager le temps que je voudrais pour travaille à mon projet. La procédure
que tu m'as donnée a l'air bien mais je ne connais pas grand chose au vba et
au développement sous access. Et donc peux tu être plus clair quand tu dis :


Procedure a copier dans un module de portée globale.


et

La procédure sera appelée dans le code par Call zz("NomRequete")



Concretement comment dois-je faire ? J'ai essayé de copier la procédure dans
un module que j'ai appelé Module 1 mais je ne sais pas comment la lancer. En
fait je ne sais pas ce qu'est un "module de portée globale" et je ne sais pas
quoi faire de Call zz("NomRequete"). Je n'ai jamais créé de module avant ça.

Merci de ton aide.
Bubu



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr


Avatar
Bubu
Je n'aurai qu'un mot : EXCELLENT ! Ca marche impec, ou presque... D'abord tu
ne t'étais pas trompé, c'est bien vbLf pour le symbole de retour à la ligne.
Mais j'avais oublié de mentionner qqchose dans ma question : les données d'un
même champ doivent être entre guillement : "donnée1 vbLf donnée2 vbLf
donnée3" vbTab "donnéea vbLf donnéeb vbLf donnéec"

J'ai essayé de les insérer moi même en ajoutant des éléments du type """" &
... dans le module mais ça ne marche pas. Je ne dois pas avoir la bonne
syntaxe.

Merci beaucoup pour ton aide autant précieuse qu'efficace !
Bubu


Bonsoir,

Un module de portée globale est un module qui contient des procédures et
fonctions (souvent générales) qui peuvent être appelées soit sur des
évènements soit dans des requêtes, formulaires... Il s'agit des modules
créés dans l'onglet Modules de la fenêtre Base de données, ce que tu as
fait en copiant la procédure dans le module nommé Module1.

Supposons que tu veux exporter une requête nommée Test en cliquant sur
un bouton de formulaire. Soit Formulaire1 le nom du formulaire et
Commande0 le nom du bouton de commande. Sur l'évènement clic du bouton
Commande0 (Fenêtre Propriétés du bouton|Onglet Evènements), tu crées une
procédure évènementielle en cliquant sur les 3 points en bout de ligne
(...).

Il s'écrit automatiquement :
Private Sub Commande0_Click()

End Sub

entre ces 2 lignes tu écris Call zz("Test") pour obtenir:

Private Sub Commande0_Click()
Call zz("Test")
End Sub
Cette derniere procédure est écrite dans le module du formulaire. Tu
remarqueras qu'elle est de type privée, donc visible uniquement dans ce
module de ce formulaire. De plus elle est dite évènementielle car liée à
l'évènement Cliquer sur le bouton nommé Commande0.

J'espère avoir été clair ;-)

PS: Si la procédure zz(NomTableRequête As String) n'est utilisée que
dans le formulaire Formulaire1, on aurait pu tout aussi bien la copier
dans ce formulaire là. Mais bon, avançons pas à pas.



Bonjour Eric,

désolé d'être un peu long à la détente mais je n'arrive pas toujours à me
dégager le temps que je voudrais pour travaille à mon projet. La procédure
que tu m'as donnée a l'air bien mais je ne connais pas grand chose au vba et
au développement sous access. Et donc peux tu être plus clair quand tu dis :


Procedure a copier dans un module de portée globale.


et

La procédure sera appelée dans le code par Call zz("NomRequete")



Concretement comment dois-je faire ? J'ai essayé de copier la procédure dans
un module que j'ai appelé Module 1 mais je ne sais pas comment la lancer. En
fait je ne sais pas ce qu'est un "module de portée globale" et je ne sais pas
quoi faire de Call zz("NomRequete"). Je n'ai jamais créé de module avant ça.

Merci de ton aide.
Bubu



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr





Avatar
Eric
Bonjour,

Dans le code de la procédure zz(NomTableRequête As String), remplaces
les lignes comprises entre :

Open CurrentProject.Path & "" & "Fichier.txt" For Output As f
et
Close #f

par celles-ci:

Print #f, strChaine ' écriture des noms des champs
' Traitement des valeurs
strChaine = Chr(34)
If Not rst.BOF And Not rst.EOF Then
rst.MoveLast: rst.MoveFirst
cpt = rst.RecordCount
' on récupère le jeu d'enregistrements dans un tableau
varTemp = rst.GetRows(cpt)
For j = 0 To UBound(varTemp, 1) ' compteur de champs
For i = 0 To UBound(varTemp, 2) ' compteur de valeurs
strChaine = strChaine & varTemp(j, i) & vbLf
Next i
strChaine = Left(strChaine, Len(strChaine) - 1) & Chr(34)
strChaine = strChaine & vbTab & Chr(34)
Next j
strChaine = Left(strChaine, Len(strChaine) - 2)
Print #f, strChaine
End If


Je n'aurai qu'un mot : EXCELLENT ! Ca marche impec, ou presque... D'abord tu
ne t'étais pas trompé, c'est bien vbLf pour le symbole de retour à la ligne.
Mais j'avais oublié de mentionner qqchose dans ma question : les données d'un
même champ doivent être entre guillement : "donnée1 vbLf donnée2 vbLf
donnée3" vbTab "donnéea vbLf donnéeb vbLf donnéec"

J'ai essayé de les insérer moi même en ajoutant des éléments du type """" &
... dans le module mais ça ne marche pas. Je ne dois pas avoir la bonne
syntaxe.

Merci beaucoup pour ton aide autant précieuse qu'efficace !
Bubu




--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Bubu
Bonsoir Eric,

J'ai fait les changement que tu m'as indiqués mais ça n'a rien changé et les
données d'un même champs ne se retrouvent pas entre guillements. As-tu une
idée du problème.

Merci
Bubu
Avatar
Eric
Bonjour,

Ah, ça m'étonne beaucoup car voila ce que j'obtiens dans le fichier.txt:
Champ1 Champ2 champ3
"A
B
H
K
Z
T" "12
35
43
58
92
150" "M
N
O
P
Q
R"

Le contenu de chaque champ est bien entre des guillemets, puis la
tabulation avant de passer au contenu du champ suivant.
(Le copier coller a interprété les vblf par des retours à la ligne).

Si besoin, je peux te faire passer une bd exemple.



Bonsoir Eric,

J'ai fait les changement que tu m'as indiqués mais ça n'a rien changé et les
données d'un même champs ne se retrouvent pas entre guillements. As-tu une
idée du problème.

Merci
Bubu


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Bubu
Bonjour Eric,

Je suis surpris que chez toi ça fonctionne et pas chez moi. Je te mets
l'intégralité du module que j'ai créé, hstoire que tu me dises si j'ai commis
une erreur dans mes copier-coller. Mais je suis preneur d'une bd exemple.

Sub zz(TABLEAU As String)
' Charger la référence Microsoft DAO 3.x Object Library
Dim rst As DAO.Recordset, fld As DAO.Field
Dim f As Integer, cpt As Long
Dim varTemp, i As Long, j As Byte
Dim strChaine As String
' Adapter le nom de la table/requête
Set rst = CurrentDb.OpenRecordset(TABLEAU)
For Each fld In rst.Fields
If Len(strChaine) = 0 Then
strChaine = fld.Name
Else
strChaine = strChaine & vbTab & fld.Name
End If
Next fld
f = FreeFile
' Adapter le chemin et le nom du fichier .txt
Open CurrentProject.Path & "" & "Tableau.txt" For Output As f
Print #f, strChaine ' écriture des noms des champs
' Traitement des valeurs
strChaine = Chr(34)
If Not rst.BOF And Not rst.EOF Then
rst.MoveLast: rst.MoveFirst
cpt = rst.RecordCount
' on récupère le jeu d'enregistrements dans un tableau
varTemp = rst.GetRows(cpt)
For j = 0 To UBound(varTemp, 1) ' compteur de champs
For i = 0 To UBound(varTemp, 2) ' compteur de valeurs
strChaine = strChaine & varTemp(j, i) & vbLf
Next i
strChaine = Left(strChaine, Len(strChaine) - 1) & Chr(34)
strChaine = strChaine & vbTab & Chr(34)
Next j
strChaine = Left(strChaine, Len(strChaine) - 2)
Print #f, strChaine
End If
Close #f
rst.Close
Set rst = Nothing
Erase varTemp
End Sub

Y aurait-il une raison pour que mon access ne comprenne pas le Chr(34). Pour
info je suis en access 2002.

Merci de ton aide


Bonjour,

Ah, ça m'étonne beaucoup car voila ce que j'obtiens dans le fichier.txt:
Champ1 Champ2 champ3
"A
B
H
K
Z
T" "12
35
43
58
92
150" "M
N
O
P
Q
R"

Le contenu de chaque champ est bien entre des guillemets, puis la
tabulation avant de passer au contenu du champ suivant.
(Le copier coller a interprété les vblf par des retours à la ligne).

Si besoin, je peux te faire passer une bd exemple.



Bonsoir Eric,

J'ai fait les changement que tu m'as indiqués mais ça n'a rien changé et les
données d'un même champs ne se retrouvent pas entre guillements. As-tu une
idée du problème.

Merci
Bubu


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr




Avatar
Eric
Bonjour,

Le chr(34) est compris par quelque version que ce soit, donc le problème
n'est pas là.
J'ai fait une lecture rapide et je n'ai rien vu qui empècherait que la
liste des valeurs des champs, pour chaque champ, ne soit pas entourée de
guillemets.

L'exemple est là : http://cjoint.com/?iFlwzKtMXp

Ici le fichier .txt à ouvrir dans Notepad pour te montrer ce que
j'obtiens : http://cjoint.com/?iFlubSIK1R

--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr
1 2