Extraction d'une chaine de caractere à partir de caractère récurent.

Signaler
-
Messages postés
23586
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 octobre 2020
-
Bonjour,

J'aimerais extraire une chaine de caractère d'une cellule à partir de plusieurs caractères récurent.

Je m'explique, voici le contenu de mes cellules:

CAP-CERM 10nF,20%,200V,X7R,Poly T
CAP-CERM 2.2UF,20%,16V,X5R,,0603
RES-TF 4.7k,5%,63.0mW,200ppm/C,155
RES-TF 100R,0.5%,63.0mW,200ppm/C,15


Je voudrais en extraire 2 infos. Les valeurs: 10n, 2.2u, 4.7k et 100 et les tolérances: 20, 20, 5 et 0.5.

Pouvez-vous m'aider ? Merci

41 réponses

Messages postés
23586
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 octobre 2020
6 421
Bonjour,

avec 2 fonctions personnalisées en vba : https://www.cjoint.com/c/JJhociXoF5d
eric
Super, merci.

Cela fonctionne dans votre fichier mais comment puis-je exporter ces 2 fonctions dans un autre fichier ?

Sinon, ci-joint mon fichier, dans l'onglet 'VPKM5F-14B115-FAE' la colonne VAL et TOL à renseigner. je ferais les autres onglet ...

https://www.cjoint.com/c/JJhoGSMSmIi

Merci d'avance.
Messages postés
23586
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 octobre 2020
6 421
Alt+F11 pour afficher l'éditeur VBE.
Clic-droit sur le projet de ton classeur (à gauche) et 'Insertion / Module'
Dans le module affiché à droite tu copie-colles ce code :
Option Explicit

Function capa(s As String) As String
    Dim tmp
    tmp = Split(Split(s, ",")(0), " ")(1)
    If Right(tmp, 1) = "F" Or Right(tmp, 1) = "R" Then tmp = Left(tmp, Len(tmp) - 1)
    capa = tmp
End Function

Function tol(s As String) As Double
    Dim tmp
    tmp = Split(s, ",")(1)
    tol = Left(tmp, Len(tmp) - 1)
End Function

et voilà, tu as 2 nouvelles fonctions que tu peux utiliser dans toutes les feuilles de ton classeur.

Il faut l"enregistrer sous... et choisir le type *.xlsm pour conserver les macros
eric
Bonjour Eric et MERCI,

Cela fonctionne parfaitement dans mon fichier après l'import de votre module.

Mais car il y a un mais ..

Vous faite une recherche du caractère ',' pour les 2 fonctions afin d'extraire les 2 chaines de caractère qui m’intéresse et malheureusement pour un autre de mes clients, le format de la colonne REM n'est pas tout a fait le même et le nombre de ',' avant la valeur est différent entre les condensateurs et les résistances, 3 ou 4. Idem pour les tolérances.

RESISTOR, THICK FILM, 59.0 kOhm, 1 % , 100.0 ppm, 63.0 mW, SMD, 0402, (LF), (A), P1
CAPACITOR, CERAMIC, X7R, 4.7 NF, 10 PERCENTAGE , 50.0 V, SMD, 0402, (LF), (A), P1
CAPACITOR, CERAMIC, X7R, 150.0 NF, 10 PERCENTAGE , 50.0 V, SMD, 0603, (LF), (A), P1
CAPACITOR, CERAMIC, X7R, 100.0 NF, 10 PERCENTAGE , 50.0 V, SMD, 0603, (LF), (A), P1
CAPACITOR, CERAMIC, X7R, 22.0 NF, 10 PERCENTAGE , 50.0 V, SMD, 0603, (LF), (A), P1
RESISTOR, THICK FILM, 10.0 kOhm, 1 % , 100.0 ppm, 63.0 mW, SMD, 0402, (LF), (A), P1

Je ne voudrais pas abuser de votre temps mais serait-il possible de faire une recherche par rapport à plusieurs chaine de caractère. Par exemple pour les valeurs, si on trouve 'MF' ou UF' ou 'NF' ou 'k,', 'kohm', ect... et avec le '%' ou 'PERCENTAGE' pour les tolérances.

