XL 2021 excel - vbs - csv

jerome1980

XLDnaute Nouveau
Bonjour

Je suis confronté à un problème avec du VBS impliquant des fichiers CSV.
Pour étayer ma demande je vous joins les trois fichiers :
  • Inventaire matériel + logiciels (pour macro).vbs
  • Macro.txt, il s'agit du détail de ce que fait la macro
  • Inventaire.xlsm, qui contient le tableau et la macro elle-même
Pour la macro, je me suis inspiré de cette vidéo :

En ce qui concerne le fichier vbs j'ai deux autres versions différentes qui me permet de synthétiser les données dans des fichiers CSV séparés.

Autrement dit si mon projet n'aboutit pas ce n'est pas un problème
si vous ouvrez le fichier contenu.csv vous observerez une seule ligne avec les champs séparés par une virgule
c'est ce fichier contenu.CSV qui sert à alimenter la macro de mon fichier Excel.

Si vous ouvrez le fichier macro.txt vous observerez une commande .Allowmultiselect qui devrait me permettre de sélectionner plusieurs fichiers à la fois et d'importer leur contenu dans le tableau.

Si je la règle sur la valeur True je peux effectivement sélectionner plusieurs fichiers CSV volontairement, cependant la macro me renvoie une erreur.

Si je règle la valeur sur False je vais devoir faire mes imports un par un. Le premier rapport se passe bien j'ai toute la ligne complète, mais si je demande un deuxième import, la macro me renvoie une erreur.

Pouvez-vous m'aider à résoudre mon problème de macro pour importer plusieurs fichiers à la volée directement dans mon tableau.?
À la base je pars du fichier inventaire matériel (séparateur ,) mode fiche.vbs que j'ai transformé à la main en inventaire matériel+logiciels (pour macro).vbs

Donc j’aimerai pouvoir faire mes imports depuis le résultat du vbs.
J’ai aussi fait un fichier inventaire matériel + logiciels (séparateur vbtab) mode fiche.vbs

Pour info j'ai ajouté .txt à chaque fin d'extension de fichier

Je vous remercie
 

Pièces jointes

  • inventaire matériel + logiciels (pour macro).vbs.TXT
    11.2 KB · Affichages: 7
  • inventaire matériel + logiciels (séparateur ,) mode fiche.vbs.TXT
    13 KB · Affichages: 3
  • inventaire matériel + logiciels (séparateur vbtab) mode fiche.vbs.TXT
    13.1 KB · Affichages: 3
  • inventaire.xlsm.TXT
    21.2 KB · Affichages: 3
  • macro.txt
    1.1 KB · Affichages: 4

merinos

XLDnaute Accro
Bonjour @jerome1980 ,

Que dire?

Il existe une solution developpée par Microsoft pour importer des données.
Elle s'appele PowerQuery...

On peut bidouiller en VBA... mais ce ne sera jamais top.

Tu peux voir cette discussion. je fais ce genre d'import depuis très longtemps. j'ai été jusqu'a 22 million de lignes... Cela roule. Tout se fait en memoire.

Si tu publiais 2 fichiers "fake data CSV" ... on pourrait regarder.

methode et un lien vers les videos...

Merinos
 
Dernière édition:

jerome1980

XLDnaute Nouveau
Bonjour merinos

si vous observez les extensions de chacun des fichiers que j'ai joints à ma demande, vous observerez que toutes les extensions sont .Txt

j'ai volontairement ajouté cette extension. txt afin de pouvoir joindre tous mes fichiers sans trop les modifier

seul un fichier est réellement un fichier texte
il s'agit de macro.txt

aussi je vous invite à renommer tous les fichiers et enlever l'extension pour un txt

en faisant cela vous retrouverez les fichiers CSV original que j'ai générés

vous pourrez ainsi les exécuter pour voir les données qui en découlent

de même vous renommerez le fichier inventaire.xlsm

ainsi vous pouvez l'ouvrir et accéder à la macro qui est dans le fichier

Merci
 

Cousinhub

XLDnaute Barbatruc
Bonsoir Job,
Il me semble que ce "65001", il tombe de nulle part, non?
Je pourrais faire la même observation à @laurent950 , pour son ".TextFilePlatform", qui par magie, prend cette valeur?
Ou peut-être existe-t-il un code VBA permettant de déterminer le type d'encodage à l'importation d'un csv?
Bonne soirée
 

laurent950

XLDnaute Accro
Bonsoir le forum,

Re @jerome1980 essayer avec cela : (Le code fonctionne bien !)
issus de la discussion

Je ne sais pas vraiment Intégrer les valeurs de la requête directement dans le tableau structuré en une seule étapes ! (le tous en mémoire) j'utilise la feuille Excel !

Cela se fait pour l instant en 2 étapes (Mémoire + Feuille support Excel)
A ) Import via la feuille Excel.
B ) 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
 

jerome1980

XLDnaute Nouveau
Bonjour

Si vous décompressez le fichier VBS.zip vous obtiendrez le fichier Excel avec sa macro avec en plus le fichier VBS pour la macro

Si vous lancez le macro obtenez un fichier CSV avec toutes les informations ligne par ligne
c'est à cause des boucles for, ainsi que des lignes objtextfile.writeline

Sauf pour la partie où il va chercher tout ce qui touche au logiciels.

Donc je pense que ce qui pose problème et ce qui est bloquant est le format de sortie du fichier CSV.

Pour moi l'intérêt de faire un tableau avec une macro comme je vous l'ai exposé. C'est d'avoir toute la configuration d'un PC sur une ligne.

Donc je pense que le problème est dans le VBS sauf que je n'ai pas la connaissance suffisante pour pouvoir le modifier.

Cela pour récupérer toutes les données séparées par des virgules.

et merci
 

Pièces jointes

  • vbs.zip
    6.7 KB · Affichages: 4

job75

XLDnaute Barbatruc
Bonjour jerome1980, le forum,

Pour importer votre dernier fichier CSV utilisez la méthode QueryTables :
VB:
Sub IMPORTDATA()
Dim fichier As Variant, F As Worksheet, lig&, n
fichier = Application.GetOpenFilename("Fichiers CSV (*.csv), *.csv", MultiSelect:=True)
If Not IsArray(fichier) Then Exit Sub
Set F = ActiveSheet 'à adapter
Application.ScreenUpdating = False
F.Cells.Delete 'RAZ
lig = 1
For n = 1 To UBound(fichier)
    With F.QueryTables.Add(Connection:="TEXT;" & fichier(n), Destination:=F.Cells(lig, 1))
        .TextFileParseType = xlDelimited
        .TextFileCommaDelimiter = True
        .Refresh
        .Parent.Names(.Name).Delete 'supprime le nom défini dans la feuille
        .Delete 'supprime la requête
    End With
    lig = F.UsedRange.Row + F.UsedRange.Rows.Count
Next n
F.ListObjects.Add xlSrcRange, F.UsedRange, , xlNo '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

  • Import.zip
    23 KB · Affichages: 3

Discussions similaires

  • Résolu(e)
Microsoft 365 requête Dossier
Réponses
6
Affichages
236

Statistiques des forums

Discussions
312 864
Messages
2 093 014
Membres
105 607
dernier inscrit
Grospsdresbois