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

laurent950

XLDnaute Barbatruc
Bonjour @jerome1980, le forum,

Pour importer votre dernier fichier VBS utilisez la méthode qui ne tiens pas compte de votre tableau structuré

VB:
Sub ImportCSVWithDynamicColumnsA()
' Fonctionne sans Tableau Structuré
    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

    ' la feuille active
    Set ws = ThisWorkbook.Worksheets(ActiveSheet.Name)
  
    ' 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
      
        ' Comme votre fichier VBS n'est pas structuré j'ai mis un nombres
        ' colonne Fictif (Un nombre important soit 50 Colonnes !)
        ' En rapport avec votre fichier "VBS" Nom : FIXE-PC - Inventaire mat + log.csv
        colCount = 50

        ' 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
        ' 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
Bonjour Laurent950

Merci pour votre réponse.

En utilisant un ou plusieurs fichiers « inventaire matériel + logiciels (séparateur ,) mode fiche.vbs »,je m’aperçois que la macro importe le ou les fichiers CSV sélectionnés tel quel dans le fichier Excel.

Je pourrais m'en contenter si chaque import de CSV pouvait, dans le classeur, générer sa propre feuille des calculs nommée avec le nom du PC.

Une modification du code de la macro au niveau de la boucle for peut-elle être envisageable dans ce sens. Du coup on oublierait le tableau.

Cependant l'idéal aurait été que les imports de mes fichier CSV convergent tous au final en l'édition de X ligne dans mon tableau à en tête.

Après ce n'est peut-être pas possible de rééclater les données en fonction des colonnes.

Autre chose, serait-il possible de mettre une condition pour que si un fichier CSV ait déjà été traité, la macro ne le traite pas à nouveau.

C’est déjà bien que je puisse importer mes csv comme cela.

Du coup si on reste en l'état avec l'import en mode fiche, il faudrait que la macro importe les données du chaque fichier CSV à partir de la seconde colonne du tableau Excel.

Puis la troisième colonne pour le deuxième fichier CSV, puis la quatrième colonne pour 3e fichier CSV, ainsi de suite

avec en première colonne les libellés de chaque champ.
merci de me dire ce qui est le plus simple et je reformaterais mon tableau en consequence.
je vois déjà un problème avec la partie logiciel du vbs ou alors tout

dans le fichier excel, j'ai essayé de supprimer les lignes d'entêtes, l'import se fait dès la première ligne en chevauchant le tableau..


Merci pour votre aide.
 

jerome1980

XLDnaute Nouveau
Bonjour Laurent950

tout simplement parce que le fichier CSV initial généré par le VBS contient le descriptif avec les en-têtes de ligne ou de colonne selon qu'on se place par rapport au fichier texte CSV ou au classeur Excel.


par curiosité j'ai cherché combien de colonnes un feuille excel pouvait contenir au maximum
D’après https://support.microsoft.com/fr-fr/office/spécifications-et-limites-relatives-à-excel-1672b34d-7043-467e-8e27-269d656771c3, dans excel 2021, il y aurait 16384 colonnes, ça fait beaucoup 😊

j'ai modifié le vbs de sorte à n'avoir que les valeurs sans les noms.
j'ai aussi modifié le classeur pour mettre toutes les colonnes en lignes
l'idéal serait que la colonne A ne soit pas touchée et que les imports ne commence qu'à partir de la colonne B.

je vous joins ainsi le fichier xlsm avec le bon format attendu et le vbs retouché

merci à vous
 

Pièces jointes

  • vbs.zip
    28.8 KB · Affichages: 4

jerome1980

XLDnaute Nouveau
Bonsoir @jerome1980,

Pourriez-vous fournir une description détaillée, point par point, des étapes à suivre dans votre processus ? Voici quelques questions et observations pour clarifier votre demande :
  1. Fichier : inventaire matériel + logiciels (séparateur ,) mode macro.vbs
    • Pourquoi inclure ce code VBA dans votre demande ?
    • L'avez-vous écrit vous-même ?
  2. Fichier : FIXE-PC - Inventaire mat + log.csv
    • Quel est le lien entre ces données et le format que vous souhaitez créer pour le fichier inventaire.xlsm ?
  3. Fichier : macro sans tableau structuré.txt
    • Pourquoi inclure le code de la macro dans le fichier ZIP ?
  4. Fichier : inventaire.xlsm
    • La VBA n'est pas modifiée, mais toutes les colonnes sont mises en lignes. Pouvez-vous expliquer pourquoi ?
Pour une meilleure compréhension, pourriez-vous préciser :
  • Quelles sont les données d'entrée ?
  • Quelles sont les données de sortie ?
@job75 a obtenu les mêmes résultats que moi et a répondu favorablement à votre demande. Le processus pour extraire les valeurs vers Excel à partir d'un fichier modèle .csv correspond bien à votre demande initiale. D'autres méthodes, proposées par des experts, sont également valables.

Votre demande nécessite un développement sur mesure. Pour avancer, essayez de proposer un début de code VBA ou, à défaut, une description point par point de vos tâches, avec un fichier de sortie manuel (sans code) qui représente le résultat final souhaité. Cela permettra de créer une synthèse et d'élaborer une méthode pour réaliser votre code conformément à vos attentes.

Merci et bonne soirée.
 

jerome1980

XLDnaute Nouveau
bon
jour

à la base j'ai réalisé ces VBS en m'inspirant de plusieurs sources sur le Web.

J'ai obtenu la fiche d'un PC avec toutes les caractéristiques et logiciel qu'il comportait sous la forme d'un fichier CSV

une fois que j'ai eu le fichier complet au format csv pour une fiche de PC. Je me suis dit et si je mettais tout ça sous forme de tableau.

C'est là qui intervient la recherche sur Youtube pour arriver sur la vidéo que j'ai jointe à propos de l'import par macro.

Il me semble qu'à ce moment vous me parliez de power query que je ne connais absolument pas

aussi j'ai préféré me focaliser sur le VBS en sortie CSV avec virgules pour intégration dans la macro

pour le point 4 de votre message.
Tout simplement parce que j'ai vu que votre code me permet de récupérer les données de fichier CSV ligne par ligne plutôt que par colonne.

Comme je l'ai dit au début du message j'ai récupéré et mis en forme à ma manière un VBS pour obtenir ce que je voulais en mode fiche

après avoir vu passer la vidéo YouTube ou j'ai vu qu'il était possible de mettre ça sous forme de tableau via une Macro.
Je me suis dit pourquoi pas.

Si je dois m'arrêter à l'affiche CSV tant pis.
J'ai réussi le but de mon opération à savoir synthétiser le contenu de mon PC ou d'un PC dans un fichier CSV

comme je vous l'ai indiqué j'aurais souhaité pouvoir tout synthétiser sous la forme d'un tableau à colonne, dans chaque ligne aurait représenté le contenu d'un PC.

pour en revenir à mon fichier VBS pour pouvoir intégrer mes données dans le fichier Excel via la macro il faudrait que toutes les valeur soit séparée par des virgules.

Or ces valeurs sont données par des variables incluses dans des boucles for

Donc en état actuel des choses à moins de pouvoir réaliser une simple et énorme requête pour combiner toutes les donner à ressortir sous la forme du CSV avec virgules contenant uniquement les valeurs que je veux importer dans mon tableau je ne peux elle est plus loin dans ma démarche.
 

jerome1980

XLDnaute Nouveau
Bonjour
comme convenu je vous joins :
- le fichier inventaire.XLSx avec uniquement les en-têtes de colonne
- les 3 fichiers CSV issu de mon script VBS avec, comme séparateur
- le vbs

le tout sous archive au format ZIP

merci
 

Pièces jointes

  • vbs.zip
    22.5 KB · Affichages: 3

jerome1980

XLDnaute Nouveau
bonjour

je viens, à tête reposée de toucher à powerquery

wahou, c'est vrai que ça fait bien l'importation, même automatiquement si un csv a été créé depuis la dernière ouverture

je ne connaissais vraiment pas
merci d'avoir insisté avec powerquery

reste que toutes mes fiches sont sur une seule feuille.
merci

j'aimerai quand pouvoir aller au bout de mon histoire avec ma macro
 

job75

XLDnaute Barbatruc
Bonjour jerome1980, le forum,

Avant de vous abandonner il faut quand même que je vous dise vos 4 vérités :

- vous n'avez absolument pas compris ce qu'est une importation CSV

- la plupart des messages que vous avez publiés sur ce fil n'ont aucun sens

- vous ne tenez pas du tout compte des solutions qu'on vous donne

- il est incroyable que mon post #15 soit resté sans réponse alors que la solution est très simple.

A+
 

laurent950

XLDnaute Barbatruc
Bonjour @jerome1980,

En lisant votre retour sur Power Query, vous avez mentionné que cela fonctionne très bien pour l'importation automatique des CSV, ce qui est excellent.

Pour mieux comprendre votre avancement, pourriez-vous partager le fichier Excel que vous avez obtenu en utilisant Power Query avec les trois fichiers CSV que vous avez fournis ?

Car en poste #24, le fichier Excel n'est pas "wahou" !
je viens, à tête reposée de toucher à powerquery

wahou, c'est vrai que ça fait bien l'importation, même automatiquement si un csv a été créé depuis la dernière ouverture

Merci et bonne journée.
 

jerome1980

XLDnaute Nouveau
Bonjour @jerome1980,

En lisant votre retour sur Power Query, vous avez mentionné que cela fonctionne très bien pour l'importation automatique des CSV, ce qui est excellent.

Pour mieux comprendre votre avancement, pourriez-vous partager le fichier Excel que vous avez obtenu en utilisant Power Query avec les trois fichiers CSV que vous avez fournis ?

Car en poste #24, le fichier Excel n'est pas "wahou" !


Merci et bonne journée.
bonjour laurent

ci joint le fichier vbs.zip
une fois extrait vous devriez obtenir un dossier csv avec trois fichiers csv et le fichier inventaire powerquery.xlsx qui contient la requête powerquery.

le "wahou" était lié au fait que j'étais impressionné de voir ce que pouvait réaliser powerquery.
 

Pièces jointes

  • vbs.zip
    51.7 KB · Affichages: 3

jerome1980

XLDnaute Nouveau
Bonjour

le powerquery renvoie le format du fichier csv telquel autrement dit si j'ai 50 lignes dans 1 csv pour 10csv importés j'aurais 500 lignes environ dans ma feuille excel

du moment que j'ai les infos voulues, ça me va.

merci à tous et à job75
 

Discussions similaires

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

Statistiques des forums

Discussions
313 197
Messages
2 096 107
Membres
106 500
dernier inscrit
mmontagu