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
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
J'en ai profité pour te montrer une simplification de ta macro.
Cordialement.
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.
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
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 ?
Non, pas vraimentjowil a écrit :Est-ce que c'est plus clair ?
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.
Pourquoi ne fais-tu pas ce que je te propose dans le but de m’aider à t’aider ?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.
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.
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 !
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 :Bon ok, je reprends du début
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é.jowil a écrit :J'ai un tableau de 3 colonnes qui commence en colonne D, jusqu'à F.
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.
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.
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..