[Déplacé .Net --> VBA] Importer un fichier Excel Csv dans une table Acess

DAVIMIKA Messages postés 118 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 10 janvier 2014 - 30 déc. 2009 à 12:08
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 31 déc. 2009 à 09:25
Bonjour,

Je voudrais utiliser le code qu'a communiqué jperre sur ce post :

http://www.vbfrance.com/forum/sujet-IMPORTER-FICHIER-TEXTE-VOLUMINEUX-DANS-TABLE-ACCESS_715453.aspx

mais j'obtiens une erreur dépassement de capacité sur la ligne :

For n = 1 To Len(sLine)

Champs de la table Access 2003:
HEURE
NOMA
NOMB
COURT
NATURE
Id

Sur WordPad les enregistrements de la table importée (Fichier Excel Csv) se présentent de cette façon :

DATE ; HEURE ; NOM ; NOM ; COURT ; NATURE
Samedi 05 Décembre 2009;09h 00;DURAND;;N°7;Adhérent

Et sur la ligne For n = 1 To Len(sLine) le survol de la souris donne:

"DATE ; HEURE ; NOM ; NOM ; COURT ; NATURE Samedi 05 Décembre 2009; 0....

Nota : ce n'est pas une erreur de ma part le fichier à importer contient deux fois le champ NOM et il n'est pas volumineux.

Sub ImportData(sFileCSV As String, sTableName As String)
Dim lFileCSV As Long, rImport As Recordset,sLine As String, sField As String
Dim Curdb As Database, n As Byte, m As Byte
Set Curdb=CurrentDb
Set rImport=Curdb.OpenRecordset(sTableName,dbOpenTable)
lFileCSV=FreeFile
Open sFileCSV For Input As #lFileCSV
Do
Line Input #lFileCSV, sLine
rImport.AddNew
For n=1 To Len(sLine)
If Mid(sLine,n,1)<>";" Then
sField=sField & Mid(sLine,n,1)
Else
If m<>6 And m<>8 Then
rImport.Fields(m)=Val(sField)
ElseIf m=6 Then
rImport.Fields(m)=sField
End If
sField=""
m=m+1
End If
'Je suppose que l'on enregistre pas le Champ qui ne contient aucune donnée
'Dernier Champ
?If n=Len(sLine) Then
?rImport.Fields(m-1)=Val(sFields)
?sFields=""
?m=0
?End If
Next n
rImport.Update
Loop Until EOF(lFileCSV)
Close #lFileCSV
rImport.Close
End Sub

Merci pour votre aide.

Salutations

3 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
30 déc. 2009 à 16:23
Merci d'utiliser la colorisation syntaxique disponible (3ème icone à partir de la droite) parce que c'est chiant, fatiguant ... et je n'ai pas personnellement le temps de faire du copier/coller.

Pour séparer tes données, utilise un simple Split avec le caractère ;
Tu y gagneras en clarté et en efficacité.

Au moment de l'erreur :
Que vaut 'n' ?
Que vaut Len(sLine) ?

Un Line Input ne fonctionne que si chaque ligne se termine bien par un retour chariot Chr$(13) ou un retour chariot + retour ligne Chr$(13) & Chr$(10)
Si tes lignes ne sont séparées que par un Chr$(10), Line Input lira le fichier entier, d'où, peut-être, cette erreur de dépassement.

D'autre part, je ne suis pas familier de .Net, mais il me semble que la méthode Open et Line Input que tu utilises est une méthode VB6. VB.Net a un nouvel objet FileStream avec des méthodes surement plus efficaces.
0
DAVIMIKA Messages postés 118 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 10 janvier 2014
31 déc. 2009 à 00:12
Bonsoir Jack,

Merci pour ta réponse, je tiendrais compte de tes remarques pour mes prochains post, par contre je précise que je suis en Vba Access et que j'ai jamais fait d'importation de fichier.

Au moment de l'erreur
N=0 et
Len(sLine) = 1650

Salutations
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
31 déc. 2009 à 09:25
Super de ne pas avoir choisi la bonne catégorie : tu viens de perdre (et moi aussi) du temps.

Erreur normale puisque 'n' est dimensionné comme un Byte, donc n'accepte que des valeurs de 0 à 255.
Simplement, dimensionne-le 'As Long'

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Rejoignez-nous