Bonjour Pierre
Merci de ton aide mais pour l'instant je suis bloque dans une fonction split pour lire les donnée d'un csv.elle beuge dès qu'elle trouve une ligne avec la valeur dû champs désirée vide
Bonjour Pierre
Merci de ton aide mais pour l'instant je suis bloque dans une fonction split pour lire les donnée d'un csv.elle beuge dès qu'elle trouve une ligne avec la valeur dû champs désirée vide
Le titre de la discussion ne correspond pas à ta demande du moment...
Robert t'as demandé de donner un exemple de ce qui était récupéré par le SELECT... Ce serait un bon début. Tant qu'à faire, montre également où ça plante et comment.
Normalement, si le txt est bien construit, il tient compte des champs vides en faisant suivre deux séparateurs sans rien entre. Si, par exemple, ta ligne représente Prénom;Nom;Ville, tu peux avoir une première ligne avec les trois données, une deuxième ligne où il manque le nom et une troisième où il manque la ville. Elles doivent se présenter ainsi:
Pierre;Dupont;Paris
Martine;;Alès
André;Durand;
Alors, il est possible de les exploiter avec Split. Si les lignes ne sont pas bien formées (par exemple Martine;Alès), ça va être compliqué, voire impossible, de pouvoir interpréter la ligne et déceler les valeurs manquantes.
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
Bonjour,
Si un split ne peut pas découper en fonction du caractère passé en paramètres,il y aura très certainement un erreur!
Si tu split sur un texte vide tu n'auras pas d'erreur mais le résultat ne sera pas un tableau!
Si tu dispose normalement de 3 champs et vue qu'un tableau commence à 0;
Tu auras une erreur sur T(2) si ton texte ne contient qu'un ;
Soit tu es capable d'évaluer que ton split n'est pas bon, soit tu concatènes ton texte brut avec 2; si tu disposes de 3 champs et tu ne travail que de 0 à. 2 mais tu risque de décaler te valeurs si d'aventure ton texte brut ne dispose que d'un champ!
Si ton tableau contient 3 champs un ubound devrait te retourner 2, si tu concatène avez 2;
Ton ubound devrait te retourne 5 si la valeur n'est pas correcte tu ne traites et tu informes le fournisseur du fichier qu'il doit revoir sa copie!
Mais personnellement je trouve ce fils déroutant!
Je ne sais pas si tu veux créer un fichier texte, si tu veux enrichir une table, ou si le but est d'enrichir une table pour pouvoir gérer ton fichier texte pour fusionner les deux dans ton fichier texte! Car un appen suffirait!
Dernière modification par Invité ; 20/09/2016 à 09h05.
Bonjour,
je réexplique le pb: j'ai une table a csv en entrée avec plusieurs colonnes, Quand il n'ya pas de cellules vide, la boucle marche bien, et la macro me génère bien une table acess, le pb quand il y a une cellule vide dans la table csv, la macro plante avec le message l'indice n'appartient pas à la sélection erreur 9( au niveau de cette ligne: data = Replace(strArray(rst!Position_CSV), """", "")) , je pense que mon split à un pb voici le code:
c'est vrai que ce n'est pas dans le sujet de cette demande mais je me suis rendu compte de ce pb après.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 Set rst = CurrentDb.OpenRecordset("SELECT * FROM Champ WHERE Position_CSV <> -1 AND Table = '" & TableName & "' Order by OrderIndex") If rst.RecordCount > 0 Then While Not oTxt.AtEndOfStream ligne = oTxt.ReadLine 'Debug.Print Ligne strArray = Split(ligne, ";") Set rst2 = CurrentDb.OpenRecordset(TableName) rst2.AddNew rst.MoveFirst Do While Not rst.EOF data = Replace(strArray(rst!Position_CSV), """", "") If strArray(rst!Position_CSV) <> "" And strArray(rst!Position_CSV) <> """""" Then 'If data <> "" Then rst2(rst!Champ).Value = data End If rst.MoveNext Loop rst2.Update Wend End If
j’espère que j'ai bien exposer le pb
merci
je subodore que nous somme repassé à l’export!
Code : Sélectionner tout - Visualiser dans une fenêtre à part data = Replace(strArray("" & rst!Position_CSV), """", ""))
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 Set rst = CurrentDb.OpenRecordset("SELECT * FROM Champ WHERE Position_CSV <> -1 And Position_CSV Is Not Null AND Table = '" & TableName & "' Order by OrderIndex") If rst.RecordCount > 0 Then While Not oTxt.AtEndOfStream ligne = oTxt.ReadLine 'Debug.Print Ligne strArray = Split(ligne, ";") Set rst2 = CurrentDb.OpenRecordset(TableName) rst2.AddNew rst.MoveFirst Do While Not rst.EOF data = Replace(strArray(rst!Position_CSV), """", "") If strArray(rst!Position_CSV) <> "" And strArray(rst!Position_CSV) <> """""" Then 'If data <> "" Then rst2(rst!Champ).Value = data End If rst.MoveNext Loop rst2.Update Wend End If
Merci de ta proposition toujours NOK avec la même erreur 9.
Code : Sélectionner tout - Visualiser dans une fenêtre à part set rst = CurrentDb.OpenRecordset("SELECT * FROM Champ WHERE Position_CSV <> -1 And trim(Position_CSV ) <>'' AND Position_CSV Is Not Null AND Table = '" & TableName & "' Order by OrderIndex")
nok erreur : data = Replace(strArray(rst!Position_CSV), """", "")
Code ?????? : Sélectionner tout - Visualiser dans une fenêtre à part set rst = CurrentDb.OpenRecordset("SELECT * FROM Champ WHERE Position_CSV <> -1 And trim('' & Position_CSV ) <>'' AND Position_CSV Is Not Null AND Table = '" & TableName & "' Order by OrderIndex")
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
RE,
Apres multiple recherche toujours au point 0,
Mes clés est une position csv (nombre de séparateur) + le séparateur" ;" à L'exécution de la macro celle ci va chercher la position qui correspond au champs voulu dans le csv (donc un nombre de ; stable pour elle ) et elle parcours ainsi ligne par ligne mon fichier csv brut pour tout copier sous forme de table, cette macro plante au niveau d'une ligne ou forcement la clé positon csv n'est pas la même( car la macro a défini au départ cette clé ) car le nombre de ";" à changer puisqu'il y a des vides (il ya une ligne avec des donnees manquant) du coup le nombre de ";" est inferieur à la clé .
exemple :
alain;bernard;24ans
imaginons que j'ai défini lage comme sortie donc la clé !strposition csv sera 2
si une ligne a comme entré juste
Pierre;
la macro plante
merci
Relis mes posts, sinon ça sert à quoi que je les écrive. J'explique justement ces cas de figure, qui démontrent que ton csv est mal formé. Ta ligne devrait être
pierre;;
Le problème, c'est qu'il faut "deviner" ce qui manque. Il serait donc judicieux de prendre le mal à la racine et de former correctement ton csv, si tu as la main sur cet aspect du problème, car dans le cas contraire, ton problème risque d'être insoluble selon les cas de figure des lignes incomplètes.
Si je reprends ton exemple avec une ligne qui devrait être alain;bernard;24 mais qui est alain;24... Comment veux-tu savoir quelle partie manque? Il n'y a pas d'algorithme qui te permettra de savoir que c'est la données "du milieu" qui manque. Ainsi, ta bonne chaîne pourrait être "alain;;24" ou ";alain;24" ou "alain;24;"...
Contournement: considérer que les données manquantes sont toujours à la fin (Mais ce postulat est-il correct? J'en doute)... Il suffit alors d'ajouter le nombre de ; qui manquent, par exemple avec la fonction suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 ' Compte le nombre de séparateurs et ajoutent ceux qui manquent Function CompleterChaine(Chaine As String, Separateur As String, NombreAttendu As Integer) As String Dim CountOf As Integer ' Nombre de séparateurs présents dans la chaîne CountOf = Len(Chaine) - Len(Replace(Chaine, Separateur, "")) If CountOf < NombreAttendu Then CompleterChaine = Chaine & String(CountOf, Separateur) Else CompleterChaine = Chaine End If End Function
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
En fait, ces 34 messages (!!) illustrent deux choses:
- qu'il est intéressant de ne parler que d'un problème dans une discussion;
- que souvent, on essaie en VBA de résoudre des problèmes qui devraient être résolus en amont.
J'explique.
Pour le point 1, cela me semble évident. Entre le titre donné à la discussion et le sujet traité à ce point-ci de la discussion, il y a un monde!
Pour le point 2: la seule et unique bonne manière de procéder pour résoudre ton problème est de former correctement ton CSV. Toute autre solution risque à terme de poser problème.
Le VBA, qui est un langage professionnel, est beaucoup trop souvent utilisé pour bricoler des solutions caduques simplement parce qu'au départ le travail n'est pas bien fait. Ce n'est pas VBA qui n'est pas un langage professionnel, c'est que l'on fait parfois (trop souvent) avec qui ne l'est pas.
Je l'écris à nouveau pour que ce soit bien clair:
La seule et unique bonne manière de procéder pour résoudre ton problème est de former correctement ton CSV. Toute autre solution risque à terme de poser problème.
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
Re bonsoir
POur te répondre impossible de modifier le fichier csv
Les lignes avec des points virgules manquant peuvent se retrouver aléatoirement
Cest à dire
Alain;Bernard;24
David;35
....
Pour récapituler la macro plante car la clé position csv de l'âge ici qui est 2 est incomplète a la 2 eme ligne.peut on faire un contournement quand même ??
Merci
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
Tes lignes dans le csv, c'est réellement au format prénom;nom;âge lorsqu'elles sont bien formées ou c'est juste un exemple mais ta ligne réelle est plus complexe?
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
Tu pourrais exclure cette ligne et continuer le traitement, quitte à noter dans un log le problème rencontré.
Pour ne pas bloquer sur une ligne mal formée, tu pourrais compter le nombre de ; que tu attends lors de la lecture d'une ligne du CSV. Normalemet, pour x colonnes attendues, tu aura x-1 ;
La fonction que j'ai donnée tout à l'heure illustre comment compter les ;
Il suffit de tester avec IF et d'écrire dans un fichier log (ou une table log) qui reprendrait par exemple toute la chaine mal formée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Len(Chaine) - Len(Replace(Chaine, ";", ""))
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
Le code compte bien le ; d'une façon automatique en gros je rentre dans une table le champs voulu et lui compte le nombre de ; dans l'en-tête avant de faire le traitement.
Du coup comment je peux ignorer cette ligne qui me pourri le code ?
Merci
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager