Microsoft 365 Import Donnes issu de fichier CSV

GClaire

XLDnaute Occasionnel
Supporter XLD
Salut les exceliennes(iens)

je continue sur le fichier de mon ami.

Il reçoit régulièrement de nouveaux thème.
Ces nouveaux thèmes sont dans un fichier CSV,

je tente désespérément d'importer ces données dans mon fichier, mais cela ne se passe pas comme il faut, lol

Ce que je cherche a faire

1) Rechercher le fichier (Qui n'aura jamais le même nom, mais sur le bureau) avec le juste chemin (Sans son nom) dans la cellule "B4" de la feuille "Paramètres", si rien est renseigné dans cette cellule, faire une recherche jusqu'au bureau.

2) Importer les données du fichier trouvé, dans la feuille "Nouveau Theme" de la colonne "A:G"

pour le moment cela importe, mais cela ne garde pas les colonnes comme dans le fichier, je me doute que c'est du fait que c'est un CSV, mais je ne vois pas ce qu'il faut faire.

Il y a peut être d'autres choses qui ne vont pas dans ce code, mais j'ai tenté de faire par rapport a ce que j'ai pu voir sur le forum et adapté.

Si vous avez la solution

Par avance, merci,

Passez une bonne soirée

G'Claire
 

Pièces jointes

  • Aide forum.xlsm
    25.1 KB · Affichages: 4
  • openquizzdb_259.zip
    18.1 KB · Affichages: 7

Cousinhub

XLDnaute Barbatruc
Inactif
@Cousinhub chez moi à la place de 65001 on peut mettre 2 ou xlWindows
Hi,
Perso, j'ai juste pris ce que PQ proposait (et comme l'import se faisait correctement, je n'ai pas cherché plus....)
1713171142156.png
 

GClaire

XLDnaute Occasionnel
Supporter XLD
Bonjour,
En rajoutant l'origine des données

VB:
Workbooks.OpenText fichier, 65001, semicolon:=True, Local:=True
A priori, le texte s'importe correctement
(Bon, je ne vais pas cacher que je préfère PQ, mais si c'est pour le bien de tout le monde....)
Bonne journée
Perso je n'y vois pas d'inconveignant sauf que je métrise encore moins, lol

Je ne voyais pas comment allé se faire la suite car le fichier d'import changera a chaque nouveau theme.

En faite le truc complet et :



1) J'importe la feuille : (Code de job75) dans ce UserForm (Loiiiiiiiiiiiin d'être fini, lol)

1713176413290.png


Avec ce code et les suivants :

Code:
Private Sub UserForm_Initialize()

ImporterDonneesCSV

 With LsV_Import
  With .ColumnHeaders
      .Clear
      .Add , , "N° Question", 60
      .Add , , "Question", 300
      .Add , , "Réponse A", 100
      .Add , , "Réponse B", 100
      .Add , , "Réponse C", 100
      .Add , , "Réponse D", 100
      .Add , , "Niveau", 40, lvwColumnCenter
    End With
    .View = lvwReport 'Affichage en mode Rapport
  End With
  LsV_Import.Gridlines = True 'Affichage d'un quadrillage
  appel
fin:
    Dim i As Integer
   
    ' Parcours de toutes les lignes de la ListView
    For i = 1 To LsV_Import.ListItems.Count
        ' Changer la couleur de la deuxième colonne (index 2)
        'LsV_Import.ListItems(i).ListSubItems(3).ForeColor = RGB(146, 208, 80) ' Modifier vbRed avec la couleur souhaitée
    Next i
End Sub

Sub appel()
Dim i, k
With LsV_Import
 Sheets("Import Theme").Activate
 For i = 1 To Range("A65536").End(xlUp).Row
       
           .ListItems.Add , , Cells(i, 1)
               For k = 2 To 11
                 .ListItems(.ListItems.Count).ListSubItems.Add , , Cells(i, k), , lvwColumnCenter
               Next
         .ListItems(.ListItems.Count).ListSubItems.Add , , i, , lvwColumnCenter
        Next
End With
fin:
End Sub

Code:
Sub ImporterDonneesCSV()

    Dim fichier As Variant
    Dim x As Long
    Dim a() As String
    Dim n As Long
    Dim b() As String
    Dim i As Long

    ChDir ThisWorkbook.Path
    fichier = Application.GetOpenFilename("Fichiers CSV (*.csv), *.csv")

    If fichier = False Then Exit Sub

    Application.ScreenUpdating = False

    ' Supprimez les données existantes sur la feuille "Import Theme"
    Sheets("Import Theme").Cells.Delete

    Workbooks.OpenText fichier, semicolon:=True, Local:=True
