Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Import ADO de txt vers Excel : format de données

3 réponses
Avatar
yannMIL
Bonjour,

j'ai une macro qui importe des fichiers txt (champs s=E9par=E9s par des
points-virgules) vers un classeur Excel.
Le fichier txt peut faire de 1 =E0 plusieurs dizaines de milliers de
lignes, j'utilise donc ADO pour importer par bloc de 65535 lignes ;
voici mon code

Sub LargeFileImport()

' Objet ADO
Set oFSObj =3D
CreateObject("Scripting.FileSystemObject")
strFilePath =3D
oFSObj.GetFile(vFullPath).ParentFolder.Path
strFilename =3D
oFSObj.GetFile(vFullPath).Name

Set oConn =3D
CreateObject("ADODB.CONNECTION")
oConn.Open
"Provider=3DMicrosoft.Jet.OLEDB.4.0;" & _
"Data Source=3D" &
strFilePath & ";" & _
"Extended
Properties=3D""text;HDR=3DNo;FMT=3DDelimited;MaxScanRows=3D0"""
Set oRS =3D
CreateObject("AdoDb.Recordset")

oRS.Open "SELECT * FROM " &
strFilename, oConn, 3, 1, 1

I =3D 2
While Not oRS.EOF

Sheets.Add
Range("A:Z").Select
Range("A:Z").NumberFormat =3D "@"
=20
ActiveSheet.Range("A1").CopyFromRecordset oRS, 65535
I =3D I + 1
Wend
oRS.Close
oConn.Close

Set oFSObj =3D Nothing
Set oRS =3D Nothing
Set oConn =3D Nothing

End Sub

Mon probl=E8me, c'est que certains champs sont des donn=E9es
alphanum=E9riques (des n=B0 de contrats) qui doivent =EAtre import=E9s au
format texte, c'est =E0 dire en conservant les z=E9ros =E0 gauche du champs=
,
m=EAme si la donn=E9e ne contient que des chiffres. Et en plus, la donn=E9e
ne contien pas toujours le m=EAme nombre de caract=E8res.
Je peux avoir
00001256323
12545131H
0000151
00000054H
CT00546452H
12345678912

il faut que tout soit import=E9 tel quel. Pour l'instant, je perds les
z=E9ros =E0 gauche lorsque la donn=E9e est num=E9rique, et les donn=E9es al=
pha
num=E9riques ne sont pas import=E9es. J'ai l'impression que c'est li=E9 =E0
"Extended Properties=3D""text, mais pas s=FBr...

Si quelqu'un avait une id=E9e, parce que je trouve pas... Merci

3 réponses

Avatar
michdenis
Identifie laquelle des colonnes d'excel reçoit ces numéros
et donne lui le format texte avant de lancer ta procédure.
et tu le fais pour chacune des feuilles que tu utilises pour
recevoir le contenu de ta requête ADO.

(pas tester)



a écrit dans le message de news:

Bonjour,

j'ai une macro qui importe des fichiers txt (champs séparés par des
points-virgules) vers un classeur Excel.
Le fichier txt peut faire de 1 à plusieurs dizaines de milliers de
lignes, j'utilise donc ADO pour importer par bloc de 65535 lignes ;
voici mon code

Sub LargeFileImport()

' Objet ADO
Set oFSObj CreateObject("Scripting.FileSystemObject")
strFilePath oFSObj.GetFile(vFullPath).ParentFolder.Path
strFilename oFSObj.GetFile(vFullPath).Name

Set oConn CreateObject("ADODB.CONNECTION")
oConn.Open
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" &
strFilePath & ";" & _
"Extended
Properties=""text;HDR=No;FMTÞlimited;MaxScanRows=0"""
Set oRS CreateObject("AdoDb.Recordset")

oRS.Open "SELECT * FROM " &
strFilename, oConn, 3, 1, 1

I = 2
While Not oRS.EOF

Sheets.Add
Range("A:Z").Select
Range("A:Z").NumberFormat = "@"

ActiveSheet.Range("A1").CopyFromRecordset oRS, 65535
I = I + 1
Wend
oRS.Close
oConn.Close

Set oFSObj = Nothing
Set oRS = Nothing
Set oConn = Nothing

End Sub

Mon problème, c'est que certains champs sont des données
alphanumériques (des n° de contrats) qui doivent être importés au
format texte, c'est à dire en conservant les zéros à gauche du champs,
même si la donnée ne contient que des chiffres. Et en plus, la donnée
ne contien pas toujours le même nombre de caractères.
Je peux avoir
00001256323
12545131H
0000151
00000054H
CT00546452H
12345678912

il faut que tout soit importé tel quel. Pour l'instant, je perds les
zéros à gauche lorsque la donnée est numérique, et les données alpha
numériques ne sont pas importées. J'ai l'impression que c'est lié à
"Extended Properties=""text, mais pas sûr...

Si quelqu'un avait une idée, parce que je trouve pas... Merci
Avatar
yannMIL
On 28 oct, 19:11, "michdenis" wrote:
Identifie laquelle des colonnes d'excel reçoit ces numéros
et donne lui le format texte avant de lancer ta procédure.
et tu le fais pour chacune des feuilles que tu utilises pour
recevoir le contenu de ta requête ADO.

(pas tester)




Bonjour,
merci pour ta réponse.
J'avais déjà essayé en appliquant :

Range("A:Z").Select
Range("A:Z").NumberFormat = "@"

je viens de faire le test en sélectionnant juste la colonne concernée.
Le format est bien pris en compte, puisque lorsque je tape moi même
001, les zéros sont conservés.
Mais lorsque je passe
ActiveSheet.Range("A1").CopyFromRecordset oRS, 65535
le format n'est pas conservé : les zéros à gauche disparaissent, et
les données alphanum ne sont pas restituées.

une autre idée ? svp...
Merci
Avatar
michdenis
Je n'ai pas vraiment le temps d'effectuer des tests...
mais à titre de suggestion as-tu essayer d'utiliser
ceci pour remplir ta plage de cellules :

A ) en appliquant un format texte à la colonne problématique
B ) En utilisant une variable "Tableau (array)"pour contenir le
recordset

Dim MyRange as Range
Set MyRange = Feuil1.Range("A1")
Rst -> recordset
X = variable tableau
X = Rst.GetRows
offset -> Pour copier le recordset en ligne en bas de la ligne
d'étiquette si déjà présente.
Nb = nombre d'enregistrement (lignes à insérer)
'La ligne de code serait :
MyRange.Offset(1).Resize(nb, rst.Fields.Count) = Application.Transpose(x)



a écrit dans le message de news:

On 28 oct, 19:11, "michdenis" wrote:
Identifie laquelle des colonnes d'excel reçoit ces numéros
et donne lui le format texte avant de lancer ta procédure.
et tu le fais pour chacune des feuilles que tu utilises pour
recevoir le contenu de ta requête ADO.

(pas tester)




Bonjour,
merci pour ta réponse.
J'avais déjà essayé en appliquant :

Range("A:Z").Select
Range("A:Z").NumberFormat = "@"

je viens de faire le test en sélectionnant juste la colonne concernée.
Le format est bien pris en compte, puisque lorsque je tape moi même
001, les zéros sont conservés.
Mais lorsque je passe
ActiveSheet.Range("A1").CopyFromRecordset oRS, 65535
le format n'est pas conservé : les zéros à gauche disparaissent, et
les données alphanum ne sont pas restituées.

une autre idée ? svp...
Merci