Créer des conditions avec un seuil

Bonjour,

Je cherche à ramener à partir de l'onglet base, des informations sur l'onglet indicateurs dans les cellules en rose en B14 et c15.

Pour information, En F3 dans onglet indicateur, il y a trois codes GM avec des seuils a 150 000 euros ce qui veut dire que ces codes sont limités a 150 000 euros.

Dans la colonne B6 dans onglet indicateur, il y a écrit trois, ceci correspond aux codes GM>supérieurs ou égaux a 150 000 euros. Il y en a trois.

Mon but est de ramener en B14 , les codes GM qui correspondent aux engagements suprieurs a 150 000 euros et en B15 les ej.

Il s'agit du detail des engagement qui correspond a trois en B6. Il y a trois engagement en B6 pour janvier 2023 (il faut bien mettre la condition de date) et nous cherchons donc a savoir en janvier 2023 les trois engagements et le code GM a cote (sachant qu un code GM peut se repeter).

merci beaucoup

Bonjour,

Essayez ceci:

Cdlt

Bonjour,

Merci pour votre aide, je vais vous solliciter un peu plus si vous avez le temps. j'ai essayé de reproduire votre formule dans l'onglet suivi mensuel en P à R mais ma formule ne marche pas, pourtant j'ai essaye de faire attention au seuil de 40 000 etc. pouvez vous m'aider a la refaire svp et me dire aussi pourquoi cela ne marche pas comme ca je saurai la refaire.

J'ai fait un encadre bleu en t a v pour reproduire cette formule mais avec des conditions en plus. le seuil ne sera plus de 40 000 ni juste lié a un code GM mais le seuil sera soit de 150 000 soit de 500 000 suivant les codes GM (le tableau des seuils est en case Ya Z).

Merci beaucoup pour votre aide

dans le fichier que j'ai envoyé il y a une petite coquille dans ma formule, cela devrait pointer sur la date normalement. j'ai corrigé mais mais cela ne marche pas quand meme

Bonjour,

J'ai oublié de préciser que la 1ère formule pour trouver la ligne est différente des suivantes et elles sont à valider avec CTRL + SHIFT + ENTREE

en R8:

=SIERREUR(EQUIV(1;('base 1'!$I$1:$I$1000=$R$5)*('base 1'!$T$1:$T$1000>=$B$1);0);"")

en R9 et les suivantes;

=SIERREUR(EQUIV(1;(INDIRECT("'base 1'!I"&R8+1&":I1000")=$R$5)*(INDIRECT("'base 1'!T" & R8+1& ":T1000")>=$B$1);0)+R8;"")

