Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Trouver et offset

6 réponses
Avatar
Denys
Bonjour =E0 tous,

Dans la colonne F, et par VBA, je fais inscrire les plus=20
grandes valeurs contenues dans la colonne D (Merci=20
Isabelle). La formule va de suit;

Range("F2").Formula =3D "=3Dlarge(D:D,1)"
Range("F3").Formula =3D "=3Dlarge(D:D,2)"
Range("F4").Formula =3D "=3Dlarge(D:D,3)"
Range("F5").Formula =3D "=3Dlarge(D:D,4)"
Range("F6").Formula =3D "=3Dlarge(D:D,5)"

J'aimerais cependant =E9crire dans la colonne E le nom des=20
compagnies correspondant au montant nouvellement =E9crit=20
dans la colonne F. Le nom de ces compagnies est =E9crit dans=20
la colonne B.=20

Je crois qu'il faudrait d'abord trouver le montant=20
correspondant =E0 la cellule F2 dans le colonne D, et =E9crire=20
le nom de la compagnie correspondant de la colonne B dans=20
la cellule E2.=20

Seulement, j'ai pas id=E9e comment =E9crire cela...

Pourriez-vous m'aider ?

Merci=20

Denys

6 réponses

Avatar
michdenis
Bonjour Denys,

Insère entre chacune de tes lignes de formules ceci :

Range("E2").Formula = "=Index(B:B,Match(F2,D:D,0),1)"

En adaptant bien sûr les adresses.

Salutations!


"Denys" a écrit dans le message de news:e10201c43c16$57c630d0$
Bonjour à tous,

Dans la colonne F, et par VBA, je fais inscrire les plus
grandes valeurs contenues dans la colonne D (Merci
Isabelle). La formule va de suit;

Range("F2").Formula = "=large(D:D,1)"
Range("F3").Formula = "=large(D:D,2)"
Range("F4").Formula = "=large(D:D,3)"
Range("F5").Formula = "=large(D:D,4)"
Range("F6").Formula = "=large(D:D,5)"

J'aimerais cependant écrire dans la colonne E le nom des
compagnies correspondant au montant nouvellement écrit
dans la colonne F. Le nom de ces compagnies est écrit dans
la colonne B.

Je crois qu'il faudrait d'abord trouver le montant
correspondant à la cellule F2 dans le colonne D, et écrire
le nom de la compagnie correspondant de la colonne B dans
la cellule E2.

Seulement, j'ai pas idée comment écrire cela...

Pourriez-vous m'aider ?

Merci

Denys
Avatar
Daniel.M
Denys,

As-tu des doublons?
Est-il possible que 2 compagnies partagent la même valeur?

Salutations,

Daniel M.
Avatar
michdenis
Bonjour Daniel,

la collusion des prix c'est seulement les pétrolières qui savent faire cela !

;-))

Salutations!


"Daniel.M" a écrit dans le message de news:%
Denys,

As-tu des doublons?
Est-il possible que 2 compagnies partagent la même valeur?

Salutations,

Daniel M.
Avatar
Denys
Bonjour Denis et Daniel,

D'abord Denis, merci infiniment, cela fonctionne à
merveille. Tu m'as encore sauvé beaucoup de temps.

Daniel, je fais référence à la macro que tu me proposais
vendredi dernier et avec lequel tes résultats différaient
de ceux d'Isabelle. Voici ta macro:

Sub Macro7()
Dim C As Range, Total As Double
Dim PremCol As Long, PremLigne As Long, Ligne As Long

PremLigne = 2: PremCol = 6: Ligne = PremLigne

For Each C In Range("B2:B" & Range("B65536").End
(xlUp).Row)
If IsNumeric(C) Then
Total = Total + C
Else
Cells(Ligne, PremCol) = C
If Ligne > PremLigne Then
Cells(Ligne - 1, PremCol + 1) = Total
End If
Total = C(1, 2)
Ligne = Ligne + 1
End If
Next C
Cells(Ligne - 1, PremCol + 1) = Total 'inscrit
le dernier total