'    ActiveSheet.UsedRange.Copy Sheets("Import Theme").Range("A1")
    ActiveSheet.UsedRange.Copy Feuil2.[A1]
    ActiveWorkbook.Close

    ' Effectuez les remplacements de caractères
    With Sheets("Import Theme").Cells
        '.Replace "Ã ", "à", xlPart
        .Replace "Ã ", "à", xlPart
        .Replace "À", "À"
        .Replace "â", "â"
        .Replace "ç", "ç"
        .Replace "é", "é"
        .Replace "É", "É"
        .Replace "è", "è"
        .Replace "ê", "ê"
        .Replace "î", "î"
        .Replace "ô", "ô"
        .Replace "ü", "ü"
        .Replace "«", "«"
        .Replace "»", "»"
    End With

    ' Ajustez les largeurs des colonnes
    Sheets("Import Theme").Columns.AutoFit

    ' Supprimez les lignes qui ne sont pas en français
    SupprimerLignesNonFR

    ' Assignez des valeurs de niveau
    AssignerNiveauValeurs
 
    Application.ScreenUpdating = True

    MsgBox "Données CSV importées avec succès sur la feuille 'Import Theme'."

End Sub

J'ouvre un UserForm, qui importe cette feuille, dans la feuille "Import theme", je fais un ti ménage :

2) Suppression de tout ce qui n'est pas FR

VB:
Sub SupprimerLignesNonFR()
Dim ws As Worksheet
Dim DerrLigne As Long, i As Long

' Définir la feuille de calcul
Set ws = ThisWorkbook.Sheets("Import theme")

' Trouver la dernière ligne dans la colonne "B"
DerrLigne = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row

' Parcourir de la dernière ligne à la première
For i = DerrLigne To 1 Step -1
    ' Vérifier si la valeur de la cellule dans la colonne "B" n'est pas "FR"
    If ws.Cells(i, "B").Value <> "fr" Then
        ' Si ce n'est pas "FR", supprimer la ligne entière
        ws.Rows(i).Delete
    End If
Next i
End Sub

3) Je change les valeurs de la colonne "H"

Code:
Sub AssignerNiveauValeurs()
Dim ws As Worksheet
Dim DerrLigne As Long
Dim niveau As String
Dim valeur As Integer

' Spécifier la feuille de calcul
Set ws = ThisWorkbook.Sheets("Import Theme")

' Boucler à travers les lignes de la colonne H
For DerrLigne = 1 To ws.Cells(ws.Rows.Count, "H").End(xlUp).Row
    ' Récupérer le niveau de compétence dans la colonne H
    niveau = ws.Cells(DerrLigne, "H").Value
 
    ' Assigner la valeur en fonction du niveau
    Select Case niveau
        Case "Débutant"
            valeur = 1
        Case "Confirmé"
            valeur = 2
        Case "Expert"
            valeur = 3
        Case Else
            ' Gérer les cas où le niveau n'est pas spécifié
            ' ou n'est pas l'un des cas attendus
            valeur = 0 ' Ou toute autre valeur que vous voulez assigner pour ces cas
    End Select
 
    ' Assigner la valeur dans une colonne ou ligne spécifique
    ws.Cells(DerrLigne, "H").Value = valeur
 
Next DerrLigne

'Suppression des colonnes "B", "I:J"
Sheets("Import Theme").Range("B:B,I:I,J:J").Delete Shift:=xlToLeft

End Sub

Ensuite se sera importé dans une listview et des controls en vue de modification si des erreurs ont été décélées.

Si Ok, on envoie dans la feuille "Base" en dispatchant en dessous si les thèmes existent en réincrémentant le N° de questions a la suite de ceux déjà la, et si les thèmes n'existent pas, les mettre a la fin de la base en incrémentant les N° de questions a partir de 1.

Mais la c'est se qu'il y'a dans la tête, je ne sais même pas comment le faire, lol.

Voili toute l'histoire

Y'a peut être plus simple, lol

Merci

Bonne journée
 
Dernière édition:

GClaire