Je traiterai la zone en bleue demain (si j'ai bien compris, il faut traiter tous les code GM mis en colonne Y?)

Cdlt

Bonjour,

Voici la version qui traite plusieurs GM et différents seuils, ceci est fait en VBA, vous n'avez plus qu'à cliquer sur le bouton "Trouver GM et EJ"

La version en VBA rend inutile la recherche par formule.

Cdlt

bonjour, merci beaucoup a tout le monde

en Y c est la liste des seuil pour les GM et dans l'encadré bleu il s'agit de faire une formule qui aura comme principe de ramener justement les codes GM par rapport au seuil du tableau en Y

mais je ne comprends aps pourquoi il y a deux formules differentes entre R8 ET R9

j'aimerai savoir faire ces formules pour ramener ces informations mais je n 'arrive aps a les comprendre ni la macro...comment apprendre?

Bonjour,

mais je ne comprends pas pourquoi il y a deux formules différentes entre R8 ET R9, j'aimerai savoir faire ces formules pour ramener ces informations mais je n 'arrive pas a les comprendre ni la macro...comment apprendre?

On devrait pouvoir se passer des formules de la colonne R, et mettre une seule formule pour les colonnes P et Q, cependant ce sera forcément une formule complexe, difficile à analyser. J'avais opté pour une solution, disons plus légère cependant, la première formule sera différente de toutes les autres et en voilà la raison:

La première formule, cherche la première ligne qui réunit les 2 conditions, pour cela, on fait une recherche dans la base en partant de la ligne 1 du tableau de valeurs, on récupère le N° de la ligne trouvée puis, on va chercher si d'autres conditions existent, mais cette fois-ci, on ne part plus de la ligne 1 sinon on va retomber sur la même que précédemment, il faut donc partir depuis la N° de ligne trouvée et, si on trouve une autre ligne avec les conditions réunies, on récupère sa position _ laquelle on ajoute le position précédente, c'est pour cela que les formules suivantes sont différentes de la première.

Pourquoi la macro?

En passant par la macro, on se simplifie la vie et les formules deviennent inutiles. D'autant plus qu'avec les formules, on ne cherchait qu'un seul code avec un seul seuil mais, dès lors qu'il faille chercher plusieurs codes avec des seuils différents cela se complique, et faire cela par formule devient quasiment impossible.

Vous pouvez donc vous passer du tableau orange, il vous suffit de mettre les codes GM et les seuils en colonne Y et Z.

Pour vous aider à comprendre le code, le voici de nouveau avec chaque ligne commentée:

Option Explicit 'oblige à déclarer les variables
Option Compare Text 'Ignore la casse, empêche la distinction entre les majuscules et les minuscules

Sub Trouver_GM_EJ()
    'Déclaration des variables
    Dim f1 As Worksheet, f2 As Worksheet
    Dim DerLig_f1 As Long, DerLig_f2 As Long, Lig_Dest_f2 As Long, Deb As Long, i As Long
    Dim GM As Variant
    Dim Seuil As Currency
    Dim x As Range

    Application.ScreenUpdating = False ' empêche le rafraîchissement de l'écran pendant ke déroulement du code et augmente la vitesse d'exécution
    Set f1 = Sheets("base 1") 'on affecte la variable f1 à la feuille "base 1"
    Set f2 = Sheets(ActiveSheet.Name) 'on affecte la variable f2 à la feuille active
    DerLig_f1 = f1.Range("A" & Rows.Count).End(xlUp).Row 'on cherche la dernière ligne de la feuille "base 1'
    DerLig_f2 = f2.Range("Y1").End(xlDown).Row 'on cherche la dernière ligne de la colonne Y de la feuille active
    f2.Range("T8:V1000").ClearContents 'on efface les précédents résultats
    Lig_Dest_f2 = 8 'première ligne où l'on doit mettre les résultats, c'est la ligne de destination qui recevra les résultats
    For i = 2 To DerLig_f2 'on fait une boucle qui va balayer de la ligne 2 à la dernière ligne de la colonne Y de la feuille active
        GM = f2.Cells(i, "Y") 'on mémorise le code de la ligne testée dans la variable "GM"
        Seuil = f2.Cells(i, "Z") 'on mémorise le seuil de la ligne testée dans la variable "Seuil"
        With f1.Range("I1:I" & DerLig_f1) 'Dans la colonne I de la feuille "base 1"
            Set x = .Find(GM, lookat:=xlWhole) 'on cherche le code GM
            If Not x Is Nothing Then 's'il existe alors:
                Deb = x.Row 'on mémorise sur quelle ligne il se trouve, on l'appelle "Deb" comme "Début"
                Do 'puis, on fait:
                    If f1.Cells(x.Row, "T") >= Seuil Then 'si le seuil en colonne T est supérieur ou égal au seuil mémorisé alors:
                        Range(f2.Cells(Lig_Dest_f2, "T"), f2.Cells(Lig_Dest_f2, "V")) = Array(GM, f1.Cells(x.Row, "T"), x.Row) 'on copie le code , les seuil et la ligne trouvée dans la ligne de destination de la feuille active
                        Lig_Dest_f2 = Lig_Dest_f2 + 1 'on désigne la ligne de destination suivante en ajoutant 1 à sa précédente valeur
                    End If
                    Set x = .FindNext(x) 'on recherche la présence d'un autre code GM
                Loop While Not x Is Nothing And x.Row <> Deb 's'il en existe un autre et qui ne se trouve pas sur la même ligne que le début de la recherche, alors on recommence le cycle, sinon on sort de la boucle
            End If
        End With
    Next i 'on passe au code GM suivant, s'il n'y en a plus, on sort du programme

    'on libère la mémoire
    Set x = Nothing
    Set f1 = Nothing
    Set f2 = Nothing
End Sub

Pour apprendre le VBA, il y a des docs en librairie, il y a internet. Lorsque vous êtes sur la feuille VBA (ALT + F11 pour y accéder) il y a l'aide en ligne; positionnez-vous sur un mot clé(ils sont en bleu) et faites F1.

Et il y a surtout l'enregistreur de macro, qui lui, lorsqu'il est activé, enregistre tout ce que vous faites, ainsi après avoir arrêter l'enregistrement, il peur refaire les mêmes opérations autant de fois que vous le souhaitez. Evidemment, ce n'est pas parfait, puisqu'il se limite à des opérations simples, mais pour comprendre comment cela se passe, c'est déjà pas mal.

Le fichier avec les commentaires inclus dans le code VBA

Cdlt

merci pour les explications mais du coup une formule c est trop long? et faire une formule "SI" avec un index equiv cela n'aurait pas été possible?

Merci de tes explications.

merci pour les explications mais du coup une formule c est trop long et faire une formule "SI" avec un index equiv cela n'aurait pas été possible?
je n'ai pas dit que c'était trop long, mais complexe et les formules que j'ai proposé, fonctionnent déjà avec INDEX et EQUIV.
Pour vous donner une idée, ce serait une formule du genre (en P5) à valider avec CTRL + SHIFT + ENTREE:
=SIERREUR(INDEX('base 1'!$I$1:$T$1000;PETITE.VALEUR(SI((I$1:I$1000=$R$5)*('base 1'!$T$1:T1000>=$B$1);LIGNE(INDIRECT("1:"&LIGNES(I$1:I$1000))));LIGNES($1:1)));"")
et pour Q5 à valider avec CTRL + SHIFT + ENTREE:
=SIERREUR(INDEX('base 1'!$I$1:$T$1000;PETITE.VALEUR(SI((I$1:I$1000=$R$5)*('base 1'!$T$1:T1000>=$B$1);LIGNE(INDIRECT("1:"&LIGNES(Q$1:Q$1000))));LIGNES($1:1)));"")
mais je n'arrive pas à obtenir le résultat souhaité, et comme il faut y passer du temps pour trouver là où ça coince, et au delà d'une certaine complexité dans les formules, je préfère passer par une macro, mais ce n'est que mon avis.

De plus, pour ne rechercher qu'1 seul code avec 1 seul seuil, c'est déjà pas simple alors, s'il faut chercher plusieurs codes avec plusieurs seuils !!!!

Cdlt

merci beaucoup en tout cas

bonjour le fil,

le même resultat avec un TCD

Rechercher des sujets similaires à "creer conditions seuil"