' C'est terminé! : il ne reste qu'à trier puis enlever
les
' entrées excédentaires.
With Cells(PremLigne, PremCol + 2).Resize(Ligne - 1,
1) '3e col de l'output
.FormulaR1C1 = "=N(ISNUMBER(MATCH(RC[-
2],CIEEXCLURE,0)))"
.Value = .Value
' on tri, avec clé1 la 3e col, clé2 la 2e col
Cells(PremLigne, PremCol).Resize(Ligne - 1,
3).Sort _
Key1:Îlls(PremLigne, PremCol + 2),
Order1:=xlDescending, _
Key2:Îlls(PremLigne, PremCol + 1),
Order2:=xlDescending
.ClearContents ' on détruit la 3e colonne
de l'output
End With

' prendre les 5 premiers : i.e. 2 (de CIEEXCLURE) + 3
PROCHAINS
' donc éliminer les entrées en-dessous
With Cells(PremLigne + 5, PremCol)
Range(.Cells, .End(xlDown)(1, 2)).ClearContents
End With

End Sub

Si je fais un "Copy & Paste" de ce que j'ai .cris sur le
forum, j'obtiens ceci comme résultat:

PQR $3.23 191.27
DEF $12.32 112.28
GHI $7.54 63.14
ABC $5.00 26.5
JKLMN $1.67 25.6

PQR et $3.23 dans la même cellule, soit F2 et 191.27 dans
la cellule G2. Les montants que tu obtenais pour ta part
étaient les bons car ils comprenaient le total des deux.
Sauf que je n'ai encore réussi à les obtenir.

En réalité, les Noms des compagnies n'apparaissent qu'en
colonne B alors que les prix sont en colonne C.

Voilà....

Merci infiniment à vous deux...Et bon début de semaine

Denys
Avatar
Daniel.M
Salut,


Daniel, je fais référence à la macro que tu me proposais
vendredi dernier et avec lequel tes résultats différaient
de ceux d'Isabelle. Voici ta macro:

<snip...>

En réalité, les Noms des compagnies n'apparaissent qu'en
colonne B alors que les prix sont en colonne C.