XLDnaute Occasionnel
Supporter XLD
Re-,
Euh, tu avais juste à ajouter 65001, entre fichier et semicolon
VB:
fichier, 650001, semicolon:=True,

Et tout le traitement effectué après import pourrait se faire via PQ...
Mais si tu obtiens le résultat voulu, c'est le principal
Hello

Merci pour la réponse

C'est chose faite, ce qui donne :

VB:
Sub ImporterDonneesCSV()

    Dim fichier As Variant
    Dim x As Long
    Dim a() As String
    Dim n As Long
    Dim b() As String
    Dim i As Long

    ChDir ThisWorkbook.Path
    fichier = Application.GetOpenFilename("Fichiers CSV (*.csv), *.csv")

    If fichier = False Then Exit Sub

    Application.ScreenUpdating = False

    ' Supprimez les données existantes sur la feuille "Import Theme"
    Sheets("Import Theme").Cells.Delete

 '   Workbooks.OpenText fichier, semicolon:=True, Local:=True
 Workbooks.OpenText fichier, 65001, semicolon:=True, Local:=True
'    ActiveSheet.UsedRange.Copy Sheets("Import Theme").Range("A1")
    ActiveSheet.UsedRange.Copy Feuil2.[A1]
    ActiveWorkbook.Close

'    ' Effectuez les remplacements de caractères
'    With Sheets("Import Theme").Cells
'        '.Replace "Ã ", "à", xlPart
'        .Replace "Ã ", "à", xlPart
'        .Replace "À", "À"
'        .Replace "â", "â"
'        .Replace "ç", "ç"
'        .Replace "é", "é"
'        .Replace "É", "É"
'        .Replace "è", "è"
'        .Replace "ê", "ê"
'        .Replace "î", "î"
'        .Replace "ô", "ô"
'        .Replace "ü", "ü"
'        .Replace "«", "«"
'        .Replace "»", "»"
'    End With

    ' Ajustez les largeurs des colonnes
    Sheets("Import Theme").Columns.AutoFit

    ' Supprimez les lignes qui ne sont pas en français
    SupprimerLignesNonFR

    ' Assignez des valeurs de niveau
    AssignerNiveauValeurs
    
    Application.ScreenUpdating = True

    MsgBox "Données CSV importées avec succès sur la feuille 'Import Theme'."

End Sub

Après, PQ, je ne sais pas trop faire pour la suite des évènements, autrement sais pas trop non plus d'ailleurs , lol.

Merci

Bonne journée.

G'Claire
 

job75

XLDnaute Barbatruc
Bonjour GClaire, Cousinhub,

Le fichier CSV que vous utilisez a été enregistré au format UTF-8.

C'est la raison pour laquelle des caractères spéciaux s'introduisent, pour les éviter il suffit d'enregistrer le fichier au format classique CSV (séparateur point-virgule), c'est le cas du fichier zippé joint.

A+
 

Pièces jointes

  • Aide forum.xlsm
    21 KB · Affichages: 1
  • openquizzdb_259.zip
    18.4 KB · Affichages: 0

GClaire

XLDnaute Occasionnel
Supporter XLD
Bonjour GClaire, Cousinhub,

Le fichier CSV que vous utilisez a été enregistré au format UTF-8.

C'est la raison pour laquelle des caractères spéciaux s'introduisent, pour les éviter il suffit d'enregistrer le fichier au format classique CSV (séparateur point-virgule), c'est le cas du fichier zippé joint.

A+
Hello Job75, le forum

Merci, je vais regarder cela

Sinon j'ai ce code (Me souviens plus de qui, oups) qui fonctionne bien avec les modif indiquées ci dessus

Sub ImporterDonneesCSV()

Dim fichier As Variant
Dim x As Long
Dim a() As String
Dim n As Long
Dim b() As String
Dim i As Long

ChDir ThisWorkbook.Path
fichier = Application.GetOpenFilename("Fichiers CSV (*.csv), *.csv")

If fichier = False Then Exit Sub

Application.ScreenUpdating = False

'Supprimez les données existantes sur la feuille "Import Theme"
Sheets("Import Theme").Cells.Delete

'Workbooks.OpenText fichier, semicolon:=True, Local:=True
Workbooks.OpenText fichier, 65001, semicolon:=True, Local:=True
'ActiveSheet.UsedRange.Copy Sheets("Import Theme").Range("A1")

ActiveSheet.UsedRange.Copy Feuil2.[A2]

