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

Le
yannMIL
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=Delimited;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 al=
pha
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
michdenis
Le #17672561
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,

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
yannMIL
Le #17681561
On 28 oct, 19:11, "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)




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
michdenis
Le #17690641
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)




On 28 oct, 19:11, "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)




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
Publicité
Poster une réponse
Anonyme