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

jerome1980

XLDnaute Nouveau
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
ok je vais essayer
 

jerome1980

XLDnaute Nouveau
Bbonjour job75

Merci pour votre concours.
La macro semble fonctionner avec deux ou plusieurs fichiers csv

Le seul inconvénient c'est que j'ai toutes les données séparées par des virgules dans le fichier CSV, qui se retrouvent dans une seule colonne sur plusieurs lignes.

Or si vous regardez mon tableau je l'ai éclaté en plusieurs colonnes.

j'ai relu votre code VBA et me demande s'il il n'y aurait pas une variante au niveau de la boucle for.

j'ai pu tester l'import avec deux fichiers sélectionnés.

il me ramène toutes les données dans une seule colonne, avec les deux éditions des fichiers CSV à la suite l'un de l'autre

si l'éclatement par colonne avec retour à la ligne à chaque fin de fichier CSV semble impossible. Il faudrait que chaque import de plusieurs fichiers CSV soit pris en compte de la façon où la macro ajoute chaque fichier CSV dans la colonne suivante.

cerise sur le gâteau, si un csv contient un nom de pc déjà importé dans le tableau, il soit sauté lors de l'exécution de la macro.

je sais qu'Excel a des nombres quasi illimités de colonnes et de lignes.

Néanmoins je souhaiterais conserver l'aspect:
un fichier égal une ligne
autrement dit conserver le remplissage de toutes les colonnes de mon fichier xlsm de base

merci encore pour votre compréhension.
 

jerome1980

XLDnaute Nouveau
@laurent950 bonjour

  • contenu - Copie.csv.txt = données importables avec la macro
  • FIXE-PC - Inventaire mat + log (séparé par des virgules).csv.txt = fiche rendue par le vbs inventaire matériel + logiciels (séparateur ,) mode fiche.vbs
  • FIXE-PC - Inventaire mat + log.csv.txt = ficheinventaire matériel + logiciels (pour macro).vbs ou inventaire matériel + logiciels (séparateur ,) mode fiche.vbs où je dois remettre des virgules à la place des retours chariot
  • inventaire - Copie.xlsm.txt = fichier excel avec la macro
  • macro.txt = le code de la macro excel
il faut retirer l'extension .txt de chaque fichier

merci et bon courage
 

Pièces jointes

  • contenu - Copie.csv.txt
    666 bytes · Affichages: 1
  • FIXE-PC - Inventaire mat + log (séparé par des virgules).csv.txt
    10.5 KB · Affichages: 1
  • inventaire - Copie.xlsm.txt
    19.9 KB · Affichages: 2
  • inventaire matériel + logiciels (séparateur ,) mode fiche - Copie.vbs.txt
    13 KB · Affichages: 2
  • macro.txt
    1.9 KB · Affichages: 1

laurent950

XLDnaute Barbatruc
Re essayer avec cela :

Je sais vraiment Intégrer les valeurs de la requête dans le tableau structuré en une seule étapes !
Cela se fait pour l instant en 2 phases
Import via la feuille Excel puis déplacement dans le tableau structuré

' Copier les données importées dans le tableau structuré (C'est étonnant mais il faut laissé actif les select pour que cela fonctionne ?)
tempRange.Select ------------->>>> (ici)
newDataRange.Select ------------->>>> (ici)
newDataRange.Value = tempRange.Value
Rows(Cells(65536, 1).End(xlUp).Row).Delete

VB:
Sub ImportCSVWithDynamicColumnsB()
    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
    Dim tbl As ListObject
 
    Dim tempRange As Range
    Dim newDataRange As Range
    Dim VarTabtempRange As Variant
    Dim startRow As Long
 
    ' 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

    ' la feuille active
    Set ws = ThisWorkbook.Worksheets(ActiveSheet.Name)
 
    Set tbl = ws.ListObjects("Tableau1")
 
    ' 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
            .TextFileCommaDelimiter = True ' Définir le délimiteur comme un virgule
            .TextFileColumnDataTypes = colDataTypes ' Utiliser le tableau dynamique
            .Refresh BackgroundQuery:=False
        ' *******************************************************************************************
        ' Définir la plage des données importées (dans la Feuille)
            Set tempRange = .ResultRange
        ' Ajuster la plage de la nouvelle ligne dans le tableau structuré
            Set newDataRange = tbl.ListRows.Add.Range.Resize(tempRange.Rows.Count, tempRange.Columns.Count)
        ' Copier les données importées dans le tableau structuré
            tempRange.Select
            newDataRange.Select
            newDataRange.Value = tempRange.Value
            Rows(Cells(65536, 1).End(xlUp).Row).Delete
        ' *******************************************************************************************
        ' Suppression
            .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
 
Dernière édition:

jerome1980

XLDnaute Nouveau
Re essayer avec cela :

Je sais vraiment Intégrer les valeurs de la requête dans le tableau structuré ?

C'est en phase de construction, sans tableau structuré cela s'empilent à la suite sous la ligne d en-tête.

Mais j ai garder l'idée pour injecté la requête en dans le tableau structuré

Cela se fait pour l instant en 2 phases
Import via la feuille excel puis déplacement dans le tableau structuré

C'est pas bon mais c est un début à suivre

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
    Dim tbl As ListObject
   
    Dim tempRange As Range
    Dim newDataRange As Range
    Dim VarTabtempRange As Variant
    Dim startRow As Long
   
    ' 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

    ' la feuille active
    Set ws = ThisWorkbook.Worksheets(ActiveSheet.Name)
   
    Set tbl = ws.ListObjects("Tableau1")
   
    ' 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
            .TextFileCommaDelimiter = True ' Définir le délimiteur comme un virgule
            .TextFileColumnDataTypes = colDataTypes ' Utiliser le tableau dynamique
            .Refresh BackgroundQuery:=False
        ' *******************************************************************************************
        ' Définir la plage des données importées (dans la Feuille)
            Set tempRange = .ResultRange
        ' Ajuster la plage de la nouvelle ligne dans le tableau structuré
            Set newDataRange = tbl.ListRows.Add.Range.Resize(tempRange.Rows.Count, tempRange.Columns.Count)
        ' Copier les données importées dans le tableau structuré
            newDataRange.Value = tempRange.Value
        ' *******************************************************************************************
        ' Suppression
            .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
Bonjour
je viens de tester
ça fonctionne mais il me garde le format de mon fichier csv
de plus, j'ai une pop up "alerte mémoire insuffisante"
je pense que mon vbs contient trop de objTextFile.WriteLine, de for et de set

je ne vois pas comment les imbriquer en une seule boucle pour n'avoir qu'une objTextFile.WriteLine avec le séparateur de champ

mais merci
 

Discussions similaires

Réponses
3
Affichages
295

Membres actuellement en ligne

Statistiques des forums

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