Comme cela, je pourrais adapté le module en fonction du format de la BOM de mes clients plus facilement en modifiant seulement les chaines de caractère référence.

Et si cela est compliqué de prendre aussi en compte les espaces ou pas entre la valeur et 'kOhm' par exemple ou ' NF', ne pas en tenir compte, il sera plus simple de les supprimer avec une autre fonction.

Merci d'avance de me consacré un peu de votre temps ...
Messages postés
23586
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 octobre 2020
6 421
Bonjour,

Si "%" est unique (ou le 1er à apparaitre est toujours celui qui intéresse) on pourrait se baser dessus et " PERCENTAGE"
Ca éviterait de devoir faire une liste exhautive des unités et lmimiterait les nombre de comparaisons à faire (assez lentes...)
Il faudra que l'un ou l'autre soit toujours présent.
Tu dis
eric
A de rare exception près, le caractère '%' ou 'PERCENTAGE' est toujours présent et unique, OUI.

La tolérance est très souvent écrite avec 'x%' ou 'x %' sachant que x peut contenir un '.' ou une ','
- 0.1% ou 0,5% - 0.1 % ou 0,5 %.
J'ai une autre question sur un autre sujet, plus simple pour vous je pense...

Est-il possible de passer en variable le nom d'un onglet par rapport au contenu d'une cellule ou l'inverse.

Dans mon fichier exemple précédent, onglet 'Version', je voudrais renseigner les cellule C1, D1, E1,.. et que le nom des onglets se mettent à jour automatiquement ou l'inverse.

VPKM5F-14B115-FAE - VPKM5F-14B115-GAF - ..

Merci d'avance encore.
Messages postés
23586
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 octobre 2020
6 421
Je viens de consulter ton fichier, en fait c'est beaucoup plus lourd (pour toi) que ce que je pensais.
On va peut-être changer le fusil d'épaule et traiter en one shot par une macro plutôt que d'avoir des formules à coller en pagaille.

Mais pour ça j'ai besoin de tous les détails de ce que tu dois faire : point de départ , point final et comment, avec quoi, etc
On va donc prendre le temps de quelques échanges pour bien cadrer le truc. Plus tu seras clair et complet (toujours préciser feuille, colonne (lettre et titre), ligne si besoin), plus ça ira vite

C'est VERSION qui génère les xxxxxx-xxxxxx-xxx ou l'inverse ?
Et ensuite ?
Précise aussi si il y a des maj et quoi traiter dans ce cas. Peut-on par exemple tout écraser pour tout récréer ? Si il y a des zone de saisie de commentaire à préserver, etc
eric

En effet le fichier commence à être lourd en formule.

Pour faire simple, mes fichiers d'entrées sont des nomenclatures client de cartes électroniques avec des formats, type de données et nombre de données différentes. Voir fichier joint.
L'idée étant de les comparer entre eux afin de repérer les différences, changement de valeur entre les nomenclatures et gestion des composants non montés dans une version(non présent dans la nomenclature)

Je renseigne d'abord les onglets 'Version1', 'Version2', ... en copiant le PARTS et le REM issue des BOM en colonne A et B. En colonne E et F de ces onglets, j’extrais la Valeur et la Tolérance compris dans le REM. (l'objet de ma demande) pour ensuite concaténer ces 2 résultats avec du texte qui me servira plus tard dans l'onglet 'Recap Diff.'

Dans l'onglet Parts, je colle la liste de tous les composants de la carte en colonne B extraite d'un fichier annexe(parts.asc). En colonne A, je rajoute des 0 entre la lettre et le premier chiffre pour pouvoir faire un trie sur la colonne A. Cette formule fonctionne uniquement pour des composants ayant une seule lettre. Pour les composants avec 2 lettres, je fais le trie manuellement ou en modifiant la formule.

