Ouvrir fichier csv via VBA

Bonjour à tous,

Je cherche à créer un fichier Excel qui, au démarrage, me laisse choisir un fichier csv à lire qu'il me l'intègre directement au classeur ouvert (éventuellement sur une nouvelle feuille, mais c'est pas obligatoire). Pour ça j'ai cette petite macro

Private Sub Workbook_Open()
    Dim fichier_choisi As String
    fichier_choisi = Application.GetOpenFilename()
    Workbooks.OpenText Filename:=fichier_choisi, Origin:=xlWindows, _
                StartRow:=1, DataType:=xlDelimited, Semicolon:=True
End Sub

Sauf qu'elle créé un nouveau classeur pour y intégrer le fichier. Quelqu'un sait ce que je dois ajouter ?

Et, tant qu'on y est, je voudrais aussi que les données soient tout de suite dans un tableau, comme ça c'est réglé :D

Cordialement,

Nicolas

Bonjour Nicolas

Moi je rajouterais une fonction de test de l'existence du fichier

Private Sub Workbook_Open()
    Dim fichier_choisi As String
    fichier_choisi = Application.GetOpenFilename()
  if Dir(fichier_choisi) Then  
  Workbooks.OpenText Filename:=fichier_choisi, Origin:=xlWindows, _
                StartRow:=1, DataType:=xlDelimited, Semicolon:=True
 Else
  Msgbox "le fichier choisi n'existe pas"
End if
End Sub

Bonjour Scraper,

Pas bête, je le rajoute. Et pour le problème de départ tu as une idée ?

Nicolas

Personne a une idée ? :(

Bonjour,

Franchement autant passer par Power Query et la fonctionnalité "importer" , surtout si vous les voulez directement dans un tableau ( que je suppose structuré)

Bonjour Valentin,

Je suis totalement d'accord, passer par Power Query est beaucoup plus simple. Sauf que le fichier n'est pas pour moi mais pour des collaborateurs qui ne savent pas s'en servir… d'où l'idée de passer par une boîte de dialogue au départ.

Après si c'est possible d'importer les données dans Power Query sans avoir à leur dire de passer par Données>A partir d'un fichier texte/CSV je suis preneur aussi.

Nicolas

Bonjour Nicolas, Valentin, Le Forum,

Le fait de passer par Données Texte CSV va créer au départ une connexion avec ce fichier CSV.

Donc c'est réalisé une seule fois. Ensuite cela sera réactualisé automatiquement.

Maintenant tout dépend de la version d'Excel utilisé par les collaborateurs. Si tous ont 365 pas de souci.

Bonjour le fil,

La question est qu'est ce qui est variable dans ce que vous essayez d'automatiser ? le nom du csv ? Son emplacement ? ect...

Bonjour le fil,

Ce qui est variable c'est le fichier csv source, il aura toujours le même nombre de colonnes avec les même noms mais n'est pas toujours au même endroit. Une fois qu'il est importé on lance une macro qui réalise tous les calculs nécessaires. Cette macro je suis en train de la préparer et il n'y a pas trop de problème avec, c'est vraiment sur l'importation que j'ai du mal.

Nicolas

Suite,

Ok. Pour la liaison, la source doit être reconnue. Si elle change tous le temps cela posera problème.

Sauf si on lui indique auparavant ou se trouve la source.

Soit par recherche automatique. Là on fait chercher par boucle sur des fichiers, le fichier en question.

Soit par recherche manuelle comme ci-dessous.

Sub Ouvretxt()
 xRech = Application.GetOpenFilename("Fichiers acceptés,*.csv")
    If xRech <> False Then
        xChemin = CurDir(xRech) & "\"
        xFichier = Mid(xRech, Len(xChemin) + 1)
        Workbooks.Open Filename:=xRech
    End If
End Sub

L'utilisateur ouvre une fenêtre pour trouver le fichier et c'est le chemin que l'on récupère comme source pour la connexion.

Nicolas

Je vais persévérer avec OpenText et trouver comment remplir le champ FieldInfo avec un Array() en interprétant la deuxème ligne du fichier sélectionné (la première étant souvent l'entête), si le CSV ne comporte qu'une ligne on peut penser qu'il s'agit d'une entête de fichier.

Apparemment, il faut indiquer pour chaque colonne le type présumé de la colonne

FieldInfo Argument xlColumnDataType facultatif. Tableau contenant des informations de distribution pour des colonnes de données individuelles. L'interprétation dépend de la valeur de DataType. Lorsque les données sont séparées, cet argument est un tableau de tableaux à deux éléments, qui indiquent les options de conversion pour une colonne particulière. Le premier élément est le numéro de la colonne (base 1) et le deuxième élément est l'une des constantes XlColumnDataType indiquant comment la colonne est distribuée.

https://docs.microsoft.com/fr-fr/office/vba/api/excel.xlcolumndatatype

https://docs.microsoft.com/fr-fr/office/vba/api/excel.workbooks.opentext

je serai étonné que quelqu'un n'ai pas déjà essayé de répondre à cette problématique, le problème n'est pas simple et je n'y répondrai pas dans la journée mais plutot dans une semaine, je laisse pour l'instant la place à ceux qui veulent bien te répondre

Scraper

Rebonjour le fil,

J'ai un peu changé mon fusil d'épaule, j'ai utilisé la solution proposé par X Cellus et j'y ai ajouté le code de ma macro. Résultat : tout marche bien et les pages nécessaires sont bien créées. Merci X Cellus !

Mais ça amène un nouveau souci : dans ma macro j'utilise une fonction perso, que du coup je perds dans le nouveau fichier. Est-ce que c'est possible de la passer d'un fichier à un autre ?

Nicolas

Bonjour Nicolas

Tu n'es pas clair sur le traitement intégré, tu es passé avec X Cellus de OpenText à Open, du coup ton fichier CSV est ouvert mais sur une seule colonne. Ton problème vient t'il de là? Anonymise ton fichier XLSM et ton fichier CSV, fournit les et donne nous la ligne qui te pose problème.

Peut-être que PowerQuery fournit une solution élégante et fiable: je ne suis pas du tout expert.

Bonne journée

J'avance sur OpenText mais je crée une usine à gaz pour la détection automatique des formats de fichiers, de séparateurs, de date au format anglais et français, ....

Je réécris l'assistant d'import d'Excel sans Interface utilisateur

Rechercher des sujets similaires à "ouvrir fichier csv via vba"