Microsoft 365 VBA : Ouverture de fichier csv directement en mémoire

tbft

XLDnaute Accro
Bonjour à tous

J'aimerais savoir si il est possible d'ouvrir depuis le VBA un fichier au format csv mais sans l'ouvrir comme un classeur plutôt transférer le contenue du fichier dans une variable.
Avez-vous une idée, s'il vous plait ?

Je demande cela car je dois traiter un grand nombre de fichier csv, et j'aimerai ne pas à avoir tous à les ouvrir avec excel (même par macro).

Exemple de forme d'instruction :
VB:
Dim Contenue_CSV as variant 'ou autre
Contenue_CSV=open("C:\toto\titi.csv")

La variable Contenue_CSV contiendrai le contenue du fichier et le lien vers le fichier.
 

Efgé

XLDnaute Barbatruc
Bonjour

Avec ce que j'ai compris, peut-être comme ça (tu auras tout le texte du CSV dans une variable):
VB:
sub test()
Dim Filenumber%
Dim Contenue_CSV$, chainedata$

Contenue_CSV = "C:\toto\titi.csv"
Filenumber = FreeFile
'Ouverture du fichier
Open Contenue_CSV For Binary As #Filenumber
'Dimentionnement de la variable chainedata
chainedata = Space$(LOF(Filenumber))
'Chainedata = tout le texte du csv
Get #Filenumber, , chainedata
'Fermeture du CSV
Close #Filenumber
       
End Sub
 

merinos

XLDnaute Accro
Salut @tbft ,

je regarde la video c'est complexe... en tout cas a comparer a powerquery... qui est fait pour cela.

ma méthode.

En gros tu crée un query sur un CSV
tu le transforme en FONCTION sur les fichiers

tu crée un query qui selectionne les CSV a importer
tu applique la fonction aux fichiers.

fini.


Si tu garde seulement en memoire, tu n'est pas limité a 1.000.000 lignes...
 

patricktoulon

XLDnaute Barbatruc
Bonjour
je te propose d'avoir carrément le tableau en mémoire
  1. séparateur au choix
  2. header(entete)au choix(on commence a la ligne 0 ou 1)

2 msgbox testent le return dans la sub

la seul chose a modifier c'est le chemin du fichier pour toi


VB:
Sub test()
    Dim MonTbloCSV, Fichier$
    Fichier = "C:\Users\polux\DeskTop\moncsv.csv"
    montabloCSV = GetTableCsV(Fichier)
   
    'montabloCSV est en base 0
    MsgBox montabloCSV(0, 0)    'le premier en haut a gauche
    MsgBox montabloCSV(2, 2)    'le 3me ligne,3eme colonne

'2 arguments sont optional
'1° le séparateur  avec le ";" par défaut
'2° 'header  on peut sauter la première ligne (les entêtes )
End Sub




Function GetTableCsV(Fichier, Optional separateur As String = ";", Optional header As Boolean = False)
    Dim laChaine As String, x, c&, i&, T, Q&
    x = FreeFile: Open Fichier For Binary Access Read As #x: laChaine = String(LOF(x), " "): Get #x, , laChaine: Close #x
    x = Split(laChaine, vbCrLf)
    For i = IIf(header, 1, 0) To UBound(x): Q = UBound(Split(x(i), separateur)): c = IIf(Q > c, Q, c): Next
    ReDim T(UBound(x), c)
    For i = 0 To UBound(x)
        Z = Split(x(i), separateur)
        For a = 0 To UBound(Z)
            T(i, a) = Z(a)
        Next: Next
    GetTableCsV = T
End Function
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 886
Membres
101 830
dernier inscrit
sonia poulaert