L'onglet Version:
- Dans la colonne A, je recopie automatiquement la colonne B de l'onglet Parts.
- Dans la colonne B, je recopie automatiquement le premier REM autre que NM issue des colonnes C,D,E,.. S'il elle sont toutes à NM, je recopie automatiquement 'NM'.
- Dans les colonnes C,D,E,..., je recherche le contenu de la colonne A dans les onglets de chaque version et recopie la colonne B de ce même onglet. Si on ne trouve rien, on écrit 'NM' dans la cellule.
- Dans la colonne K, je différencie les composants non monté dans toutes les versions et les composants changeant de valeurs, résultat qui me sert par la suite.

- Mise en forme conditionnelle:
- Colonne A: en gris les composants non monté dans toutes les versions et en orange les composants avec une différences de valeur ou NM dans une version.
- Colonne de B à I: en gris les composants NM.
- Colonne C à I: en jaune les composants différents de la colonne B.

Et enfin onglet Recap diff.:
Dans celui-ci, je veux retrouver tous les composants NM dans chaque version ainsi que les composants avec un REM différent de la version de BASE(Colonne B, onglet Version)

Pour les composants NM, le contenu de la cellule doit avoir ce format:
ATT200 NM => BITCLR(ATT,200); /* ANTEST : ATT200() : NE : NON MONTE / NOT EQUIPPED */

Pour les condensateurs et résistances changeant de valeur le contenu de la cellule doit avoir ce format:
C26 - 180p - 10% - version 'VPKM5F-14B115-GBF' => C26_VAL=180p; C26_TOL=10;

Pour tous les autres composants, on recopie le REM correspondant.

Le but étant de générer un fichier texte par version, Onglet Recap Diff., Colonne E-K sans les '0'.
Ce fichier me permettant d'initialiser le test des composants présent ou non sur la carte et/ou à quel valeur et tolérance les tester en fonction de la version choisie.

En espérant avoir été le plus clair possible.


Aujourd'hui la majorité des onglets et formules fonctionnent et remontent les infos voulu, le point restant à optimiser étant l'analyse des REM de chaque version pour pouvoir extraire la valeur et la tolérance des composants en fonction des différents format des BOM de chaque clients.

J'avoue que l'accumulation des formules rend le fichier indigeste pour celui qui le découvre.
Moi même, quand il faut remettre le nez dedans, c'est compliqué.

A l'origine de mes modifications, le fichier se contentais de mettre en évidence les différences entre chaque BOM dans l'onglet Version. Le fichier d'Init pour chaque version était écrit manuellement avec le risque d'erreur que cela comporte.

J'ai moi même créé l'onglet 'Recap Diff.' et Parts et afin de limiter les risques d'erreurs, je voudrais automatiser la recherche des VAL et TOL dans les REM le plus possible en fonction des formats de BOM client.

Vous trouverez ci-dessous un lien vers des fichiers exemples.
Les BOM de 2 projets différents pour 2 client différents ainsi que mon fichier 'Traitement_diff' à jour, un vide et celui du projet1.

https://www.cjoint.com/c/JJin4D8NTCi
Messages postés
23586
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 octobre 2020
6 421
Houla, il va me falloir un peu de temps pour assimiler ça...

Par contre, faux départ : dis-toi bien que je ne connais rien à ton boulot, à son vocabulaire et à ses abréviations.
Et ça ne colle pas trop entre ce que tu dis et le fichier.

Ex :
Je renseigne d'abord les onglets 'Version1', 'Version2',
je n'ai qu'un seul onglet Version
... en copiant le PARTS et le REM issue des BOM en colonne A et B. En colonne E et F de ces onglets,
là ça y est, tu me perds.
Tu passes d'un onglet à l'autre sans les nommer.
en copiant le PARTS et le REM : je ne sais pas si c'est une feuille ou colonne issue de je ne sais quelle feuille. Il faut citer feuilles et colonnes source et destination
Et arrive un BOM surgit de nulle part...