ActiveWorkbook.Close

' Ajustez les largeurs des colonnes
Sheets("Import Theme").Columns.AutoFit


Application.ScreenUpdating = True

MsgBox "Données CSV importées avec succès sur la feuille 'Import Theme'."

End Sub
Et pour arriver a mes fins car les concepteurs du soft ne sont pas capables, de donner un fichier qui est structuré de la même manière partout.

Donc j'importe le CSV

Puis je supprime les question qui ne sont pas en FR (Français)

VB:
Sub SupprimerLignesNonFR()
Dim ws As Worksheet
Dim DerrLigne As Long, i As Long

' Définir la feuille de calcul
Set ws = ThisWorkbook.Sheets("Import theme")

' Trouver la dernière ligne dans la colonne "B"
DerrLigne = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row + 1

' Parcourir de la dernière ligne à la première
For i = DerrLigne To 2 Step -1
    ' Vérifier si la valeur de la cellule dans la colonne "B" n'est pas "FR"
    If ws.Cells(i, "B").Value <> "fr" Then
        ' Si ce n'est pas "FR", supprimer la ligne entière
        ws.Rows(i).Delete
    End If
Next i
End Sub

Ensuite J'assigne des valeurs au niveau utilisais (Mon pote préférait des numeros)

Code:
Sub AssignerNiveauValeurs()
Dim ws As Worksheet
Dim DerrLigne As Long
Dim niveau As String
Dim valeur As Integer

' Spécifier la feuille de calcul
Set ws = ThisWorkbook.Sheets("Import Theme")

' Boucler à travers les lignes de la colonne H
For DerrLigne = 1 To ws.Cells(ws.Rows.Count, "H").End(xlUp).Row
    ' Récupérer le niveau de compétence dans la colonne H
    niveau = ws.Cells(DerrLigne, "H").Value
    
    ' Assigner la valeur en fonction du niveau
    Select Case niveau
        Case "Débutant"
            valeur = 1
        Case "Confirmé"
            valeur = 2
        Case "Expert"
            valeur = 3
        Case Else
            ' Gérer les cas où le niveau n'est pas spécifié
            ' ou n'est pas l'un des cas attendus
            valeur = 0 ' Ou toute autre valeur que vous voulez assigner pour ces cas
    End Select
    
    ' Assigner la valeur dans une colonne ou ligne spécifique
    ws.Cells(DerrLigne, "H").Value = valeur ' Par exemple, colonne I
    
Next DerrLigne

With ws
'Suppression des colonnes "B", "I:J"
.Range("B:B,I:I,J:J").Delete Shift:=xlToLeft

'Ajout des entêtes de colonnes
.Range("A1:K1").Value = Array("N° Questions", "Questions", "Réponse A", "Réponse B", "Réponse C", "Réponse D", "Niveau", "Catégorie", "Theme", "N° Theme", "Difficulté")
End With

End Sub

Puis je réorganise les colonnes pour quelles soient a l'identiques de la base et pour l'import dans une listview afin de modifier des données et réexporter dans la base (Ca je n'y arrive pas car plusieurs conditions )

Code:
Sub ReorganiserColonnes()

' Déclarer les variables
Dim ws As Worksheet
Dim DerrLigne As Long

' Spécifier la feuille de calcul
Set ws = ThisWorkbook.Sheets("Import Theme") ' Remplacez "Nom_de_votre_feuille" par le nom de votre feuille

' Trouver la dernière ligne avec des données dans la colonne A
DerrLigne = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row

' Déplacer les colonnes
With ws
    .Columns("J:J").Cut
    .Columns("A:A").Insert Shift:=xlToRight
    .Columns("J:J").Cut
    .Columns("C:C").Insert Shift:=xlToRight
    .Columns("I:I").Cut
    .Columns("D:D").Insert Shift:=xlToRight
    
    Application.CutCopyMode = False
End With

Et pour finir, je rempli les colonnes pour indiquer que ces données doivent être modifiées

Code:
Sub PreRemplirColonnes_AC()
    Dim ws As Worksheet
    Dim DerrLigne As Long
    Dim i As Long

    ' Spécifie la feuille de calcul à utiliser
    Set ws = ThisWorkbook.Sheets("Import Theme")

    ' Trouve la dernière ligne de la colonne A
    DerrLigne = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row

    ' Parcourt toutes les lignes de la colonne A à partir de la ligne 2 jusqu'à la dernière ligne
    For i = 2 To DerrLigne
        ' Remplit la cellule de la colonne A avec la valeur "A définir"
        With ws
            .Cells(i, "A").Value = "A définir"
            .Cells(i, "C").Value = "A définir"
        End With
    Next i
End Sub

Je pense qu'il y avait plus simple, mais ca encore j'ai réussi a me débrouiler, lol.


La je me bas avec l'export du contenu de ma listview vers ma feuille "Base", car il y a 2 conditions et je n'y arrive pas

Merci

Bonne soirée, G'Claire
 

jerome1980

XLDnaute Nouveau
Salut les exceliennes(iens)

je continue sur le fichier de mon ami.

Il reçoit régulièrement de nouveaux thème.
Ces nouveaux thèmes sont dans un fichier CSV,

je tente désespérément d'importer ces données dans mon fichier, mais cela ne se passe pas comme il faut, lol

Ce que je cherche a faire

1) Rechercher le fichier (Qui n'aura jamais le même nom, mais sur le bureau) avec le juste chemin (Sans son nom) dans la cellule "B4" de la feuille "Paramètres", si rien est renseigné dans cette cellule, faire une recherche jusqu'au bureau.

2) Importer les données du fichier trouvé, dans la feuille "Nouveau Theme" de la colonne "A:G"

pour le moment cela importe, mais cela ne garde pas les colonnes comme dans le fichier, je me doute que c'est du fait que c'est un CSV, mais je ne vois pas ce qu'il faut faire.

Il y a peut être d'autres choses qui ne vont pas dans ce code, mais j'ai tenté de faire par rapport a ce que j'ai pu voir sur le forum et adapté.

Si vous avez la solution

Par avance, merci,

Passez une bonne soirée

G'Claire
 

jerome1980

XLDnaute Nouveau
Bonjour

Fraichement inscrit sur ce site

J’ai mis en place un fichier Excel avec des en-têtes de colonnes, associé à ce fichier Excel j'ai un fichier Vbs qui me réalise l'inventaire de mon PC si bien matériel que logiciel

J’ai réussi à faire en sorte que l'export au format CSV ne contienne que les données de requêtes toutes séparées par des virgules

Cela étant posé je me suis inspiré d'une vidéo sur YouTube pour réaliser une macro qui me permet d'importer le contenu de mon CSV dans le tableau Excel

Tout se passe bien si je veux importer uniquement un fichier CSV

En fin de message voici ce à qui ressemble mon fichier CSV issu du VBs

J’ai régénéré un fichier CSV à partir du VBS donc il a le même format. Comprendre j’ai 2 fichiers csv donc j’attends de la macro qu’elle me génère une deuxième ligne dans le fichier Excel

Dans la macro j'ai bien observé le multi Select

J’ai l'impression que ça ne fonctionne pas

J’arrive à importer un fichier CSV. Mais si je veux importer le même fichier pour avoir deux lignes dans mon tableau j'ai une erreur

Pouvez-vous m'aider s'il vous plaît au moins en me donnant quelques indications que je pourrais essayer de suivre pour parvenir à faire fonctionner le multi select comme il faut ?

Par avance je vous remercie de toute l’aide que vous pourriez m'apporter

Nom du poste,Workgroup,Marque,Modele,Numero de serie,OS,Version,Service Pack,Numero Serie,Cle Produit,Type Version,Date d'Installation,Processeur,Type Processeur,RAM Total,Emplacement,Taille,Modele2,Nombre de partition(s),Espace Total,Carte Reseau,Adresse MAC,Adresse IP,Adresse IP3,Adresse IP4,Sous Reseau,Sous Reseau5,Sous Reseau6,Passerelle,Passerelle7,DNS,DNSDomaine DNS,WINS,Imprimante,Colonne1,Colonne2,Colonne3
 

Pièces jointes

  • inventaire.xlsm
    20 KB · Affichages: 4
  • macro.txt
    1.1 KB · Affichages: 2

laurent950

XLDnaute Barbatruc
Bonsoir @GClaire , @job75 , @Cousinhub, @Staple1600

code uniquement pour la demande de @GClaire ci-dessous.

J'ai ajouté cela ci-dessous
en rapport avec mon code en Poste #23 de cette discussion (Import de Fichiers CSV)

