Macro de redistibution et macro de matrice

Résolu/Fermé
Sieg - 10 févr. 2014 à 12:29
 Sieg - 11 févr. 2014 à 15:56
Bonjour à toutes et tous,

Comme le titre le laisse suggérer j'ai besoin d'aide pour la création de deux macros, toute deux pour simplifier une solution trouver a l'aide des formules et de copier-coller qui atteignent leurs limites.

Pour ce qui est de la macro de redistribution :
Je dois tout d'abord trouver toutes les valeurs uniques d'une plage de données et les renvoyer vers la premiere ligne du tableau, sachant que d'une colonne a l'autre les valeurs sont dans l'ordre croisant j'ai donc trouver comme solution d'utiliser en tete de chaque colonne la formule MIN(nombre1;nombre2;...) c'est assez efficace mais si il y a moyen de faire mieux je suis preneur ^^.
Ensuite, et c'est la que ca se complique, je dois comparer chaque valeur de chaque colonne du tableau aux valeurs de la première ligne et renvoyer chacune des valeurs dans la colonne correspondantes (dans un autres tableau sur la même page ou mieux en page 2), je m'en suis sortie t'en bien que mal avec une formule conditionnelle "si" avec de multiples arguments mais la encore ca a des limites ...

Pour rendre ca plus clair voici un exemple :
http://cjoint.com/?DBkmAmDCPVw



Pour la macro de matrice :
A partir du tableau obtenu précédemment je dois remplacer chaque valeur du tableau par des 0 ; 1 ou 2 .
Si dans une ligne on trouve deux valeurs mettre des 1 a la place de chaque valeur, si on ne trouve qu'une valeur mettre un 2 et la ou il n'y a aucune valeur mettre des 0.

Même exemple que précédemment mais en page trois pour le rendu final que j'attends.



Un grand merci à celles et ceux qui pourront m'aider, pas trop de souci en ce qui concerne excel et ses formules par contre je dois avouer que le VBA reste un grand mystère pour moi ...

Bonne journée !!

Sieg.





A voir également:

7 réponses

Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
10 févr. 2014 à 13:35
Bonjour,

Grâce aux formules, je vois à peu près ce que tu fais, mais je ne comprends pas :
- les données d'origine : c'est impossible qu'il y ait une grande variété de nombres dans ta colonne B (d'en-tête "A") ; ex : 232 ; 233 ; 234 ; 235 ? Ceci
- pourquoi dans l'onglet Résultats "235" reste en B7 et n'est pas basculé vers C7.

A+
0
Salut,

D'abord merci d'avoir pris le temps de regarder un peu la situation !! pour répondre a tes questions :

235 doit en effet basculer en C7, je l'ai fait en manuel c'est juste un oubli de ma part désolé.
Dans chacune des colonnes il ne peut y avoir que les nombres situés dans la première ligne (celle qui classe par ordre croissant l'ensemble des valeurs uniques de mon tableau)
par exemple en colonne B (en tete A) on ne peut trouver que : 232 ; 235 ; 241 ; 243 ; 245 ; 247 ... De même en colonne C D E F et G.

Il faut "juste" remettre chaque nombre dans la colonne qui lui est propre

A+
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
10 févr. 2014 à 14:57
Tes données sont toujours sur 6 colonnes ou c'est variable ?
0
C'est variable mais je dois pouvoir faire les modifs moi même si il s'agit juste d'agrandir les range
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
10 févr. 2014 à 17:03
J'aime assez les formules... donc je les ai réutilisées assez abondamment dans https://www.cjoint.com/?DBkq6Oq1ljF
mais plus besoin de copier-coller.
La macro que j'ai ajoutée permet juste de trier les 6 valeurs (d'ailleurs je me suis basé sur un nombre de colonnes fixe avant que répondes à 16:57...).
Tu peux donc désormais avoir un 232 qui traîne à droite sans que ça gêne.
Mais plusieurs fois le même nombre sur une ligne risque de semer le bazar.

A+
0
Merci de ton aide !!

C'est un peu vers quoi je m'étais dirigés avec l'utilisation de formule mais je voudrais tout de même savoir si il est possible de faire la même chose par macro, n'étant pas le seul utilisateur ca me semble plus simple de détecté une erreur d'entrée de donnée par macro que par formule (comme 3valeurs dans une ligne)
Inclure un renvoie vers d'autres onglets pourrait etre sympa aussi et vu qu'au final les données vont servir dans un autre logiciel qui supporte mal les données autres que numérique (issus de formule quoi ^^) ca m'éviterais le collage spécial valeur !!

merci encore. A +
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
10 févr. 2014 à 17:57
Tu peux fournir un exemple réel de données brutes à traiter ?
ça peut jouer sur les boucles For ou While

A+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Voila le lien des données brutes (enfin juste ouvert et réenregistré en excel, les données brutes étant un fichier texte) :

http://cjoint.com/?DBksF5joOEW