Procédons par étapes.
1) le vrai point de départ initial sont toutes les feuilles de type VPKM5F-14B115-FAE (qu'on appellera x-x-x) ou tu n'as que A:B de renseigné : oui/non ?

2) Feuilles x-x-x, compléter leurs colonnes E,F,G
2a) Tu as vraiment besoin de VAL et TOL ou c'est juste pour fabriquer le champ VERSION ?
2b) A quoi te servent C et D ? Faut-il les conserver ? oui/non ?

3a) l'étape suivante est la création de la feuille Version ? oui/non
3b) si oui, et à voir tes formules, j'ai l'impression que l'ordre des feuilles x-x-x est primordial et qu'il faut le conserver. oui/non ?
  • VOIR POST SUIVANT

3c) en premier recenser tous les composants de toutes les feuilles x-x-x et les mettre en A ? oui/non
3d) trier A oui/non
3e) mettre les composants de chaque x-x-x à partir de C
3f) en B mettre le 1er composant de la ligne, sinon NM ? oui/non

Bon, j'arrête là pour l'instant car si ça se trouve je suis complètement à coté de la plaque.
Si tu peux répondre, compléter et corriger.
Essaie de bien détailler tes réponses un peu comme je l'ai fait, en respectant bien l'ordre des opérations

Surveille le sujet pour répondre au plus vite aux éventuelles questions.
Quand j'en pose une c'est que j'ai du temps à ce moment là. Le lendemain ça ne sera peut-être plus le cas. Si ça repousse de plusieurs jours en général je perd la motivation parce il faut presque reprendre à 0 le raisonnement vu que le fil des idées est perdu.
En t'inscrivant sur le site tu pourras recevoir un mail t'informant d'un nouveau post.
eric

PS : la chaine VERSION te sert à quoi ? Uniquement pour la feuille Recap Diff. qu'on n'a pas encore abordée ?
PS2 : tu avais signalé des cas où la fonction n'allait pas. Si tu peux me lister ces chaines incompatibles et le résultat voulu stp

En essayant continuellement, on finit par réussir. 
Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
Messages postés
23586
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 octobre 2020
6 421
pour 3c à 3f j'ai trouvé les réponses en continuant la lecture, tu peux oublier

Pour K on en discutera plus tard, pas trop à la fois sinon on se disperse trop.
Cette colonne devrait être ramenée en C si tu n'y vois pas d'inconvenients.
Ca permettrait d'avoir toutes les colonnes suivantes dispo pour les versions successives, et qu'elle ne se balade pas.

En essayant continuellement, on finit par réussir. 
Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
Que je te comprend, pas simple de rentrée dans un excel comme celui-ci sans avoir les tenants et les aboutissants.

Pour commencer, un petit mot sur mon travail, je crée des programmes de test pour vérifier la fabrication d'une carte éléctronique à partir de données client.
Au minimum, il me faut le schéma éléctrique, la ou les nomenclatures et la CAO de la carte, cad toutes les info. sur le circuit imprimé de la carte.
Voir www.antest.fr et www.andelec.fr.

Allez, c'est parti ...
1)Le point de départ sont les fichiers VPKM5F-14B115-FAE.bom, VPKM5F-14B115-GAF.bom....
Ce sont les versions de nomenclatures des cartes éléctroniques. En fonction des versions de cartes à fabriquer, des composants peuvent être Non Monté(NM) ou changer de valeurs.
A l'intérieur de ces fichiers, seule 2 colonnes m'interesse, la colonne que j'appelle 'PARTS'(Symbol dans les fichier.bom) qui correspond aux nomx de chaque composant sur la carte.
Et la colonne REM(Description dans le fichier .bom) qui correspond à la description du composant(Valeur, Tolerance, type de boitier, ...)
En effet, dans mon fichier 'Traitement des diff de BOM TS124 - ProjectName.xlsm', dans l'onglet de chaque version(x-x-x), je ne copie que la colonne A et B qui correspond aux colonnes PARTS et REM de mes nomenclatures.

