Macro VBA plus grande valeur

Re-Bonjour à tous,

J'ai un fichier avec environ 200 onglets (exemple d'onglet dans le fichier joint).

Avec la macro ci dessous, j'affecte un "ok" dans la colonne E lorsqu'il y a un A ou un B dans la colonne D et qu'une valeur est dans la colonne F, pour chaque onglet.

Maintenant, j'aimerais compléter la macro avec une fonction supplémentaire. J'aimerais qu'après avoir mis un "ok" en face des A et des B, un "ok" soit affecté en face de la plus grande valeur en F, et ce jusqu'à ce que j'ai 10 "ok". De plus, si la plus grande valeur apparaît 2 fois (ou plus), et qu'il n'y a plus qu'un seul champ possible (parce que déjà 9 "ok"), je voudrais qu'il me prenne la première qu'il rencontre (en partant du haut du tableau) et pas la suivante puisque déjà 10 "ok".

J'espère être claire, si ce n'est pas le cas n'hésitez pas à me le dire.

Est-ce possible ? je n'ai aucune idée de comment m'y prendre.

Sub AB()
    Dim Ws As Worksheet
    Dim j As Long
    Application.ScreenUpdating = False
    For Each Ws In ActiveWorkbook.Worksheets
        If Ws.Name <> "MENU" Then
            For j = 11 To Ws.Range("D" & Rows.Count).End(xlUp).Row
                Ws.Range("E" & j).ClearContents
                If UCase(Ws.Range("D" & j)) Like "*A*" And Ws.Range("F" & j) <> "" Then
                    Ws.Range("E" & j) = "ok"
                End If
                If UCase(Ws.Range("D" & j)) Like "*B*" And Ws.Range("F" & j) <> "" Then
                    Ws.Range("E" & j) = "ok"
                End If
            Next j
            Ws.Range("D6") = WorksheetFunction.CountIf(Ws.Columns("E:E"), "ok")
        End If
    Next Ws
End Sub

Merci d'avance à tous ceux qui m'aideront

19test.xlsx (8.73 Ko)

Salut,

Je te propose une solution par rapport à ce que j'ai pu comprendre. Le résultat - après avoir lancé la macro bien entendu - est dans la colonne G.

J'en ai profité pour te montrer une simplification de ta macro.

Cordialement.

47test-v1.xlsm (21.34 Ko)

Bonjour,

Tu peux remplacer ces instructions conditionnelles :

                If UCase(Ws.Range("D" & j)) Like "*A*" And Ws.Range("F" & j) <> "" Then
                    Ws.Range("E" & j) = "ok"
                End If
                If UCase(Ws.Range("D" & j)) Like "*B*" And Ws.Range("F" & j) <> "" Then
                    Ws.Range("E" & j) = "ok"
                End If

par une seule :

                If UCase(Ws.Range("D" & j)) Like "*[AB]*" And Ws.Range("F" & j) <> "" Then
                    Ws.Range("E" & j) = "ok"
                End If