Les mêmes que précédemment sans la première ligne en fait, les "Valeur 1; Valeur 2; etc " pouvant varier jusqu'à 20 à l'heure actuelle, les nombres dans les colonnes "Valeur" pouvant varié entre 87 et 339 actuellement mais jamais dans la même série de donnée ... dans une même série il faut compter maximum 80 de décalage entre la valeur la plus faible et celle la plus élevée ... Enfin en terme de nombre de ligne je varie entre 11 (j'ai pris l'exemple le plus condensé) et 581 (la encore pour l'instant)

J'espère avoir été clair dans les variations possibles du fichier si besoin je suis dispo pendant encore une grosse heure sinon plutot demain.

Merci !!
0
ccm81 Messages postés 10855 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 avril 2024 2 404
10 févr. 2014 à 19:12
Bonjour à tous

Une proposition
https://www.cjoint.com/?3Bktml4JpsW

Cdlmnt
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
11 févr. 2014 à 09:34
Bonjour à tous,

ccm81, c'est très joli !
Sieg, est-ce suffisant ou faut-il encore les 0-1-2 ?

A+
0
Bonjour à tous,

Désolé pour ce décalage entre vos réponses et les miennes mais surtout un grand merci pour cette macro qui fait très exactement ce que j'attends d'elle !!! Oui la conversion des données en 0 1 2 est toujours d'actualité si ce n'est pas trop demander ^^ !!
J'apprécie le détail de chaque partie de la macro ca va me permettre de m'y plonger et peut-etre d'en apprendre un peu plus sur le sujet !!

Encore une fois un grand merci et si l'idée vous vient pour la conversion je suis preneur bien évidemment !!

A +
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
11 févr. 2014 à 12:23
Re,

Avec les 1 et 2 :
https://www.cjoint.com/?DBlmwPcVWXP

A+
0
Merci bien pour cette macro, je vais chercher un petit moment pour remplacer les cellules vides par des zéros, si je trouve pas de solutions je reviendrais vers vous une derniere fois !!

Un grand merci !!
0
ccm81 Messages postés 10855 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 avril 2024 2 404
Modifié par ccm81 le 11/02/2014 à 14:06
Bonjour

Merci à Zoul67 d'avoir pris le relai

Pour remplacer les cellules vides (feuille FR3 des 0-1-2) par des zéros, tu ajoutes juste avant le end final de la procedure OK

' mettre des 0 dans cellules vides
Set plagev = Sheets(FR2).Cells(lidebval, codebval).Resize(nbli, nbv)
For Each c In plagev
  If c.Value = "" Then c.Value = 0
Next c

Bon après midi
0
Merci bien,

J'étais parti sur quelque chose du genre mais plutôt avec ce type de présentation :
Set plagev = Sheets(FR2).Range(PV1)
For Each c In plagev
If c.Value = "" Then
c.Value = 0
Next c

En redéfinissant PV1 en tant que constante au tout début (option explicit), problème je comprend pas du tout comment définir une constante de la même maniere que celle-ci :
Const PV = "plageval"

Enfin plus exactement j'ai pas compris comment tu renvois :
plageval =DECALER(Données!$B$3;0;0;MAX(Données!$A:$A);NBVAL(Données!$2:$2))
pour définir la constante PV ...

Merci de m'éclairer car ca m'intrigue fortement ^^ !!!

En tout cas tout marche comme je le voulais donc un grand merci à vous deux !!!
0
ccm81 Messages postés 10855 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 29 avril 2024 2 404
11 févr. 2014 à 15:33
1. plageval est le nom de la plage-matrice dans la feuille Données, cette plage est définie de façon dynamique par DECALER(Données!$B$3;0;0;MAX(Données!$A:$A);NBVAL(Données!$2:$2))
Est ce cette définition qui te pose un problème?

2. l'instruction Const PV = "plageval"
attribue à la constante PV la chaine de caractère "plageval" (et non la plage elle même), j'ai mis PV pour avoir un identificateur parlant et peu encombrant
c'est l'instruction Set plagev = Sheets(FD).Range(PV) qui attribue la plage de nom PV de la feuille FD à la variable (de type range) plagev
Ces constantes sont utilisées pour éviter de toucher au code de la procédure si les noms attribués dans la feuille changent, il suffira alors de modifier les valeurs de ces constantes en début de module. En plus étant déclarées en dehors de toute procédure elles seront utilisables dans tout le module (ou dans tout le classeur si on les fait précéder de la directive Public)

Si je ne suis pas clair, tu dis

Cdlmnt
0
Non non c'est parfaitement clair !!!
Je ne connaissais pas du tout cette fonctionnalité de excel de définir pour un nom donné une "fonction", c'est trèsssssssssss interessant et ca va m'aider pour pas mal d'autres projets !!!

Et effectivement si je définis :
plageval1 par =DECALER('FR2'!$B$3;0;0;MAX('FR2'!$A:$A);NBVAL('FR2'!$2:$2)) puis que je remplace le dernier bout de code :
Set plagev = Sheets(FR2).Cells(lidebval, codebval).Resize(nbli, nbv)
For Each c In plagev
If c.Value = "" Then c.Value = 0
Next c

par :
Set plagev = Sheets(FR2).Range(PV1)
For Each c In plagev
If c.Value = "" Then c.Value = 0
Next c

en définissant : Const PV1 = "plageval1"

Alors ca fonctionne !!!

Bref au final tout fonctionne comme je le souhaite, j'ai appris pas mal de truc donc c'est une bonne journée ^^

Encore merci à vous deux !!!

Je laisse encore un peu en non résolu si vous avez des dernières remarques (je crois qu'en résolution il n'est plus possible d'intervenir)
0