2) Onglet x-x-x.
2a)Pour limiter le risque d'erreur et gagner du temps, il me faut extraire automatiquement la Valeur et la tolerance de la colonne REM pour chaque composant.
Cela me sert ensuite dans l'onglet 'Recap Diff', si dans un des onglets x-x-x la valeur d'un composant est différente des autres onglets x-x-x, il me faut la faire ressortir.
2b)Les colonnes C et D peuvent être supprimmées.

3a)Oui, l'étape suivante est la création de l'onglet Version.
3b)L'ordre des colonnes x-x-x n'a pas ou peu d'importance. Dans l'idéal, il faudrait avoir l'onglet x-x-x et la colonne x-x-x la plus complète en premier(à gauche)
Onglet 'VPKM5F-14B115-FAE' 575 lignes. Onglet 'VPKM5F-14B115-GAF' 630 lignes. Onglet 'VPKM5F-14B115-GBF' 704 lignes.

3c)Non, je recopie la colonne B de l'onglet 'Parts' dans la colonne A de l'onglet 'Version'. L'onglet 'Parts' est la liste de tous les composants sur la carte issue de la CAO, triée par ordre alphabétique grâce à la colonne A.
3d)Le trie de la colonne A de l'onglet 'Version' ce fait dans l'onglet 'Parts' colonne A.
3e)Je recopie la colonne B(REM) de chaque onglet x-x-x dans la colonne x-x-x correspondante de l'onglet 'Version'.
3f)La colonne B de l'onglet 'Version' est en effet le premier REM de la la ligne d'un composant, si aucun REM, le composant est 'NM' dans toutes les versions.
Cette colonne sera la version de 'BASE' de mon programme, toutes differences de 'REM' entre cette colonne et les colonnes x-x-x devront être remontées dans l'onglet 'Recap Diff.'.

Les chaines 'VERSION' et 'NM ALL VERSION' me servent dans l'onglet 'Recap Diff.'. Dans cette onglet, je traite uniquement les composants ayant des differences grâce à ces chaines.

Pas de Pb pour bouger la colonne K.

Pareil pour moi, je(nous) developpe(ons) cette Macro en parallele du reste de mon travail.
Grâce à tes fonctions 'capa' et 'tol', sujet de ma demande initial, j'ai débloqué mon projet en cours.
Dans mon exemple, ces fonctions recupèrent bien la VAL et la TOL de la colonne REM de chaque composants dans chaque onglet x-x-x.
Mais en essayant de les comprendre, j'ai vu que tu utilisais le nombre de ',' pour recuperer le champ qui m'interesse.
Or, la colonne REM n'a pas frocement le même format en fonction de mes clients. on ne peut pas se baser sur le nombre de ','

1er exemple de nomenclature: (projet en cours)
C1007 CAP-CERM 22nF,10%,50V,X7R,,0603
C1008 CAP-CERM 10UF,10%,6.3V,X7R,,0805
R3012 RES-TF 47k,5%,63.0mW,200ppm/C,155
R3014 RES-TF 4.7k,0.5%,63.0mW,350ppm/C,15

2eme exemple de nomenclature:
C407 CAPACITOR, CERAMIC, X7R, 10.0 uF, 10%, 6.3 V, SMD, 0805, (LF), (A), BEST
C408 CAPACITOR, CERAMIC, X7R, 4.7 UF, 10 PERCENTAGE , 16.0 V, SMD, 0805, (LF), (A), P1
RESISTOR, THICK FILM, 8.25 kOhm, 1 % , 100.0 ppm, 63.0 mW, SMD, 0402, (LF), (A), P1
RESISTOR, THICK FILM, 10.0 Ohms, 1 % , 100.0 ppm, 100.0 mW, SMD, 0603, (LF), (A), P1

Dans le 2ème exemple, tes fonctions ne marche pas. le nombre de ',' étant différent. De plus, il y a un ' ' entre le % et le nombre, idem pour la valeur.
Je ne sais pas si l'on peut ecrire un fonction qui soit compatible avec toutes les nomenclature client !!

