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 SubPourriez-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 ;-)
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.
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é.
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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 FunctionBonjour 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…