Tri, calculs, et expressions régulières

Staco

XLDnaute Nouveau
Bonjour

Dans un fichier excel (2003), je cherche à afficher le résultat d’un calcul dans un feuillet « Calculs» à partir des données de la colonne Y du feuillet « Données ». Jusque là pas de problème. Je précise qu’il y a des trous dans la colonne à partir de laquelle je fais mes calculs de sorte que pour effectuer mes calculs, je me réfère à la colonne A qui elle n’en a pas

Je sélectionne mes cases dans la colonne Y et fait mes calculs avec une condition si écrit de la sorte :

Do While Range("A" & STR_INDICE) <> ""
If Range("Y" & STR_INDICE) <> "" And Range("Y" & STR_INDICE) >99 Then
i=i+1

STR_INDICE = STR_INDICE + 1
Loop

Bien sur, je fais d’autres calculs, mais ça reste très simples: nombre de valeur dans la colonne moyenne, valeur maxi, mini, écart-type.

Par contre, j’ai besoin de trié mes calculs de manière automatiques, en fonction de données rentré dans une autre colonne. Dans cette colonne on trouve des motifs en as, as01, as02, ca, ca01…

Je voudrais donc, via une macro déclenchée par un bouton, faire mes calculs avec les données de la colonne Y correspondant aux lignes de la colonne E, ayant pour « motif » ceux qui commenceront par AS en cliquant sur le bouton 1, ou bien par CA en cliquant sur le bouton 2, ou bien par autre chose ( et là je ferais un bouton correspondant au nouveau « motif », inscrit dans la colonne).

Le nombre de motif CA, ou AS, pouvant varier dans le temps, je pense que la meilleure solution serait d’utilisé les expressions régulières.

Je ne bute pas sur le pattern à priori, mais plutôt sur son utilisation. Et étant apprenti sorcier je ne maitrise pas encore ses arts occultes que sont VBA en général et les expressions régulières dans VBA en particulier.

J’ai « tripoté » mon code dans de nombreux sens, lu des tutoriaux, re-"tripoter" mon code lu tout ce que je pouvais sur divers forums et "re-re-tripoté" mon code ,mais bon, rien y fait.

Pour l’instant j’ai un code comme celui-ci, mais qui bien sûr ne marche pas ca il a de nombreuses fautes, j'en suis conscient:

Dim MOTIF As New VBScript_RegExp_55.RegExp
MOTIF.Pattern = "CA [0-9]{0,2}"
MOTIF.IgnoreCase = False
Dim Match As VBScript_RegExp_55.Match
Dim Matches As VBScript_RegExp_55.MatchCollection
Dim VALEUR_MOTIF As string

Do While Range("A" & STR_INDICE) <> ""
VALEUR_CASE = Range("AA" & STR_INDICE)
VALEUR_MOTIF = Range("E" & STR_INDICE)

If Range("AA" & STR_INDICE) <> "" Then
If VALEUR_MOTIF = True Then STR_COMPTEUR= STR_COMPTEUR + 1
End If STR_COMPTEUR= STR_COMPTEUR + 1
End If
Loop


Si vous pouviez m’aider ou me corriger, j’en serais ravi.
Je précise que je suis en stage en entreprise du Lundi au Mercredi et que je ne pourrais pas tester entre ses jours-là, vos réponses.

Staco
 

david84

XLDnaute Barbatruc
Re : Tri, calculs, et expressions régulières

Bonjour et bienvenu sur le forum,

comme c'est ton 2ème message, je te conseille de prendre rapidement la bonne habitude de joindre un petit fichier exemple exposant clairement ta demande avec les explications adéquates et au besoin en notant manuellement le résultat attendu.

Ce fichier nous aidera à tester tes codes et à te proposer une solution.
Cela nous permettra également dans le cas présent de voir si l'utilisation d'une expression rationnelle est la plus appropriée.