Code:
' Ajout :   ----->>>>   .TextFilePlatform = 65001
' J'ai ajouté : Le paramètre .TextFilePlatform = 65001 spécifie le code de page Windows (ou code de caractère)
' à utiliser lors de l'importation du fichier CSV.
' Le code 65001 correspond à l'encodage UTF-8, qui est un encodage de caractères multioctets pouvant
' représenter l'ensemble des caractères Unicode.

' Lorsque vous importez un fichier CSV dans Excel, Excel doit interpréter les caractères du fichier en
' fonction de l'encodage spécifié pour pouvoir les afficher correctement. Par défaut, Excel utilise souvent
' l'encodage du système d'exploitation, mais parfois cela peut ne pas fonctionner correctement pour tous les
' fichiers, en particulier ceux avec des caractères spéciaux ou des caractères provenant de différentes langues.

' En spécifiant .TextFilePlatform = 65001, vous indiquez explicitement à Excel d'utiliser l'encodage UTF-8 pour
' interpréter les caractères lors de l'importation du fichier CSV. Cela garantit que les caractères spéciaux et les
' caractères provenant de différentes langues sont correctement interprétés et affichés dans Excel.

' Maintenant les caractères spéciaux devraient être importés et affichés correctement dans votre feuille Excel.

Ps : @GClaire un savant génial est passé par là et à réussit à faire briller tes données comme un soleil éclatant dans ton fichier Excel ! 🌟😄

VB:
Sub ImportCSVWithDynamicColumns()
    Dim ws As Worksheet
    Dim filePath As String
    Dim qt As QueryTable
    Dim firstLine As String
    Dim colCount As Integer
    Dim colDataTypes() As Integer
    Dim i As Integer
    Dim FSO As Object
    Dim myFile As Object
 
    filePath = Application.GetOpenFilename("Fichiers CSV (*.csv), *.csv")
    ' Définir le chemin du fichier CSV
    'filePath = "C:\chemin\vers\le\fichier.csv"
 
    ' Vérifier si le fichier existe
    If Dir(filePath) = "" Then
        MsgBox "Le fichier n'existe pas : " & filePath, vbExclamation
        Exit Sub
    End If
 
    ' Lire la première ligne du fichier CSV
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set myFile = FSO.OpenTextFile(filePath, 1)
    If Not myFile.AtEndOfStream Then
        firstLine = myFile.ReadLine
    End If
    myFile.Close
 
    ' Afficher la première ligne pour vérification
    'MsgBox "Première ligne du fichier CSV: " & firstLine
 
    ' Compter le nombre de colonnes en comptant les délimiteurs ;
    colCount = UBound(Split(firstLine, ";")) + 1
 
    ' Créer dynamiquement le tableau TextFileColumnDataTypes
    ReDim colDataTypes(1 To colCount)
    For i = 1 To colCount
        colDataTypes(i) = 1 ' Importer toutes les colonnes comme texte
    Next i
 
    ' Ajouter une nouvelle feuille ou utiliser la feuille active
    Set ws = ThisWorkbook.Sheets.Add ' Vous pouvez aussi utiliser ThisWorkbook.Sheets("NomDeLaFeuille")
 
    ' Créer une QueryTable pour importer les données du fichier CSV
    On Error GoTo ErrHandler
    Set qt = ws.QueryTables.Add(Connection:="TEXT;" & filePath, Destination:=ws.Range("A1"))
 
    ' Configurer les paramètres de la QueryTable
    With qt
        .TextFilePlatform = 65001
        .TextFileParseType = xlDelimited
        '.TextFileCommaDelimiter = False
        .TextFileSemicolonDelimiter = True ' Définir le délimiteur comme un point-virgule
        '.TextFileConsecutiveDelimiter = False
        '.TextFileTabDelimiter = False
        '.TextFileSpaceDelimiter = False
        '.TextFileOtherDelimiter = False
        .TextFileColumnDataTypes = colDataTypes ' Utiliser le tableau dynamique
        .Refresh BackgroundQuery:=False
        .Parent.Names(.Name).Delete       ' Supprimer le nom défini créé par Excel
        .Delete ' Supprimer la QueryTable
    End With

    ' Nettoyer
    Set qt = Nothing
    Set ws = Nothing
    Exit Sub

ErrHandler:
    MsgBox "Erreur lors de l'importation du fichier CSV : " & Err.Description, vbCritical
    If Not qt Is Nothing Then
        qt.Delete
        Set qt = Nothing
    End If
    If Not ws Is Nothing Then
        ws.Delete
        Set ws = Nothing
    End If
