Aller au contenu

[RESOLU] [LOGICIEL] Macro - formule Excel


Carpe_Diem

Messages recommandés

Bonjour,

je cherche la formule qui va bien pour sortir une valeur max d'une ensemble de valeurs comprennant des valeurs Max et Min.

C'est à partir d'un tableau Excel de ce type :

-----------Mois1------Mois2------Mois3-----etc....

--------- Min-Max - Min-Max - Min-Max - etc...

Objet1 - 500-600 - 450-700 - 700-800 - etc...

Objet2

etc...

et je cherche donc à obtenir, par ligne, sur l'ensemble des mois la valeur Max (soit ici 800) et la valeur Min (soit ici 450).

J'ai tenté un "=RECHERCHEH("MAX";B4:G21;2;FAUX)" , mais il ressort toujours la valeur Max de la première colonne (du premier mois).

NB, les colonnes Min et Max sont bien sûr distinctes.

La formule Max sur une ligne ne marche pas à cause d'une 3ème valeur qui peut excéder les valeurs de "Max".... ce serait trop simple.

Une idée ?

Merci de votre aide.

Lien vers le commentaire
Partager sur d’autres sites

arf pas évident, j'aurai même tendance à dire pas faisable avec les fonctions de base d'Excel... m'enfin je ne m'avancerai pas autant et je dirai juste que j'y arrive pas en tout cas^^

Mais je peux te proposer une fonction perso, qui fait (si j'ai bien compris) ce que tu demandes :chinois:

313803Capture.png

le code a coller dans un module:

Function FonctionPerso(rech As String, plage_rech As Range, plage_val As Range)Dim tableauTemp() As DoubleMaxCol_rech = plage_rech.Columns.CountMaxCol_val = plage_val.Columns.CountMaxCol = WorksheetFunction.CountIf(plage_rech, rech)ReDim tableauTemp(MaxCol - 1)MaxLig_rech = plage_rech.Rows.CountMaxLig_val = plage_val.Rows.CountDebCol_rech = plage_rech.ColumnDebCol_val = plage_val.ColumnSelect Case True   Case MaxCol_rech <> MaxCol_val: FonctionPerso = "#VALEUR"   Case DebCol_rech <> DebCol_val: FonctionPerso = "#VALEUR"   Case MaxLig_rech <> 1: FonctionPerso = "#VALEUR"   Case MaxLig_val <> 1: FonctionPerso = "#VALEUR"   Case rech <> "Max" And rech <> "Min": FonctionPerso = "#VALEUR"   Case Else       i = 0       For Each cell In plage_rech           Valeur = cell.Value           Colonne = cell.Column - DebCol_rech + 1           If Valeur = rech Then               tableauTemp(i) = plage_val(1, Colonne)               i = i + 1           End If       Next cell       If rech = "Max" Then FonctionPerso = WorksheetFunction.Max(tableauTemp())       If rech = "Min" Then FonctionPerso = WorksheetFunction.Min(tableauTemp())End SelectEnd Function

Voilà bon je suis pas un expert donc le code est pas forcement au top du top (et pas forcement très propre), j'ai la fâcheuse tendance à m’arrêter quand ça marche^^

J'espère que ça t'aidera, dis moi ce que t'en penses

(j'ai tjs la flemme de commenter des petits morceaux de code comme ca... si t'arrive pas à lire et que tu veux connaitre les détails fais moi signe)

Lien vers le commentaire
Partager sur d’autres sites

Merci à tous les 2.

digital-jedi : il y a en fait une valeur de référence qui est fixe et qui peut dépasser un Max. Par exemple, j'ai vendu l'objet 1 au mois 1 au mini à 300¤ et au maxi à 600¤, mais la valeur de vente de référence pour cet objet est de 1000¤. Voilà pourquoi, la fonction Max sur une ligne ne peut pas fonctionner.

RING3R: :chinois: pour avoir pondu du code (je suis ignare sur le sujet).... mais je ne sais pas comment intégrer ce code dans Excel (2007 et >). Que veux tu dire par "coller dans un module" ?

Lien vers le commentaire
Partager sur d’autres sites

oups désolé j'aurais dû penser à préciser :incline:

donc quand tu a Excel ouvert, tu tape Alt+F11

une fenetre s'ouvre, dans la partie gauche tu verras "VBA Project (nom de ton classeur)" avec en dessous des objects ayant le nom de tes onglets puis un dernier objet "this workbook"

tu clic-droit par là, puis "insertion/module"

une page de texte vierge s'ouvre dans la partie droite, tu peux y coller le code :ouioui:

une fois fait, si tu commence à taper dans une cellule "=fonctionperso" Excel devrait la reconnaître

Lien vers le commentaire
Partager sur d’autres sites

heu ben c'est qu'il doit pas y avoir les bonnes ref..

1er argument = "Min" ou "Max"

2eme = plage de titre "min/max" (pour savoir si le chiffre correspondant est un min ou un max)

3eme = plage des valeurs

un #VALEUR s'affiche normalement dans un des cas suivant: (cf. le "select case")

- la plage de titre et celle de valeur sont de taille (nombre de colonne) différente

- ces deux plages commence à des colonnes différentes (une de A:D et l'autre B:E par ex. donc les deux plages doivent être une en dessous de l'autre pour que ca marche, peut importe le nombre de ligne les séparant)

- une de ces deux plages fait plus d'une ligne

- le 1er argument est autre chose que "min" ou "max"

PS: est-ce que excel reconnait bien la formule? ie. si tu tape "=fonct" est-ce qu'il te propose "FonctionPerso" ??

j'ai reessayé et ca marche bien chez moi en tout cas :craint: (en plus je suis pas sur le même ordi que celui depuis lequel j'ai écrit cette fonction)