Ah! J'avais donc mal compris ta structuration des données : ce qui explique mes
résultats différents. Je croyais que les nombres étaient en col B (sauf
lorsqu'il y avait le nom de la cie, alors ils étaient en col C).

Avec une structuration comme celle-ci:
ColB ColC
ABC $5.00
$5.10
$5.20
$5.30
$5.40
$5.50
DEF $12.32
$13.25

le code suivant devrait fonctionner:


' Les cies à conserver peu importe leur total
' doivent être présentes dans une plage CIEEXCLURE
' (pour les données du problème: ce serait une plage de
' 2 cellules contenant ABC et GHI

Sub Macro_DMA()
Dim C As Range, Total As Double
Dim PremCol As Long, PremLigne As Long, Ligne As Long

PremLigne = 2: PremCol = 6: Ligne = PremLigne

For Each C In Range("B2:B" & Range("C65536").End(xlUp).Row)
If IsEmpty(Trim(C)) Then
Total = Total + C(1, 2)
Else
Cells(Ligne, PremCol) = C
If Ligne > PremLigne Then
Cells(Ligne - 1, PremCol + 1) = Total
End If
Total = C(1, 2)
Ligne = Ligne + 1
End If
Next C
Cells(Ligne - 1, PremCol + 1) = Total 'inscrit le dernier total

' C'est terminé! : il ne reste qu'à trier puis enlever les entrées
' excédentaires.
With Cells(PremLigne, PremCol + 2).Resize(Ligne - PremLigne, 1) '3e
colonne de l'output
.FormulaR1C1 = "=N(ISNUMBER(MATCH(RC[-2],CIEEXCLURE,0)))"
.Value = .Value
' on tri, avec clé1 la 3e col, clé2 la 2e col
Cells(PremLigne, PremCol).Resize(Ligne - PremLigne, 3).Sort _
Key1:Îlls(PremLigne, PremCol + 2), Order1:=xlDescending, _
Key2:Îlls(PremLigne, PremCol + 1), Order2:=xlDescending
.ClearContents ' on détruit la 3e colonne de l'output
End With

' prendre les 5 premiers : i.e. 2 (de CIEEXCLURE) + 3 PROCHAINS
' donc éliminer les entrées en-dessous
With Cells(PremLigne + 5, PremCol)
Range(.Cells, .End(xlDown)(1, 2)).ClearContents
End With

End Sub

Salutations,

Daniel M.

Avatar
Denys
Bonjour Daniel,

Merci, j'ai essayé le code sur la filière "véritable".
Cela semble fonctionner, sauf que je crois que je devrai
d'abord éliminer les lignes vides. D'après les résultats,
je crois que c'est là ou le code s'arrete...

Je vérifie et te reviens là-dessus.

Merci beaucoup pour ton temps...

Bonne semaine

Denys


-----Original Message-----
Salut,


Daniel, je fais référence à la macro que tu me proposais
vendredi dernier et avec lequel tes résultats différaient
de ceux d'Isabelle. Voici ta macro:

<snip...>

En réalité, les Noms des compagnies n'apparaissent qu'en
colonne B alors que les prix sont en colonne C.


Ah! J'avais donc mal compris ta structuration des
données : ce qui explique mes

résultats différents. Je croyais que les nombres étaient
en col B (sauf

lorsqu'il y avait le nom de la cie, alors ils étaient en
col C).


Avec une structuration comme celle-ci:
ColB ColC
ABC $5.00
$5.10
$5.20
$5.30
$5.40
$5.50
DEF $12.32
$13.25

le code suivant devrait fonctionner:


' Les cies à conserver peu importe leur total
' doivent être présentes dans une plage CIEEXCLURE
' (pour les données du problème: ce serait une plage de
' 2 cellules contenant ABC et GHI

Sub Macro_DMA()
Dim C As Range, Total As Double
Dim PremCol As Long, PremLigne As Long, Ligne As Long

PremLigne = 2: PremCol = 6: Ligne = PremLigne

For Each C In Range("B2:B" & Range("C65536").End
(xlUp).Row)

If IsEmpty(Trim(C)) Then
Total = Total + C(1, 2)
Else
Cells(Ligne, PremCol) = C
If Ligne > PremLigne Then
Cells(Ligne - 1, PremCol + 1) = Total
End If
Total = C(1, 2)
Ligne = Ligne + 1
End If
Next C
Cells(Ligne - 1, PremCol + 1) =
Total 'inscrit le dernier total


' C'est terminé! : il ne reste qu'à trier puis
enlever les entrées

' excédentaires.
With Cells(PremLigne, PremCol + 2).Resize(Ligne -
PremLigne, 1) '3e

colonne de l'output
.FormulaR1C1 = "=N(ISNUMBER(MATCH(RC[-
2],CIEEXCLURE,0)))"

.Value = .Value
' on tri, avec clé1 la 3e col, clé2 la 2e col
Cells(PremLigne, PremCol).Resize(Ligne -
PremLigne, 3).Sort _

Key1:Îlls(PremLigne, PremCol + 2),
Order1:=xlDescending, _

Key2:Îlls(PremLigne, PremCol + 1),
Order2:=xlDescending

.ClearContents ' on détruit la 3e colonne de
l'output

End With

' prendre les 5 premiers : i.e. 2 (de CIEEXCLURE) + 3
PROCHAINS

' donc éliminer les entrées en-dessous
With Cells(PremLigne + 5, PremCol)
Range(.Cells, .End(xlDown)(1, 2)).ClearContents
End With

End Sub

Salutations,

Daniel M.


.