(Cf. aide sur l'opérateur Like)

Cordialement.

Salut Jowil, Salut MFerrand,

Sur la base de l'idée de MFerrand, j'ai encore simplifié mon code. Mais bon, plus de beaucoup

NB : la macro peut être déclenchée par le bouton mis en place sur la feuille ''Menu''.

Amicalement.

28test-v2.xlsm (21.43 Ko)

Merci à tous les deux !

Mon problème est presque terminé, le dernier soucis est que parfois j'ai un chiffre en colonne F mais rien en colonne D, du coup ceux-là ne sont pas comptés.

En fait je voudrais que tous les A et B soient comptés (ils ont toujours quelque chose en F) et après qu'il prenne juste ce qui est en colonne F, peu importe que D soit rempli ou non.

Est-ce possible ?

Merci d'avance!

De quoi parles-tu ? Des "ok" qui sont placés dans la colonne E ? Des "ok" qui sont placés dans la colonne G ? Lorsque tu dis « je voudrais qu’ils soient comptés » c’est très vague !!

Peux-tu simuler une feuille sur laquelle tu indiques le résultat attendu par rapport à une situation de base ? Si tu indiques en noir les textes de base et en rouge les résultats attendus, je m’en sortirai mieux.

Chaleureusement.

Pardon c'était pas très clair.

J'ai joint le fichier, avec une ligne en jaune dans l'onglet feuil1. Sur cette ligne, il n'y a pas de lettre dans la colonne D, et pour autant il est la valeur maximale après avoir sélectionné les "A" et les "B" (en mettant un ok dans la colonne E). Je voudrais donc qu'il mette aussi un "ok" en face.

En fait je crois que je n'ai pas été très claire sur ce je voulais. En fait, je voudrais que dans chaque onglet, j'ai 10 résultats avec un "ok" dont :

  • les A
  • les B
et en finissant par le nombre qu'il faut pour avoir 10 résultats maximum, en sélectionnant dans l'ordre, du plus élevé au plus faible. Mais il n'y aura pas forcément quelque chose en colonne D.

Quand je lance la macro, je me rends compte que ce n'est pas cela que ça fait, mais juste que ça identifie les valeurs les plus élevées. Dans l'onglet Feuil1(2) j'ai mis en jaune ceux pour lesquels je voudrais qu'il m'affiche aussi un "ok", qui ne sont ni A, ni B, mais les valeurs les plus élevées jusqu'à ce que j'en ai 10 de sélectionnées (dont les A et les B) en partant du haut du tableau.

Est-ce que c'est plus clair ?

18test-v2.xlsm (18.81 Ko)
jowil a écrit :

Est-ce que c'est plus clair ?

Non, pas vraiment

Tu ne fais pas référence aux objets Excel (tels que cellules, plages de cellules, colonnes, etc.) et ce n’est pas évident de te suivre.

Yvouille a écrit :

Peux-tu simuler une feuille sur laquelle tu indiques le résultat attendu par rapport à une situation de base ? Si tu indiques en noir les textes de base et en rouge les résultats attendus, je m’en sortirai mieux.

Pourquoi ne fais-tu pas ce que je te propose dans le but de m’aider à t’aider ?

Si tu penses que pour montrer 2 ou 3 situations possibles tu dois simuler 2 ou 3 feuilles, pourquoi ne pas simuler ces 2 ou 3 feuilles montrant les résultats attendus ?

A te relire.

Bon ok, je reprends du début. En pièce jointe un fichier avec un onglet avant le lancement de la macro, et un après le lancement de la macro.

J'ai un tableau de 3 colonnes qui commence en colonne D, jusqu'à F.

Dans la colonne D, j'ai une lettre (ou la cellule peut être vide). La colonne E est vide pour le moment, et la colonne F contient des résultats.

Le but de ma macro, serait d'écrire un "ok" dans la colonne E en face de 10 lignes :

  • tous les A
  • tous les B
  • et enfin pour compléter mes 10 lignes, les meilleurs résultats parmi les restants.
Par exemple, dans mon fichier, j'ai 2 A et 3 B. Je veux donc qu'après avoir mis un "ok" en face des A et B en colonne E, la macro écrive un "ok" en colonne E en face des 5 meilleurs résultats restants. S'il y avait 2 A et 2 B, il faudrait que ce soit les 6 meilleurs résultats restants. Il ne pourra jamais y avoir 10 ou + résultats étiquetés en A ou en B (combinés). Par contre, il peut y avoir moins de 10 résultats au total pour un onglet. Dans ce cas, il faudrait que la macro s'arrête au nombre de résultats présents.

En fait, le but est de sélectionner les 10 meilleurs résultats (sur chaque onglet), sachant que les A et B comptent obligatoirement dans les 10 résultats, même s'ils ne sont pas dans les meilleurs.

Est-ce plus clair ? Je ne sais pas comment je pourrai l'expliquer mieux. Mais je ne sais pas du tout comment m'y prendre, ni c'est réellement réalisable facilement.

Merci d'avance !

12test-v3.xlsm (16.78 Ko)
jowil a écrit :

Bon ok, je reprends du début

Il est absolument inutile de reprendre depuis le début. Il y a une quantité de choses que tu es déjà arrivées à expliquer et que j’ai comprises. Concentre-toi sur les explications complémentaires que je te demande, plutôt que de me fournir des explications inutiles.
jowil a écrit :

J'ai un tableau de 3 colonnes qui commence en colonne D, jusqu'à F.

Par exemple lorsque tu me donnes cette explication, je ne sais pas si tu te moques de moi ou si tu me prends pour un demeuré.

Dans le fichier ci-joint, j’ai réuni des feuilles que tu m’as fournies à différents moments.

Dans la feuille ‘’APRES’’, tu as mis 10 ok dans la colonne E. Selon moi tu n’as pas vu qu’il y avait le chiffre 10 dans la cellule F19 et tu as pris des valeurs 9 comme xème plus hautes valeurs. Admettons qu’en F19 il y ait un 1 à la place du 10, j’ai compris que tu veux dix valeurs ‘’ok’’ au minimum et que s’il n’y a pas 10 valeurs entre les lignes marquées A ou B dans la colonne D, tu vas chercher les valeurs suivantes ; d’abord les valeurs les plus élevées. Pour les ex aequo, j’ai bien compris de prendre en premier les valeurs dans le haut du tableau.

Sur la ‘’Feuil1’’, il y a 5 lignes avec des A et des B et tu indiques qu’il faut marquer la ligne 21 en plus. Moi j’avais proposé d’indiquer des ok dans la colonne G, mais maintenant j’ai compris – bien que tu n’aies pas daigné me fournir les feuilles exemples demandées - que tu ne veux jamais rien dans cette colonne. Mais si on place un ‘’ok’’ de plus en E21 – puisque j’ai compris que c’est pour cela que tu as marqué cette ligne en jaune – il n’y aura que 6 ‘’ok’’ dans la colonne E. Pourquoi, par rapport à cet exemple, ne pas aller chercher plus de valeur jusqu’à avoir 10 ‘’ok’’ en colonne E ??

Sur la ‘’ Feuil1 (2)’’, j’avais simulé 10 lignes avec des A et des B et il y avait donc déjà plus de 10 ‘’ok’’ dans la colonne E. Pourquoi marques-tu alors en plus les cellules F13, F18, F22 et F25 en plus ?? Si la macro place des ‘’ok’’ pour ces 4 lignes en plus dans la colonne E, ça fera 17 ‘’ok’’ !!!! Et bien entendu que j’ai compris que tu ne voulais rien en colonne G.

L’idéal serait que tu me fournisses au minimum les 3 exemples ci-dessus avec des ‘’ok’’ en rouge à l’endroit où tu les désires et que tu m’indiques éventuellement en plus dans la colonne H par exemple la raison de tel ou tel ‘’ok’’. Mais avant de le faire, corrige la cellule F19 de la feuille ‘’APRES’’, efface tous les ‘’ok’’ inutiles des colonnes G et assures-toi que tes exemples tiennent la route.

Cordialement.

17test-v4.xlsm (14.55 Ko)

Excuses-moi si je t'ai offensé, ce n'était absolument pas le but. Je pensais juste plus simple de reprendre dès le début, mais je n'avais visiblement pas compris que ce n'était pas la peine.

Dans la feuille ‘’APRES’’, tu as mis 10 ok dans la colonne E. Selon moi tu n’as pas vu qu’il y avait le chiffre 10 dans la cellule F19 et tu as pris des valeurs 9 comme xème plus hautes valeurs. Admettons qu’en F19 il y ait un 1 à la place du 10, j’ai compris que tu veux dix valeurs ‘’ok’’ au minimum et que s’il n’y a pas 10 valeurs entre les lignes marquées A ou B dans la colonne D, tu vas chercher les valeurs suivantes ; d’abord les valeurs les plus élevées. Pour les ex aequo, j’ai bien compris de prendre en premier les valeurs dans le haut du tableau.

Effectivement ici je n'avais pas vu le 10, désolée pour cette erreur. C'était pour mettre le cas d'une égalité entre deux résultats.

Dans les autres exemples que tu cites, je pense qu'il y a eu un problème de compréhension entre nous, désolée pour ça.

Sur la ‘’Feuil1’’, il y a 5 lignes avec des A et des B et tu indiques qu’il faut marquer la ligne 21 en plus. Moi j’avais proposé d’indiquer des ok dans la colonne G, mais maintenant j’ai compris – bien que tu n’aies pas daigné me fournir les feuilles exemples demandées - que tu ne veux jamais rien dans cette colonne. Mais si on place un ‘’ok’’ de plus en E21 – puisque j’ai compris que c’est pour cela que tu as marqué cette ligne en jaune – il n’y aura que 6 ‘’ok’’ dans la colonne E. Pourquoi, par rapport à cet exemple, ne pas aller chercher plus de valeur jusqu’à avoir 10 ‘’ok’’ en colonne E ??

Ici j'avais surligné cette ligne pour donner exemple de s'il n'y avait rien dans la colonne D mais que le résultat devait tout de même être pris en compte, mais ce n'était pas pour dire qu'il n'y avait qu'elle à prendre.

Sur la ‘’ Feuil1 (2)’’, j’avais simulé 10 lignes avec des A et des B et il y avait donc déjà plus de 10 ‘’ok’’ dans la colonne E. Pourquoi marques-tu alors en plus les cellules F13, F18, F22 et F25 en plus ?? Si la macro place des ‘’ok’’ pour ces 4 lignes en plus dans la colonne E, ça fera 17 ‘’ok’’ !!!! Et bien entendu que j’ai compris que tu ne voulais rien en colonne G.

Je croyais avoir changé les lettres pour qu'il y ait moins de A et de B, mais visiblement je n'ai pas mis le bon fichier et j'en suis désolée. Il ne faut effectivement pas plus de 10 "ok" sur un onglet.

Concernant la colonne G, je n'en ai pas parlé parce que si la seule solution est de le mettre en colonne G je m'adapterai, mais dans l'idéal, et je pense l'avoir dit dès le début, je préférerai que ce soit dans la E.

J'espère que le fichier joint répondra à ce que tu me demandes, et encore désolée si je t'ai offensé, ça n'a jamais été le but, vraiment.

19test-v5.xlsm (15.08 Ko)

Bonsoir,

une proposition

Sub AB()
    Dim Ws As Worksheet
    Dim j As Long
    Application.ScreenUpdating = False
    For Each Ws In ActiveWorkbook.Worksheets
        With Ws
            If .Name <> "MENU" Then
                dl = .Range("D" & Rows.Count).End(xlUp).Row
                .Range("E11:E" & dl).ClearContents
                For j = 11 To .Range("D" & Rows.Count).End(xlUp).Row
                    If .Range("F" & j) <> "" And UCase(Ws.Range("D" & j)) Like "*[AB]*" And .Range("F" & j) <> "" Then
                        .Range("E" & j) = "ok"
                        c = c + 1
                    End If
                Next j
                If c < 10 Then
                    Columns(1).Insert shift:=xlToRight
                    Range("A11") = 1
                    Range("A12") = 2
                    Range("A11:A12").AutoFill Destination:=Range("A11:A" & dl), Type:=xlFillDefault
                    Range("A11:H" & dl).Sort key1:=Range("F11"), order1:=xlDescending, key2:=Range("G11"), order2:=xlDescending, key3:=Range("A1"), order3:=xlAscending, Header:=xlNo
                    For i = 11 + c To 20
                        Cells(i, "F") = "ok"
                        c = c + 1
                    Next i
                     Range("A11:H" & dl).Sort key1:=Range("A11"), order1:=xlAscending, Header:=xlNo
                     Columns(1).Delete shift:=xlToLeft
                End If
                .Range("D6") = c
            End If
        End With
    Next Ws
End Sub

Merci pour ton aide h2so4, mais quand j'execute la macro, cela me met "Variable non définie" en surlignant "dl" de

dl = .Range("D" & Rows.Count).End(xlUp).Row

bonjour, cela signifie que tu as utilisé option explicit et qu'il convient de déclarer toutes les variables utilisées par les macros.

voici l'adaptation

Sub AB()
    Dim Ws As Worksheet
    Dim j As Long,i,c,dl
    Application.ScreenUpdating = False
    For Each Ws In ActiveWorkbook.Worksheets
        With Ws
            If .Name <> "MENU" Then
                dl = .Range("D" & Rows.Count).End(xlUp).Row
                .Range("E11:E" & dl).ClearContents
                For j = 11 To .Range("D" & Rows.Count).End(xlUp).Row
                    If .Range("F" & j) <> "" And UCase(Ws.Range("D" & j)) Like "*[AB]*" And .Range("F" & j) <> "" Then
                        .Range("E" & j) = "ok"
                        c = c + 1
                    End If
                Next j
                If c < 10 Then
                    Columns(1).Insert shift:=xlToRight
                    Range("A11") = 1
                    Range("A12") = 2
                    Range("A11:A12").AutoFill Destination:=Range("A11:A" & dl), Type:=xlFillDefault
                    Range("A11:H" & dl).Sort key1:=Range("F11"), order1:=xlDescending, key2:=Range("G11"), order2:=xlDescending, key3:=Range("A1"), order3:=xlAscending, Header:=xlNo
                    For i = 11 + c To 20
                        Cells(i, "F") = "ok"
                        c = c + 1
                    Next i
                     Range("A11:H" & dl).Sort key1:=Range("A11"), order1:=xlAscending, Header:=xlNo
                     Columns(1).Delete shift:=xlToLeft
                End If
                .Range("D6") = c
            End If
        End With
    Next Ws
End Sub

Re-Bonsoir,

Merci! Mais quand je le lance, ça ne met "ok" qu'en face des A et des B, au final j'en ai pas 10..

Salut h2so4,

Je pense qu’avec les informations nécessaires de la part de jowil, je serais arrivé à trouver moi-même la solution attendue. Mais si tu veux reprendre le sujet, pourquoi ne pas te le laisser.

Comme il y a suffisamment de sujets restés sans réponse, je vais aller en voir un autre.

Bonnes salutations.

Yvouille a écrit :

Salut h2so4,

Je pense qu’avec les informations nécessaires de la part de jowil, je serais arrivé à trouver moi-même la solution attendue. Mais si tu veux reprendre le sujet, pourquoi ne pas te le laisser.

Comme il y a suffisamment de sujets restés sans réponse, je vais aller en voir un autre.

Bonnes salutations.

@ Yvouille,

j'avais cru comprendre qu'il y avait une certaine irritation, de plus ce sujet est dans la continuité d'un autre sujet pour lequel j'avais déjà offert mon aide.

https://forum.excel-pratique.com/post444370.html#p444370

@ jowil,

une nouvelle proposition, la macro ne donnait pas le bon résultat dans le cas de plusieurs onglets.

Sub AB()
    Dim Ws As Worksheet
    Dim j As Long, i, c, dl
    Application.ScreenUpdating = False
    For Each Ws In ActiveWorkbook.Worksheets
        c = 0
        With Ws
            If .Name <> "MENU" Then
                dl = .Range("D" & Rows.Count).End(xlUp).Row
                .Range("E11:E" & dl).ClearContents
                For j = 11 To .Range("D" & Rows.Count).End(xlUp).Row
                    If .Range("F" & j) <> "" And UCase(.Range("D" & j)) Like "*[AB]*" And .Range("F" & j) <> "" Then
                        .Range("E" & j) = "ok"
                        c = c + 1
                    End If
                Next j
                If c < 10 Then
                    .Columns(1).Insert shift:=xlToRight
                    .Range("A11") = 1
                    .Range("A12") = 2
                    .Range("A11:A12").AutoFill Destination:=.Range("A11:A" & dl), Type:=xlFillDefault
                    .Range("A11:H" & dl).Sort key1:=.Range("F11"), order1:=xlDescending, key2:=.Range("G11"), order2:=xlDescending, key3:=.Range("A1"), order3:=xlAscending, Header:=xlNo
                    For i = 11 + c To 20
                        .Cells(i, "F") = "ok"
                        c = c + 1
                    Next i
                     .Range("A11:H" & dl).Sort key1:=.Range("A11"), order1:=xlAscending, Header:=xlNo
                     .Columns(1).Delete shift:=xlToLeft
                End If
                .Range("D6") = c
            End If
        End With
    Next Ws
End Sub
h2so4 a écrit :

@ Yvouille,

j'avais cru comprendre qu'il y avait une certaine irritation,

T'as faux compris

Merci h2so4, mais ça ne semble pas marche sur tous les onglets..

Bonsoir,

voici le code corrigé avec ton fichier test

21test-v5.xlsm (17.95 Ko)
Rechercher des sujets similaires à "macro vba grande valeur"