Dans mon esprit, ce serait à l'utilisateur de renseigner les champs références de recherche dans le 'REM'
Je m'explique, pour la recherche de la VAL et la TOL dans le 1er exemple:
VAL => entre 'nF,' et ' ' d'avant, entre 'UF,' et ' ' d'avant, entre 'k,' et ' ' d'avant, entre 'R,' et ' ' d'avant.
TOL => entre '%' et ',' d'avant

exemple 2:
VAL => entre ' nF,' et ', ' d'avant, entre ' UF,' et ' ' d'avant, entre ' kOhm,' et ' ' d'avant, entre 'Ohms,' et ' ' d'avant.
TOL => entre ' %' et ', ' d'avant, entre '%' et ', ' d'avant,entre ' PERCENTAGE' et ', ' d'avant.


Pour chaque format de nomenclature, l'utilisateur devra renseigner ces champs de recherche.
Ou alors, on remplie une base de donnée avec tous les exemples que j'ai sous la mains avec la possibilité de rajouter les nouveaux cas.
Messages postés
23586
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 octobre 2020
6 421
Bonjour,

ok, je pense y voir plus clair.
Je crois que tu as raté le PS2 du post 10.
Que veux-tu à la place de #VALEUR selon les cas ?
eric
Dans la fonction 'capa' et 'tol', si l'on trouve rien, je veux bien remplacer le '#VALEUR' par une cellule vierge.
Pour info., le traitement de changement de valeur intervient uniquement pour les condensateurs et les résistances, sauf rare cas particulier traiter manuellement.

C'est pour cela que dans l'onglet 'Recap Diff', je remonte les VAL et TOL uniquement pour les composant commençant par 'C' ou 'R'.
Pour les autres, je remonte les REM différent de celui de la version de 'BASE'.
.
Messages postés
23586
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 octobre 2020
6 421
Donc j'élimine les tensions des diodes et les inductances des selfs ou je laisse quand même ?
Leur tolérance sera vide.

En essayant continuellement, on finit par réussir. 
Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
Messages postés
23586
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 octobre 2020
6 421
voir au-dessus + :
R1004 RES-TF 0R,,,,155.0C,0603
R1006 RES-TF 0R,,,,155.0C,0603
R102 RES-TF 0R,,,200ppm/C,155.0C,1206
R103 RES-TF 0R,,,,155.0C,0603
R3000 RES-TF 0R,,,155ppm/C,155.0C,0402
C'est quoi ça et qu'est-ce que j'en fais ?
Laisse les tensions de diodes et valeur d'inductance au cas ou ...

Par contre champ TOL vide.
Ce sont des résistances 0 ohm donc colonne VAL=0 et TOL=vide.
Si possible:
Dans la colonne G de chaque version, si TOL vide alors ne pas mettre Rxxx_TOL= ;

Garder uniquement Rxxx_VAL=0;
Messages postés
23586
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
24 octobre 2020
6 421
ok
pour les selfs, il faut enlever l'unité H également ?
Et V pour les diodes ?

Tu sais ce qu'est une matricielle validée sur plusieurs cellules en même temps ?

Pour VAL tu peux avoir pour réponse 4.7 ou bien 10U
Faut-il que je force 4.7 en chaine au lieu de numérique pour avoir des colonnes homogènes ?

En essayant continuellement, on finit par réussir. 
Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
Oui, il faut enlever les unités H et V pour les inductances et les diodes.

Pour les VAL des résistances, on garde le k pour kilo et M pour mega.
Pour les VAL de 0 à 999, il faut aucune lettre.

Idem pour les condensateurs, même si une valeur > a 0.999mF est très rare.
On garde m, u, n, p.

Non, je ne sais pas ce qu'est une matricielle validée sur plusieurs cellules en même temps.

Pour le 4.7, chaine ou numerique peu importe. La finalité étant de copier chaque colonne de chaque version de l'onglet 'Recap Diff.' dans un fichier texte, en supprimant les lignes à 0.
Ce fichier devenant le fichier Init de la version en question.