IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

[VBA] Importation d'un fichier csv sur plusieurs feuilles


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2016
    Messages : 14
    Par défaut [VBA] Importation d'un fichier csv sur plusieurs feuilles
    Bonjour, Bonsoir,

    Dans le cadre d'un projet, je dois importer un fichier csv dépassant le million de ligne, pour cela j'ai eu l'idée d'importer le fichier csv sur plusieurs feuilles, c'est à dire que mon programme devra importer déjà à la première feuille et quand la première feuille est pleine, il remplit le reste du fichier dans la 2ème feuille et tout ça dans un même classeur,

    Malheuresement, je coince et je ne trouve actuellement aucune solution à mon problème et je tourne en rond.

    Pouvez vous m’aidez svp ?

    Merci

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2016
    Messages : 14
    Par défaut Oubli
    Ah oui et j'allais oublier de vous donner le code que j'ai déjà faite, le programme permet d'ouvrir une fenetre permettant d'importer le fichier csv,

    Cordialement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
     
    Option Explicit
        Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
                 "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
        Private Type OPENFILENAME
          lStructSize As Long
          hwndOwner As Long
          hInstance As Long
          lpstrFilter As String
          lpstrCustomFilter As String
          nMaxCustFilter As Long
          nFilterIndex As Long
          lpstrFile As String
          nMaxFile As Long
          lpstrFileTitle As String
          nMaxFileTitle As Long
          lpstrInitialDir As String
          lpstrTitle As String
          flags As Long
          nFileOffset As Integer
          nFileExtension As Integer
          lpstrDefExt As String
          lCustData As Long
          lpfnHook As Long
          lpTemplateName As String
        End Type
        Function GetFileName(sFilter As String, sInitialDir As String, sTitle As String) As String
          Dim OpenFile As OPENFILENAME, lReturn As Long
     
          With OpenFile
            .lStructSize = Len(OpenFile)
            .lpstrFilter = sFilter
            .nFilterIndex = 1
            .lpstrFile = String(257, 0)
            .nMaxFile = Len(OpenFile.lpstrFile) - 1
            .lpstrFileTitle = OpenFile.lpstrFile
            .nMaxFileTitle = OpenFile.nMaxFile
            .lpstrInitialDir = sInitialDir
            .lpstrTitle = sTitle
            .flags = 0
          End With
          lReturn = GetOpenFileName(OpenFile)
          If lReturn = 0 Then
            GetFileName = ""
          Else
             GetFileName = Trim(OpenFile.lpstrFile)
          End If
        End Function
        Sub test()
          Dim sPathFic As String, sFilter As String
          sFilter = "Fichier d'export (*.csv)" & Chr(0) & "*.csv" & Chr(0)
          ' Donner le choix du fichier
         sPathFic = GetFileName(sFilter, "X:\Projet", "Sélectionnez le fichier à ouvrir")
          If sPathFic = "" Then Exit Sub
          '
         With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & sPathFic, Destination:=Range("$A$1"))
            .Name = "12062000_1"
            .FieldNames = True
            .RowNumbers = True
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 850
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = True
            .TextFileSemicolonDelimiter = False
            .TextFileCommaDelimiter = True
            .TextFileSpaceDelimiter = False
            .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1)
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
          End With
          Sheets("Feuil2").Select
          Range("B7").Select
          ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotCache.Refresh
        End Sub

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Pourquoi ne pas passer par une simple lecture séquentielle avec une boucle while ?
    https://msdn.microsoft.com/fr-fr/lib.../gg264519.aspx
    Ca parait plus simple qu'une requête, non ?

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2016
    Messages : 14
    Par défaut
    Je trouve juste ça plus intéressant comme ca l'utilisateur pourrai choisir le fichier à importer qui lui plait

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Tu travail dans le même bureau que celui qui a posté cette question?

    http://www.developpez.net/forums/d16...a/#post8808312

  6. #6
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Salut Robert !


    _________________________________________________________________________________________________________
    Je suis Paris, Nice, Bruxelles, Charlie, …

  7. #7
    Invité
    Invité(e)
    Par défaut
    Salut Marc,

    Personnellement je trouve qu'il est préférable de ce tapper l'incruste sur un autre poste que de multiplier les mêmes questions!

    Surtout que le premier poste date du 26/11

    Va savoir si ça ce trouve ils sont même assis sur la même chaise!
    Dernière modification par Invité ; 29/11/2016 à 18h31.

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2016
    Messages : 14
    Par défaut
    Pas a ma connaissance non

  9. #9
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par dysorthographie Voir le message
    Bonsoir,
    Tu travail dans le même bureau que celui qui a posté cette question?

    http://www.developpez.net/forums/d16...a/#post8808312
    Ils doivent avoir le même professeur. Ou bien les professeurs s'abreuvent à la même source.

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2016
    Messages : 14
    Par défaut
    Étonnamment,probablement, car il semblerait que le projet soit a peu près le même (si c'est pas le même), quelqu'un pourrait m'aider ou bien nous aider ? svp ?

    Merci

  11. #11
    Invité
    Invité(e)
    Par défaut
    bonjour,
    je t'est donné la réponse dans le lien du poste #6!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim intFic As Integer
    intFic = FreeFile
    Open "c:\essai\monfichier.csv" For Input As intFic
    While Not EOF(intFic)
    Line Input #intFic, toto
    l = l + 1
    If l Mod Rows.Count = 0 Then ThisWorkbook.Sheets.Add: l = 1 '?1048576 mod Rows.Count = 0
    t = Split(toto, ";")
    ActiveSheet.Cells(l, 1).Resize(1, UBound(t)) = t
    Wend
    close intFic
    Dernière modification par Invité ; 30/11/2016 à 09h03.

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2016
    Messages : 14
    Par défaut
    Ah oui effectivement toutes mes excuses, je vais tester ce programme, merci

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2016
    Messages : 14
    Par défaut
    Ahum, par quoi remplace ton la variable toto stp ?
    Car ca me pose probleme dans mon programme,

    Merci

  14. #14
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    salut Robert
    ma version avec sélection du fichier
    je procède légèrement différemment pour les lignes
    je prends tout le texte du csv pour libérer le freefile

    j'ai commenté chaque lignes


    j'ai séparé en 3 parties( partie1,partie2,partie3)

    1. partie1 boite de dialog (choisir le fichier CSV)
    2. partie 2 recup du texte complet par( open for input)dans la variable lachaine
    3. partie3 disémination dans le classeur avec ajout de sheet dynamique si nécessaire


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Sub ouvre_csv()
        Dim laChaine As String, x, fichier As String, texte, i As Long, sh As Long, lig As Long 'variable necessaire
        ' partie 1
       ' ouverture de la boite de dialog fichier
        With Application.FileDialog(msoFileDialogOpen)
            .AllowMultiSelect = False ' on choisi q'un seul fichier
            If .Show = True Then 'si on annule pas
                fichier = .SelectedItems(1) 'fichier sera l'item choisi dans la boite de dialog
            Else
                MsgBox "Annuler" ' sinon un message
                Exit Sub 'sortie de sub si annuler
            End If
        End With
        'partie 2
        ' lecture et enregistrement du csv dans la variable
        x = FreeFile
        Open fichier For Input As #x  'ouverture du fichier en mémoire (non apparent)
        laChaine = Input(LOF(x), #x) 'placement du texte complet dans la variable "lachaine
        Close #x' fermeture du fichier 
        'partie 3
        'exploitation du csv
        sh = 2    ' on demarre au 2 eme sheets le premier étant l'accueil chez moi
        texte = Split(laChaine, vbCrLf)  ' on coupe le texte par les saut de ligne
        For i = 0 To UBound(texte)
            lig = lig + 1    'on increment le n° de ligne
            With Sheets(sh)
                .Name = "page" & sh - 1    ' on nomme le sheets
                .Cells(lig, 1) = texte(i)    'on met la ligne entiere dans la cellule la ligne complete meme avec  les pointvirgules)
                If lig = Rows.Count - 2 Or i = UBound(texte) Then    ' si on arrive en bas du sheets ou au bout des lignes du csv alors
                    'on applique la fonction native |||textTocolumns||| par les point virgules
                    .Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Space:=False
                    sh = sh + 1: lig = 0 'on increment l'index de sheets
                    If Sheets.Count < sh Then Sheets.Add After:=Sheets(Sheets.Count) 'au cas ou il n'y aurait pas le sheets (sh) on l'ajoute
                End If
            End With
        Next
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  15. #15
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Si comme le laisse penser une autre discussion qui parait avoir la même origine () le fichier csv à traiter est énorme, la lecture d'un seul coup (dans une variable) sera sujette à caution.
    Dans un tel cas, il sera nécessaire de le lire par petits blocs.

  16. #16
    Invité
    Invité(e)
    Par défaut
    bonjour Patrick et unparia,
    oui si le fichier est volumineux il peux s'avéré utile de le géré bloc de 1024 par exemple.

    ligne par ligne ça fait de accès disk, et tout d'un coup ça charge la mémoire!

    la solution de Patrick permet le compromis!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     laChaine = Input(1024, #x)

  17. #17
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    oui c'est vrai j'y pense pas trop a cela

    robert comment avec input(1024,#x) on peut lire j'jusqu'au bout
    il faut boucler non?
    je ne l'ai jamais fait ca
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  18. #18
    Invité
    Invité(e)
    Par défaut
    oui il faut bouclé!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    While Not EOF(intFic)
    laChaine = Input(1024, #x)
    call subtraitement(laChaine)

  19. #19
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    ok ca m'oblige donc a regrouper sub et fonction

    mais attention ca implique aussi la vérification du reste du texte a chaque fois
    car chaque tranche peut contenir le départ du suivant en terme d'élément dans le JSON
    ce qui complique la manœuvre

    j'avais trouvé un modelé je sais plus ou il est avec ADO et je pouvais le lire un peu comme avec le xml élément par élément
    j'essaierais de le retrouver
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  20. #20
    Invité
    Invité(e)
    Par défaut
    il faut adapter!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    Sub ouvre_csv()
        Dim laChaine As String, x, Fichier As String, texte, I As Long, sh As Long, lig As Long 'variable necessaire
        ' partie 1
       ' ouverture de la boite de dialog fichier
        With Application.FileDialog(msoFileDialogOpen)
            .AllowMultiSelect = False ' on choisi q'un seul fichier
            If .Show = True Then 'si on annule pas
                Fichier = .SelectedItems(1) 'fichier sera l'item choisi dans la boite de dialog
            Else
                MsgBox "Annuler" ' sinon un message
                Exit Sub 'sortie de sub si annuler
            End If
        End With
        'partie 2
        t = Taille_Fichier(Fichier)
     
        Moins1024 = t Mod 1024
        Nb1024 = (t - (t Mod 1024)) / 1024
        ' lecture et enregistrement du csv dans la variable
        x = FreeFile
        Open Fichier For Input As #x  'ouverture du fichier en mémoire (non apparent)
       For I = 1 To Nb1024
        laChaine = Input(1024, #x) 'placement du texte complet dans la variable "lachaine
        traitement laChaine
     Next
     If Moins1024 > 0 Then laChaine = Input(Moins1024, #x): traitement laChaine
     
     
        Close #x ' fermeture du fichier
        'partie 3
        'exploitation du csv
     
    End Sub
    Sub traitement(laChaine As String)
     sh = 2    ' on demarre au 2 eme sheets le premier étant l'accueil chez moi
        texte = Split(laChaine, vbCrLf)  ' on coupe le texte par les saut de ligne
        For I = 0 To UBound(texte)
            lig = lig + 1    'on increment le n° de ligne
            With Sheets(sh)
                .Name = "page" & sh - 1    ' on nomme le sheets
                .Cells(lig, 1) = texte(I)    'on met la ligne entiere dans la cellule la ligne complete meme avec  les pointvirgules)
                If lig = Rows.Count - 2 Or I = UBound(texte) Then    ' si on arrive en bas du sheets ou au bout des lignes du csv alors
                    'on applique la fonction native |||textTocolumns||| par les point virgules
                    .Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Space:=False
                    sh = sh + 1: lig = 0 'on increment l'index de sheets
                    If Sheets.Count < sh Then Sheets.Add After:=Sheets(Sheets.Count) 'au cas ou il n'y aurait pas le sheets (sh) on l'ajoute
                End If
            End With
        Next
    End Sub
    Public Function Taille_Fichier(Fichier)
    Dim fso
    Dim Fich
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set Fich = fso.GetFile(Fichier)
        Taille_Fichier = Fich.Size
    End Function

Discussions similaires

  1. [OS X] [SH] Croiser deux fichiers csv sur plusieurs critères
    Par medmaysais dans le forum Shell et commandes POSIX
    Réponses: 3
    Dernier message: 19/04/2016, 21h25
  2. [XL-2010] Import d'un fichier XML sur une feuille de calcul existante
    Par Crysta17 dans le forum Excel
    Réponses: 0
    Dernier message: 22/04/2014, 10h55
  3. Importer un fichier .csv sur excel avec VBA
    Par sambrook dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/01/2013, 12h47
  4. [AC-2003] Importer un fichier csv sur une table access
    Par mmmxtina dans le forum VBA Access
    Réponses: 0
    Dernier message: 10/08/2009, 15h16
  5. [XL-2003] Importer automatiquement un fichier CSV dans une feuille
    Par Mikayel dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/06/2009, 10h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo