[VBA] - Récupérer des infos dans variable tableau avec Split

Bonjour,

Je souhaite récupérer les informations contenues dans une colonne d'une base de données que j'ai téléchargé sur l'INPN.

Compte tenu de la taille de cette dernière, et de l'inutilité de l'afficher à l'écran, je charge le .csv tel quel sur une feuille puis j'essaie de travailler dans une variable tableau.

Cette base de données est organisée à l'aide de séparateur ",".

Pour conserver les infos qui m'intéressent dans la variable tableau, je split chaque ligne et récupère ce qui m'intéresse, dans ce qui correspondrait à la colonne "REGNE".

Toutes les infos sont alors enregistrées dans un dictionnaire que je fait apparaître dans une listbox. De là, je pourrait alors, par la suite, conserver les lignes qui m'intéressent.

Sauf que j'ai un souci !

Split, qui sépare à partir du séparateur "," trouve parfois dans des cellules des "," qui ne sont pas des séparateurs...
Lorsque je demande à Excel de convertir les données à partir des "," ça fonctionne, mais split ne le fait pas de la même manière.

Dans l'exemple que je donne, j'aimerais qu'il ne s'affiche que "Animalia" et "Plantae" dans la listbox. Mais si vous ouvrez le document, vous verrez qu'il y a d'autres choses qui apparaissent, du fait des "," qui trainent avant.

Il y a deux tests, l'un sans conversion des "," et un second test où je convertis les "," lorsque je le peux, mais je ne sais pas si c'est la meilleure manière d'avoir les résultats attendus. Et il reste toujours de "," non convertibles a priori.

Je vous remercie de votre attention,

Bonne journée !

33tri-donnees.xlsm (51.90 Ko)

Bonjour,

As tu essayé avec Power Query ?

Cordialement.

Bonjour,

PowerQuery doit connaître les valeurs à conserver. En l'occurrence, j'aimerais alimenter des listboxes pour laisser le choix de ce qui est conserver ou non.

En listant "Animalia" ou "Plantae" (et d'autres) l'idée est de pouvoir conserver une partie des données selon ses choix.

Edit : Je vais quand même chercher, si je peux pas proposer une liste de choix pour la création de noms qui seront ensuite utilisé pour filtrer dans PowerQuery.

Bonjour,

Avant de faire quoi que ce soit, sélectionne toutes tes données; et fait "Rechercher / Remplacer quoi : "," Remplacer par : "|"

Ensuite seulement tu fais données convertir avec pour séparateur la pipe " | " (sans guillemets)

et tu auras des données tabulaires propres.

A+

Bonjour,

Remplacer les "," par des " | " conduit à la même erreur.

Pour la séparation des colonnes, il y a des "," qui ne sont pas mises entre guillemets et d'autres qui le sont.

A côté il y a des "," qui ne sont pas entre guillemets, et qui ne sont pas des séparateurs...

Avec les séparateurs pipe " | " il y a des colonnes qui ne sont pas délimitées, comme avec les virgules :/

Code utilisé :

.Range(.Cells(2, 1), .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1)).Replace what:=""",""", Replacement:=" | ", lookat:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

aa = .Cells(1, 1).Resize(.Cells(.Rows.Count, 1).End(xlUp).Row, .Cells(1, .Columns.Count).End(xlToLeft).Column)

Bonne journée !

Je ne voudrai pas paraître têtu mais... Je ne te parles pas de macros : Fais le à partir du menu <Rechercher / Remplacer

Puis ensuite Données / Convertir avec le séparateur pipe.

Après il y a peut-être des trucs qui m'ont échappés... (je n'ai pas tout décortiqué comme toi seul peu le faire) mais le résultat m'a paru probant.

A+

re,

Quelle sont les colonnes à garder ?

Il est peut être possible de récupérer directement la base à partir du site de l'inpn.

Cordialement.

9le-drosophile.xlsx (101.04 Ko)
5tri-donnees.zip (23.06 Ko)

Bonjour à toutes et tous,

Déjà, l'utilisation de Power Query était à envisager !

rappel - Information

Cdlt.

Bonjour,

Merci pour vos réponses.

En général, mes fichiers sont destinés à une utilisation par une petite équipe. Tout ce que je fais en VBA, c'est pour obtenir un algorithme qui répètera à chaque fois les mêmes opérations, sans intervention humaine.

A partir des outils microstoft, j'arrive très rapidement à avoir les infos dont j'ai besoin. Via des filtres ou PowerQuery je n'ai aucun problème.

Cette grosse base de données que je télécharge en .csv depuis l'INPN peut être utilisée pour générer x micro-bases de données, utilisables par différentes personnes. Si ça devait être moi, je pourrais faire ces différentes micro-bases de données à la main. Mais l'idée ici est de proposer un outil qui fasse ce travail tout seul, en fonction des choix qui sont sélectionné. Ainsi, tout le monde est en mesure de faire les BDD dont il a besoin.

Via PowerQuery, je sais obtenir une BDD bien délimitée. En revanche je ne sais pas utiliser des variables pour identifier les informations que je souhaite conserver.

Un exemple simple avec la BDD que j'ai envoyé :

Est-ce qu'on peut utiliser une variable qui prendrait la valeur "Plantae" ou "Animalia" au choix, et qui ensuite, lors du rafraichissement de la procédure PowerQuery chargerait dans la colonne "REGNE" uniquement les "Plantae" ou les "Animalia" ?

Bonjour,

je pense qu'il y a une incompréhension sur la proposition de galopin.
Il te propose de remplacer "," (avec les guillemets) par |

En vba il faut donc doubler les " qu'ils soient considérés comme des caractères et non des débuts et fins de chaine. Ce qui donne dans test1 :
svS = Split(Replace(aa(i, 1), """,""", "|"), "|")

Ce qui donne :

image

Est-ce que tu attends ?
eric

Bonjour,

Merci eriiic d'avoir fait le test.

Nous obtenons la même chose, et hélas ce n'est pas ça. Il y a des colonnes qui sont mal délimitées car elles ne sont pas renseignées comme les autres (pas de " ") et à l'opposé il y a des "," qui ne sont pas des séparateurs et qui sont malheureusement pris en compte car ils sont identiques avec les séparateurs...

Si je ne délimite pas le document dès l'ouverture, alors je crois que ça va toujours poser problème, à moins de faire une usine a gaz qui va devoir tenir compte de toutes les éventualités... J'ai déjà essayé de faire ça par le passé et ça mène rarement bien loin. Sur une base de données de 900 000 lignes, mise à jour tous les ans, ça peut engendrer trop d'erreur et trop de travail à gérer systématiquement.

Pour pallier à tout ça, le mieux sera donc peut-être d'utiliser plusieurs document, avec PowerQuery s'exécutant en premier.

Un document qui ne va filtrer que les "Animalia", un autre qui ne filtrera que les "Plantae", etc. Et une fois la base de données plus petite et bien définie, il devient très simple et rapide de la mettre à jour comme je le fais déjà pour d'autre.

Je vais voir ce que ça donne.

Bonne journée !

Re,

A tester, si j'ai bien compris.

Quelle est l'adresse du site où tu récupère ton fichier .csv ?

Cordialement.

6le-drosophile.xlsm (109.18 Ko)
7tri-donnees.zip (23.06 Ko)

En fait, c'est le champ RQ_STATUT qui met le bouze. Une moulinette permet de s'en sortir parce que les virgules en trop ne sont pas n'importe où. On les trouve dans les chaînes suivantes :

iv,v iii,iv iii,v ii,iii et i,ii

Donc en remplaçant ces chaînes avec une moulinette, on remet le tableau au carré en CSV avec le " ; " comme séparateur.

A toi de voir ce que ça vaut. Voici un bout de code pour la chaîne iv,v ==> iv.v

    Dim ligne As String

    Open "c:\Temp\tri-donnees.txt" For Output As #2
        Open "c:\Temp\tri-donnees.csv" For Input As #1
            While Not EOF(1)
                Line Input #1, ligne
                If InStr(ligne, "iv;v") > 0 Then
                    ligne = Replace(ligne, "iv;v", "iv.v")
                End If
                Print #2, ligne
            Wend
        Close #1
    Close #2
    End
12tri-donnees.xlsx (86.79 Ko)

Bonsoir,

Pas vu ce post https://forum.excel-pratique.com/s/goto/943506 ?

Oups, j'ai édité mon message, j'avais confondu "Jean-Eric" avec eriiic... Désolé

Merci pour vos différents messages, avec une macro qui s'occupe de RQ_STATUT, mais aussi des 3 premières colonnes, on peu arriver au résultat souhaité. Cela nécessite toutefois de boucler sur plusieurs colonnes et de s'assurer que des soucis similaires n’apparaissent pas dans le reste de la table. Et n'apparaîtront pas plus tard...

J'ai finalement fait une requête PowerQuery et je ferai x document avec des requêtes PowerQuery différentes. Il faudra ouvrir le document qui correspond aux besoins.

Ensuite, j'alimente des listboxes pour affiner les résultats à la demande.

Il y a un dernier point qui me serait bien utile, ce serait de pouvoir effacer les données importées via PowerQuery avant l'enregistrement. De cette manière le document reste léger et rapide à ouvrir.

J'ai cette option, mais je ne peux pas la cocher :

sans titre

Vous savez comment je peux faire ça, sans que ça ne désactive la requête ? Supprimer la feuille = fin de la connexion.

Bonne fin de journée !

Bonjour,

Cette option est disponible si tu coches l'activation à l'ouverture du classeur !?

Cdlt.

Bonsoir,

Hélas non haha !

Edit : J'ai réouvert le document et effectivement je pouvais la cocher finalement. Je vais tester ça !

Rechercher des sujets similaires à "vba recuperer infos variable tableau split"