Le RegExp est un outil très puissant mais il n'est quelquefois pas besoin de sortir la grosse artillerie alors que l'utilisation de Like (par exemple) pourrait suffire.
Concernant ton code, il comporte effectivement des défauts, notamment de déclaration de variables et de structure.

Ci-joint une adaptation sans être pour le moins sûr que cela soit correct (pas de test puisque pas de fichier).
De plus, comme je ne comprends pas exactement à quoi cela te sert, je navigue à vue.
Certaines déclarations de variables ont été faites au jugé et devront être ajustées voire modifiées :
Code:
Sub test()
Dim MOTIF As VBScript_RegExp_55.RegExp
Dim Match As VBScript_RegExp_55.Match
Dim Matches As VBScript_RegExp_55.MatchCollection
Dim VALEUR_MOTIF As Variant
Dim STR_INDICE As Long
Dim VALEUR_CASE As Variant
Dim STR_COMPTEUR As String

Set MOTIF = New VBScript_RegExp_55.RegExp

MOTIF.Pattern = "CA [0-9]{0,2}"
MOTIF.IgnoreCase = False

Do While Range("A" & STR_INDICE) <> ""
    VALEUR_CASE = Range("AA" & STR_INDICE)
    VALEUR_MOTIF = Range("E" & STR_INDICE)
    
    If Range("AA" & STR_INDICE) <> "" Then
        If VALEUR_MOTIF = True Then STR_COMPTEUR = STR_COMPTEUR + 1
    Else
        STR_COMPTEUR = STR_COMPTEUR + 1
    End If
Loop
End Sub

Concernant le motif que tu utilises, il teste les chaînes de caractères contenant "CA" suivi d'une espace suivi de 0 à 2 chiffres allant de 0 à 9. Est-ce ce que tu veux ?

Sans fichier, je ne peux pas t'aider plus.
A+
 

Staco

XLDnaute Nouveau
Re : Tri, calculs, et expressions régulières

Bonsoir

Merçi pour la rapidité de la réponse.

Je suis conscient que le RegExp est assez lourd, et que mes explications ne sont pas claires.

Le fichier sert à synthétisé des résultat d'analyse. La colonne Y comprends les résultats d'une analyse particulière, la colonne E le motif de cette analyse. Mais toute les analyses ne sont pas faites pour les mêmes raisons. Or les laborantins ayant mis au point un système bien à eux pour coder les raisons des analyses, on retrouve des contre-analyse codé ainsi: CA, Ca01, CA02, etc... ... et bien sur, il n'y a pas que des contre-analyses d'une part et il ont la capacité étrange de pondre des nouveaux codes quand ils le souhaitent ( mais à priori ils n'ont pas encore l'envie de mettre un troisième chiffre).

Pour compliquer la tâche, les laborantins ne remplissent pas toujours toutes les lignes de la colonne Y ( ni celle de la colonne Y, d'ailleurs). Mais toujours la colonne A ( qui contient juste une indication géographique). Je me sers donc de la colonne A pour pouvoir parcourir mon tableau jusqu'à la dernière ligne contenant des informations

Il me parait nécessaire pour pouvoir faire mes calculs et par la suite graphiques de passer soit par une fonction LIKE soit par un RegExp.

Le fichier dans lequel les laborantins donnent les résultat de leur analyses, comptait à la mi-mars, 1700 lignes alors qu'il n'a été commencé que le premier Janvier.
Il me paraissait donc pertinent d'utiliser un RegExp., en affectant une macro par bouton dans le tableau des données afin que la synthèse se portent sur les éléments recherchés seulement d'une part et d'autre part pour pouvoir rajouter un éventuel motif au cours de l'année sans tout modifier.

Dans un premier temps, je veux donc pouvoir parcourir mon tableau sans manquer des valeur ( -> boucle while sur la colonne A) et lorsque je rencontre une valeur dans la colonne Y qui corresponde à une contre-analyse ( Ca, CA01, etc) incrémenter mon compteur de 1, afin compter dans un premier temps le nombre de valeur présente dans la colonne Y.

En espérant être plus clair.
Ceci étant dit je viens de voir que j'ai fais une belle boulette en recopiant mon code: j'ai rajouter un compteur=compteur +1 en trop !

Les variables VALEUR_CASE et VALEUR_MOTIF peuvent être supprimées, je les avait créer dans le but de comprendre comment fonctionne le RegExp.

Oui, je veux qu'il test les chaine de caractère contenant CA et un ou deux chiffre allant de 1 à 9.

Je joins un fichier correspondant à ce que je cherche à faire faire à la macro, j'ai simplifié au maximum le fichier. Je précise que je ne bute pas sur les calculs, mais sur l’extraction des données et leurs utilisations/transformations en fonction du tri.

Merçi de votre patience et de votre aide



Staco
 

Pièces jointes

  • Calcul.xls
    34.5 KB · Affichages: 54
  • Calcul.xls
    34.5 KB · Affichages: 56
  • Calcul.xls
    34.5 KB · Affichages: 61
Dernière édition:

david84

XLDnaute Barbatruc
Re : Tri, calculs, et expressions régulières

Re

Tes explications ne me permettent pas de cerner tes attentes :
La colonne Y comprends les résultats d'une analyse particulière, la colonne E le motif de cette analyse
Je ne vois rien dans ces 2 colonnes...
Oui, je veux qu'il test les chaine de caractère contenant CA et un ou deux chiffre allant de 1 à 9
relis bien ce que je t'ai dit sur ce motif dans mon message précédent : si c'est ce que tu recherches, alors il te faudra enlever l'espace (mais pas sûr qu'il y ait besoin de passer par un RegExp, mais tant que je ne suis pas sûr d'avoir compris...).

Il me paraissait donc pertinent d'utiliser un RegExp., en affectant une macro par bouton dans le tableau des données afin que la synthèse se portent sur les éléments recherchés seulement d'une part et d'autre part pour pouvoir rajouter un éventuel motif au cours de l'année sans tout modifier.
Pas compris. Je préfère que tu fasses comme je te l'ai proposé : place un petit fichier exemple qui présente tes données départ, et note manuellement à côté ou sur une autre feuille les résultats attendus avec les explications si nécessaire.
A+
 

Staco

XLDnaute Nouveau
Re : Tri, calculs, et expressions régulières

Bonsoir,

Je vais recommencer mon explication: le motif de l'analyse est simplement la raison pour laquelle elle est faite: une contre-analyse, une analyse normale, etc

J'ai créé rapidement le fichier que j'ai posté, en déplaçant les colonnes. J'aurais du précisé que je les avais déplacé et que j'avais recentré la macro et le fichier sur le problème. A cela plusieurs raison: le fichier original doit faire dans dans les 5 ou 6 Mo, et que ensuite il comporte de très nombreuses colonnes. J'ai donc uploader un fichier plus petit et cernant le problème. Mea culpa, j'aurais du fournir plus d'explications quand je l'ai joint à mon précédent post.

Du coup dans le fichier que j'ai mis en ligne, je désire trouver les valeurs minis et maxis de la colonne de droite, en fonction des valeurs de la colonne du centre, et en m'appuyant sur la colonne de gauche pour être certain de ne pas sauté une valeur dans la colonne de droite.

ce qui fait que normalement j'aurais sur l'onglet calculs:
en B2, la valeur 21,
en B3, La valeur 19 correspondant à la somme des valeurs en motif AS ( soit AS, AS01,...), et inférieur à 1000,
en B4, la valeur 1,
en B6, la valeur 2500,
en B7, la valeur 3500,
en C2, la valeur 3 ( il y a 3 valeur ayant un motif ca**)
en C3, la valeur 3 en c6 la valeur 99

Bon après je n'ai rien mis dans les cases G10 à G14 pour montrer que parfois il n'y a pas de valeurs mais ça n'aide pas à la clarté.

En espérant que mon explication sur le but de ma macro devient plus clair et en te remerciant pour le temps passer sur mon problème.

Staco
 

david84

XLDnaute Barbatruc
Re : Tri, calculs, et expressions régulières

Re

Ce que tu veux obtenir me semble jouable avec des formules (cf.fichier).
Si tu préfères en VBA, cela est faisable mais vérifie tout de même les résultats et dis-moi si c'est ce que tu attends.
Si certains résultats ne sont pas bons, indique le bon résultat et explique plus précisément pourquoi on doit obtenir celui-ci.
A+
 

Pièces jointes

  • Staco.xls
    36 KB · Affichages: 58
  • Staco.xls
    36 KB · Affichages: 62
  • Staco.xls
    36 KB · Affichages: 55

Staco

XLDnaute Nouveau
Re : Tri, calculs, et expressions régulières

Bonsoir,

Les Réponses sont bonnes sauf la C3 qui dans le cas présent devrait donner 3.
Et je préfère effectivement le faire en VBA. Le fichier étant destiné à être utilisé par des utilisateurs parfois malencontreux. Mais si je vais étudié les formules comme il ce doit !

Merci

Staco
 

Staco

XLDnaute Nouveau
Re : Tri, calculs, et expressions régulières

Bonjour

J'ai tésté le fichier il marche. Cependant j'ai une ou deux petites questions.
Lors de l'utilisationde la formule ESTNUM, vous utilisé le signe * entre deux tableau, pourquoi? car le resultat de la fonction CHERCHE n'est pas une valeur numérique, non ?

Par contre, je doit aussi couplercette première recherche avec les étapes qui sont noté f ou dl dans la colonne E du feuillet "Tableau". Je joint un fichier avec les modifications recherchée et les résultats désiré;

De même une autre question me taraude l'esprit. Les calculs ne s'effectuent pas toujours sur le même nombre de ligne. N'y aurait-il pas un moyen d'être sûr de prendre toutes les lignes ? Car dans le cas présent, si je rajoute une ligne dans le feuillet "Tableau", il va falloir modifié toutes les formules.

Merci

Staco
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Tri, calculs, et expressions régulières

Re
Lors de l'utilisationde la formule ESTNUM, vous utilisé le signe * entre deux tableau, pourquoi? car le resultat de la fonction CHERCHE n'est pas une valeur numérique, non ?
Cela n'a rien à voir : le signe "*" dans un calcul matriciel veut dire "et". L'utilisation du "*" permet donc de cumuler les conditions.
Par contre, je doit aussi coupler cette première recherche avec les étapes qui sont noté f ou dl dans la colonne E du feuillet "Tableau". Je joint un fichier avec les modifications recherchée et les résultats désiré;
Il te suffit donc d'ajouter cette condition dans les formules. Ainsi, pour le cas Ca* + F, la formule devient donc :
Code:
=NB(SI((ESTNUM(CHERCHE(C1;Tableau!$D$4:$D$32)))*(Tableau!$E$4:$E$32="f")*(Tableau!$G$4:$G$32<>"");Tableau!$G$4:$G$32))
Je te laisse adapter pour les autres formules.
De même une autre question me taraude l'esprit. Les calculs ne s'effectuent pas toujours sur le même nombre de ligne. N'y aurait-il pas un moyen d'être sûr de prendre toutes les lignes ? Car dans le cas présent, si je rajoute une ligne dans le feuillet "Tableau", il va falloir modifié toutes les formules.
Pour pallier cela, nommer tes plages en utilisant la fonction DECALER afin de rendre tes plages dynamiques.
L'ajout de nouvelles lignes seront automatiquement prises en compte et tu n'auras pas besoin de retoucher les formules.
Regarde ici sur le site de JB pour voir comment t'y prendre.
Si tu bloques, reviens avec tes questions pour que nous puissions t'aider.
A+
 
Dernière édition:

Discussions similaires

Réponses
2
Affichages
129
Réponses
5
Affichages
124

Statistiques des forums

Discussions
311 712
Messages
2 081 802
Membres
101 819
dernier inscrit
lukumubarth