End Sub
 
Dernière édition:

laurent950

XLDnaute Barbatruc
Bonsoir @jerome1980

code uniquement pour la demande de @jerome1980 ci-dessous.

Je comprend 2 fichiers csv = Exactement la même structure.
J’ai régénéré un fichier CSV à partir du VBS donc il a le même format.
Je Comprend :
- Fichier(1) csv = 1 ligne
- Fichier(2) csv = 1 ligne
Comprendre j’ai 2 fichiers csv donc j’attends de la macro qu’elle me génère une deuxième ligne dans le fichier Excel
Je comprend : sélection de 2 fichiers CSV (par l'utilisateur)
Dans la macro j'ai bien observé le multi Select
Maintenant : la ligne du Fichier(1) csv et la ligne du Fichier(2) csv seront à la suite dans la Feuille Excel.
Pouvez-vous m'aider s'il vous plaît au moins en me donnant quelques indications que je pourrais essayer de suivre pour parvenir à faire fonctionner le multi select comme il faut ?
Alors : Voici le code Modifier du Poste #26 uniquement pour vous @jerome1980 ci-dessous.
J’arrive à importer un fichier CSV. Mais si je veux importer le même fichier pour avoir deux lignes dans mon tableau j'ai une erreur

VB:
Sub ImportCSVWithDynamicColumns()
    Dim ws As Worksheet
    Dim filePaths As Variant
    Dim qt As QueryTable
    Dim firstLine As String
    Dim colCount As Integer
    Dim colDataTypes() As Integer
    Dim i As Integer
    Dim FSO As Object
    Dim myFile As Object
    Dim lastRow As Long
    Dim filePath As Variant

    ' Demander à l'utilisateur de sélectionner les fichiers CSV (multiselection)
    filePaths = Application.GetOpenFilename("Fichiers CSV (*.csv), *.csv", , "Sélectionnez les fichiers CSV", , True)
   
    ' Vérifier si l'utilisateur a annulé la sélection
    If IsArray(filePaths) = False Then Exit Sub

    ' Ajouter une nouvelle feuille ou utiliser la feuille active
    Set ws = ThisWorkbook.Sheets.Add

    ' Initialiser FSO
    Set FSO = CreateObject("Scripting.FileSystemObject")

    ' Boucler sur chaque fichier sélectionné
    For Each filePath In filePaths
        ' Vérifier si le fichier existe
        If Dir(filePath) = "" Then
            MsgBox "Le fichier n'existe pas : " & filePath, vbExclamation
            Exit Sub
        End If

        ' Lire la première ligne du fichier CSV
        Set myFile = FSO.OpenTextFile(filePath, 1)
        If Not myFile.AtEndOfStream Then
            firstLine = myFile.ReadLine
        End If
        myFile.Close

        ' Compter le nombre de colonnes en comptant les délimiteurs ;
        colCount = UBound(Split(firstLine, ";")) + 1

        ' Créer dynamiquement le tableau TextFileColumnDataTypes
        ReDim colDataTypes(1 To colCount)
        For i = 1 To colCount
            colDataTypes(i) = 1 ' Importer toutes les colonnes comme texte
        Next i

        ' Trouver la dernière ligne utilisée
        lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
        If lastRow = 1 And ws.Cells(1, 1).Value = "" Then
            lastRow = 0 ' Si la feuille est vide, commencer à la première ligne
        End If

        ' Créer une QueryTable pour importer les données du fichier CSV
        On Error GoTo ErrHandler
        Set qt = ws.QueryTables.Add(Connection:="TEXT;" & filePath, Destination:=ws.Cells(lastRow + 1, 1))

        ' Configurer les paramètres de la QueryTable
        With qt
            .TextFilePlatform = 65001
            .TextFileParseType = xlDelimited
            .TextFileSemicolonDelimiter = True ' Définir le délimiteur comme un point-virgule
            .TextFileColumnDataTypes = colDataTypes ' Utiliser le tableau dynamique
            .Refresh BackgroundQuery:=False
            .Parent.Names(.Name).Delete ' Supprimer le nom défini créé par Excel
            .Delete ' Supprimer la QueryTable
        End With
    Next filePath

    ' Nettoyer
    Set qt = Nothing
    Set ws = Nothing
    Exit Sub

ErrHandler:
    MsgBox "Erreur lors de l'importation du fichier CSV : " & Err.Description, vbCritical
    If Not qt Is Nothing Then
        qt.Delete
        Set qt = Nothing
    End If
    If Not ws Is Nothing Then
        ws.Delete
        Set ws = Nothing
    End If
End Sub
 

jerome1980

XLDnaute Nouveau
Bonjour

Merci pour votre réponse avec votre code VBA.
Je l'ai testé, je me rends compte que vous avez calqué le résultat sur les dernières lignes contenant les champs séparés par des virgules que j'ai indiqué à la fin de mon message. Quand je l'exécute une feuille se crée avec deux lignes contenant les données de mes variables séparés par des virgules

j'avais juste indiqué ces lignes avec les virgules pour que vous identifiez le formatage de mon fichier CSV.

J'ai suivi ce tuto YouTube

aussi dans mon classeur Excel j'ai une feuille avec le bouton et colonnes dont je vous ai indiqué les en-têtes à la fin de mon message initial.

pour synthétiser ma demande, la macro que j'utilise lit bien un premier fichier CSV et rempli la première ligne de mon tableau comme espéré. Ce que je souhaite faire faire à la macro c'est lire tous les fichiers CSV générés et qu'elle complète linéairement le tableau ligne après ligne. chaque champ étant séparé par une virgule.

je pensais à une boucle do until "plus de fichiers csv traiter" sorte de eof, et faire en sorte que le fichier traité soit ignoré par la suite.

ou bien d'après https://learn.microsoft.com/fr-fr/d...eference/statements/while-end-while-statement

autre condition si un fichier du même nom revient dans le dossier, ne pas le retraiter

sur


do
ouvre et récupère le contenu du fichier csv
passe au suivant
exit do
loop until "plus de fichier"
ignore le ficher csv déjà traité

je ne joins pas de nouveau les fichiers.

J'espère avoir été plus clair cette fois-ci.
Merci à vous
 

laurent950

XLDnaute Barbatruc
j'avais juste indiqué ces lignes avec les virgules pour que vous identifiez le formatage de mon fichier CSV.
Remplacer dans le code :
Supprimé cette ligne = ; point virgule
' TextFileSemicolonDelimiter = True
par cette ligne à créer = , virgule
TextFileCommaDelimiter = True

C'est plus la même demande, cela doit faire partie d'un autre sujet, ouvrez une autres discussion et je reporterai mes solutions sur votre propre poste et j effacerais tous de que j ai posté ici pour pas interférer avec la demande initiale de @GClaire

Cordialement
 

job75

XLDnaute Barbatruc
Bonjour le forum,
C'est plus la même demande, cela doit faire partie d'un autre sujet, ouvrez une autres discussion
Il fallait le dire dès le post #25 mais puisqu'on en est là autant aller jusqu'au bout.

Téléchargez les fichiers zippés joints et exécutez cette macro (qui découle de ce fil) :
VB:
Sub IMPORTDATA()
Dim fichier As Variant, F As Worksheet, lig&, n
ChDir ThisWorkbook.Path
fichier = Application.GetOpenFilename("Fichiers CSV (*.csv), *.csv", MultiSelect:=True)
If Not IsArray(fichier) Then Exit Sub
Set F = Sheets("Feuil1")
Application.ScreenUpdating = False
F.Cells.Delete 'RAZ
lig = 9
For n = 1 To UBound(fichier)
    Workbooks.OpenText fichier(n), 65001, DataType:=xlDelimited, Semicolon:=True, Comma:=True, Space:=False, Local:=True
    ActiveSheet.UsedRange.Copy F.Cells(lig, 1)
    ActiveWorkbook.Close
    lig = F.UsedRange.Row + F.UsedRange.Rows.Count
Next
F.ListObjects.Add xlSrcRange, F.UsedRange, , xlYes 'crée le tableau structuré
F.Columns.AutoFit 'ajustement largeurs
Application.ScreenUpdating = True
MsgBox n - 1 & " fichier(s) CSV importé(s)"
End Sub
A+
 

Pièces jointes

  • Dossier.zip
    18.1 KB · Affichages: 2

Discussions similaires

Réponses
3
Affichages
295

Statistiques des forums

Discussions
313 322
Messages
2 097 141
Membres
106 850
dernier inscrit
benbeckman