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

Messages postés
119
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
10 janvier 2014
- - Dernière réponse : cs_Jack
Messages postés
14008
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
Afficher la suite 

3 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
62
0
Merci
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.
Commenter la réponse de cs_Jack
Messages postés
119
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
10 janvier 2014
0
Merci
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
Commenter la réponse de DAVIMIKA
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
62
0
Merci
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)
Commenter la réponse de cs_Jack