VBA Importation source VBA plage variable

Hello tout le monde,

Je débute tout juste le VBA et je trouve que cet univers est infini, le champs des possibles est hyper vaste
et le potentiel est énorme .

J'ai plein d'idée en tête mais mon inexpérience de terrain me bloque rapidement et comme je suis un petit padawan, le chemin de l'apprentissage sera long...

Je vous expose mon problème, je bloque sur l'importation d'un fichier CSV dans un Excel .xlsm
où est intégrée ma macro actuellement en construction (Routine_Fact_02)
et la scindassions des datas dans des colonnes distinctes (vaut un "Données/Convertir", avec le séparateur ",")

J'ai repris le code de @Steelson sur le sujet suivant, en l'adaptant à mon besoin, cf le fichier joint
Importation de données depuis un fichier .csv (excel-pratique.com)

Seulement, je rencontre 2 problèmes :

- Je n'arrive pas à intégrer la notion de plages variables selon le nombre de lignes et datas colonnes présentes dans le fichier .CSV

- Pour le collage de la data avec séparateur ",", j'ai des données décimales qui se retrouvent tronquées et deviennent inexploitable

Code actuel :

Sub Importation_CSV()

    'Déclaration Variable(s)
        Dim ListeFichier As Variant

        ListeFichier = Application.GetOpenFilename("Text Files (*.csv), *.csv")

        If ListeFichier <> False Then 'Si ListeFichier est différent de Faux
            Extraction ListeFichier, "," 'Exécuter la Sub Extraction de la sélection ListeFichier
        End If

End Sub

Sub Extraction(Fichier As Variant, Separateur As Variant)

    'Déclaration Variable(s)
        Dim Tableau() As String, Result, ligne, ContenuLigne, NbCol

        Open Fichier For Input As #1
        ligne = 1

            ReDim Result(1 To 76, 1 To ligne) "Améliorer le code, nb col variable"

            Do While Not EOF(1)
            Line Input #1, ContenuLigne
            Tableau = Split(ContenuLigne & Separateur, Separateur)

            For NbCol = 1 To 76
                Result(NbCol, ligne) = Tableau(NbCol - 1)

            Next
                ligne = ligne + 1

            ReDim Preserve Result(1 To 76, 1 To ligne)

        Loop
    Close #1

    Sheets("TRAME").Cells(10, 2).Resize(UBound(Result, 2), UBound(Result)) = Application.Transpose(Result)

End Sub

Pourriez-vous me guider et me donner quelques pistes pour solutionner les problématiques exposées.

Je vous remercie par avance pour votre aide

A bientôt ;-)

13macro-travail.xlsm (29.65 Ko)
16modele-export.csv (2.42 Ko)

Bonsoir Hitac53,

Ton fichier CSV n’est pas formaté correctement ! Les valeurs sont encadrées de deux guillemets double de chaque côté, sauf en début de ligne et en fin de ligne.

image

Je ne sais pas d’où provient ton fichier, mais quelque chose ne va pas.

En corrigeant ces défauts, ça fonctionne déjà mieux, mais les guillemets reste présents dans le résultat avec ta macro.

Le plus simple est d’utiliser Power Query pour importer un CSV bien formaté.

16hitac53.zip (40.36 Ko)

Bonsoir,

Une solution avec ce fichier .csv effectivement non formaté correctement.

Il aurait été déjà beaucoup plus simple de prendre comme séparateur le ";" et non ",".

Sub Extraction(Fichier As Variant, Separateur As Variant)

    'Déclaration Variable(s)
    Dim Tableau() As String, Result(), ContenuLigne As String
    Dim ligne As Long, colonne As Long, nb_col As Integer
    Const remplacement  As String = "."

    Open Fichier For Input As #1
    ligne = 0

        Do While Not EOF(1)

            Line Input #1, ContenuLigne

            ContenuLigne = remplacer_virgule_si_nombre(ContenuLigne, remplacement) 'remplacement provisoire de la virgule pour les nombres

            Tableau = Split(ContenuLigne, ","): If ligne = 0 Then nb_col = UBound(Tableau) + 1
            ReDim Preserve Result(1 To nb_col, ligne)

            For colonne = 1 To nb_col
                Result(colonne, ligne) = Replace(Tableau(colonne - 1), remplacement, ",") 'restauration virgule pour les nombres
            Next
                ligne = ligne + 1
        Loop

    Close #1

    Sheets("TRAME").Range("B10").Resize(UBound(Result, 2) + 1, nb_col) = Application.Transpose(Result)

End Sub

Function remplacer_virgule_si_nombre(chaîne As String, séparateur As String) As String

    Dim Rgex As Object
    Set Rgex = CreateObject("vbscript.regexp")
    With Rgex
        .Global = True         ' Définit le champ d'application.
        .IgnoreCase = True     ' Ignore la casse.
        .Pattern = "([0-9]),([0-9])" 'virgule insérée entre 2 chiffres      
        remplacer_virgule_si_nombre = .Replace(chaîne, "$1" & séparateur & "$2")
    End With
    Set Rgex = Nothing

End Function

Bonjour Valky68 & Thev,

Je vous remercie d'avoir pris le temps de répondre à ma problématique.
Concernant le fichier .CSV, il s'agit d'un extract fourni par un tiers,
donc je ne pourrais malheureusement pas faire le remplacement du séparateur "," par ";" comme le suggère Thev.
Les "" sont des indicateurs Texte.

Habituellement, je traitais ce fichier en Excel normalement sans VBA en réalisant la fonctionnalité Donnée/Convertir/Délimité par virgule
et mes décimaux n'étaient pas tronqués grâce à la présence des "" indicateurs de texte
Seulement comme c'est redondant, je souhaitais passer sous VBA pour accélérer le temps de d'intervention

@Valky68 :
Est-il possible d'utiliser Power Query en VBA ?

Bonsoir Hitac53,

Tout l’intérêt de Power Query c’est qu‘il permet de se passer de VBA. Je vais voir ce que je peux faire…

Rechercher des sujets similaires à "vba importation source plage variable"