PPS: pour tester:

- clic a coté (a gauche) de la 3eme ligne de code ("MaxCol_rech = plage_rech.Columns.Count") pour faire apparaitre un point rouge

- ensuite entre dans la cellule où tu as tapé la formule, puis valide (ou retape la formule)

- si Excel a reconnu la formule, ca devrait te renvoyer dans la page de code, et une ligne devrait être jaune

- appuis sur F8 pour exécuter le code ligne par ligne

- regarde où ca s’arrête

sinon essaye ca (c'est la même chose deja fait)

petit fichier: Classeur1.xlsm

Lien vers le commentaire
Partager sur d’autres sites

Carpe_Diem, le problème est que ton tableau de base est mal fait :)

Je te conseille de prendre des cours sur les tableaux croisés dynamiques. Ca poutre des mamans ours et je peux te garantir que tu te ferais beaucoup moins chier qu'avec des tableaux fait comme ça ;)

A la rigueur, je veux bien prendre du temps pour te l'expliquer, mais tu va vite avoir mal au crane...

MP si jamais tu veux des détails :)

Lien vers le commentaire
Partager sur d’autres sites

Je te remercie de ta proposition Patos.

Au final, c'est ce que j'ai fait : un TCD groupant les "Max" en ligne puis la fonction Max en fin de chaque ligne pour avoir le max des max par objet. Pas très élégant, je vous l'accorde !

Pourquoi un TCD alors que la macro fonctionnait ? On est passé sous Open Office et donc... les macros Excel sont dans le caca. Je n'ai pas cherché à la réécrire car à chaque pas, j'avais un erreur...

Pour le reste, un vrai casse-tête pour obtenir joliment la valeur d'une cellule au croisement ligne/colonne en fonction de la valeur dans la ligne et dans la colonne. "Index + "Equiv" ne fonctionnant pas (la valeur d'ordre d'une colonne, c'est pas pareil que la valeur d'une cellule dans cette colonne et idem pour les lignes), j'ai fini aux "SI" imbriqués (heureusement, on peut en imbriquer + de 7 maintenant).

Je vais chercher à rendre cela + joli et + automatisé.

Merci à tous les 3 pour votre aide.

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...