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

Excel Discussion :

Importer des fichiers .csv dans des worksheets existantes [XL-2010]


Sujet :

Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    ingénieur recherche
    Inscrit en
    Octobre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : ingénieur recherche

    Informations forums :
    Inscription : Octobre 2014
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Importer des fichiers .csv dans des worksheets existantes
    Bonjour à toutes et tous,

    Ainsi une nouvelle source de données (dont l'extension est en .csv) à mettre en perspectives avec d'autres, je souhaite importer dans un workbook existant à certaines worksheets ces données.

    la routine proposée pour effectuer ce processus est la suivante:
    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
    Sub Test1()
    '
        Const MyExt = "TEXT;"
        Const MyPath = "----loading path----/"
        '
        Dim MyName1 As String
        Dim MyName2 As String
        Dim n As Integer
        '
        n = ThisWorkbook.Worksheets.Count
        '
        MyName1 = Dir(MyPath & "*.csv")
        '
        If MyName1 = "" Then MsgBox "No files found"
        '
        For i = 1 To n
            ThisWorkbook.Worksheets(i).Activate
            MyName2 = ThisWorkbook.Worksheets(i).Name
            '
            If Mid(MyName2, 3, 1) = "2" Then
                With ActiveSheet.QueryTables.Add(Connection:=MyExt & MyName1, Destination:=Range("$H$9"))
                    .Name = ""
                    .FieldNames = True
                    .RowNumbers = False
                    .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, 1, 1)
                    .TextFileDecimalSeparator = "."
                    .TextFileTrailingMinusNumbers = True
                End With
            End If
        Next
    End Sub
    En l'état, la routine execute correctement les premières boucles "if", "for", "if". Par contre l’exécution des commandes inclues dans la boucle "with", si elles ne font pas échouer l'exécution de la routine, ne se traduisent par aucune importation de données.

    Auriez vous quelques conseils, ou solutions?

    Bien cordialement,

  2. #2
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Bonjour,
    Je ne connais pas le code pour importation de fichier csv, mais quelque chose m'interpelle dans ton code sur la ligne avec le With. "Add" est un verbe d'action, donc j'imagine que sur cette ligne tu ajoutes quelque chose à ta table. A priori, ton With ne fait donc pas référence à un objet, mais à une action. Or With sert à faire référence à un objet pour na pas avoir à le recopier plusieurs fois. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With Sheets("maFeuil")
        .Range("A1").Value = "toto"
        .Range("A2").Value = "titi"
    End With
    Par contre, tu ne peux pas écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    With Sheets("maFeuil").Activate
        .Range("A1").Value = "toto"
        .Range("A2").Value = "titi"
    End With
    ... après je ne suis pas 100% sûre ...
    Mais tu peux peut-être déjà essayé de mieux définir quelle référence tu veux mettre dans le With.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    ingénieur recherche
    Inscrit en
    Octobre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : ingénieur recherche

    Informations forums :
    Inscription : Octobre 2014
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Bonjour riaolle,

    Merci pour ton conseil.

    La commande with est inspirée par un recours à l'enregistreur de macro utilisée pendant l'importation de l'un des fichiers. J'ai pu me planter en reprenant cette base, mais je ne voie pas où ^^.

    Je te met le résultat de l'enregistreur de macro pendant l'importation:
    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
    Sub PostProcessDIC()
    '
    ' PostProcessDIC Macro
    '
     
    '
        With ActiveSheet.QueryTables.Add(Connection:= _
            "TEXT;E:\CoPerSim\2014\A_Data\A3_Traction\A32_Essais\A322_Carac1D\A3221_Fatigue\A32211_C-SMC_V58\f10HzR01\Sigma60%_underway\RO-00\20170121_RO-00-02_C\20170121_RO-00-02_C-DIC\d qs 1\d qs 1_DIC.csv" _
            , Destination:=Range("$H$9"))
            .Name = "d qs 1_DIC"
            .FieldNames = True
            .RowNumbers = False
            .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, 1, 1)
            .TextFileDecimalSeparator = "."
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
        End With
    End Sub

  4. #4
    Expert éminent sénior 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
    Points : 32 866
    Points
    32 866
    Par défaut
    Perso (j'insiste sur le fait que c'est mon goût personnel et non une règle absolue), pour utiliser un CSV en VBA, je préfère utiliser Workbooks.OpenText plutôt que les Query.
    https://msdn.microsoft.com/fr-fr/lib.../ff837097.aspx

    C'est plus simple à utiliser et plus clair (du moins pour moi).

    Après un Workbooks.OpenText, tu te retrouves avec un classique Workbook dont il est facile de transférer les données vers un autre Workbook.Worksheet par un Range.Copy ou autre.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    ingénieur recherche
    Inscrit en
    Octobre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : ingénieur recherche

    Informations forums :
    Inscription : Octobre 2014
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Solution trouvé pour la proposition avec "Querry":

    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
    87
    88
    89
    90
    91
    Sub test2()
    '
        Const MyExt = "TEXT;"
        Const MyPath = "----loading path-----"
        '
        Dim MyName1 As String
        Dim MyName2 As String
        Dim MyImport As String
        '
        Dim n As Integer
        '
        n = ThisWorkbook.Worksheets.Count
        '
        MyName1 = Dir(MyPath & "*.csv")
        MyImport = MyExt & MyPath & MyName1
        '
        If MyName1 = "" Then MsgBox "No files found"
        '
        For i = 1 To n
            ThisWorkbook.Worksheets(i).Activate
            MyName2 = ThisWorkbook.Worksheets(i).Name
            '
            If i = 2 Then
                With ActiveSheet.QueryTables.Add(Connection:= _
                    MyImport _
                    , Destination:=Range("$H$9"))
                    .Name = "plop"
                    .FieldNames = True
                    .RowNumbers = False
                    .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, 1, 1)
                    .TextFileDecimalSeparator = "."
                    .TextFileTrailingMinusNumbers = True
                    .Refresh BackgroundQuery:=False
                End With
                '
                MyName1 = Dir()
            End If
            '
            If Mid(MyName2, 3, 1) = "2" Then
                With ActiveSheet.QueryTables.Add(Connection:= _
                    MyImport _
                    , Destination:=Range("$H$9"))
                    .Name = "plop"
                    .FieldNames = True
                    .RowNumbers = False
                    .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, 1, 1)
                    .TextFileDecimalSeparator = "."
                    .TextFileTrailingMinusNumbers = True
                    .Refresh BackgroundQuery:=False
                End With
                '
                MyName1 = Dir()
            End If
        Next
    End Sub
    je vais essayer la solution alternative avec OpenText et la posterais si elle est plus efficace ^^.


    Merci à tout deux pour vos conseils,

    Bien cordialement,

  6. #6
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut
    Bonjour !

    Seul QueryTables permet d'importer directement des données dans une feuille de calculs précise.

    Certaines propriétés générées par l'Enregistreur de macro sont inutiles car leur valeur est celle par défaut,
    juste en lisant bien l'aide VBA interne …     Voir aussi les nombreux exemples dans le bon forum !

    ___________________________________________________________________________________________________________
    Je suis Paris, London, Istanbul, Berlin, Nice, Bruxelles, Charlie, …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/09/2011, 23h07
  2. Réponses: 1
    Dernier message: 21/04/2011, 11h30
  3. Importer 1 Fichier CSV avec des ";" dans les champs
    Par opaillon dans le forum Import/Export
    Réponses: 3
    Dernier message: 15/01/2009, 14h23
  4. Réponses: 45
    Dernier message: 14/02/2008, 15h41
  5. Réponses: 3
    Dernier message: 11/06/2007, 11h20

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