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

Elu ou battu ? Second tour !

5 réponses
Avatar
Sylvain P.
Bonjour =E0 tous,

Toujours un probl=E8me de science politique :
Soit un fichier avec en colonne A, le nom du candidat, en colonne B
son canton, et en colonne C son score au second tour. Comment inscrire
pour chaque candidat en "Elu" ou "Battu" en colonne D ? Est elu, celui
qui obtient le plus de voix, c'est-=E0-dire la majorit=E9 relative. En
sachant =E9videmment qu'il peut y avaoir 1, 2, 3 candidats ou plus par
canton.

Voici mon code. j'utilise la fonction Find Max. Mais =E7a ne me semble
pas tr=E8s fiable.

Des id=E9es ?
Merci par avance.


Sub EluT2()


'Ins=E8re une ligne blanche avant chaque canton

Dim d As Double
For d =3D Range("B65536").End(xlUp).Row To 1
If Range("B" & d).Value =3D Range("B" & d - 1).Value Then Rows(d +
1).Insert Shift:=3DxlDown
Next


'Inscrit "Elu"

Dim cold As Range
Dim Plage As Range
Dim Ctr As Integer
Ctr =3D 3
Range("C65536").End(xlUp).Offset(1, 0).Select
Set cold =3D Selection

Do Until cold =3D Null Or cold.Value =3D Cells(1, Ctr)
Set cold =3D cold.End(xlUp)
Set hot =3D cold.End(xlUp)
Set Plage =3D Range(cold.Address & ":" & hot.Address)
If IsEmpty(cold.Offset(1, 0)) Then Plage.Select
Dim Max As Double
Max =3D Application.WorksheetFunction.Max(Plage)
On Error Resume Next
Selection.Find(Max).Select
ActiveCell.Offset(0, 1).Value =3D "Elu"
Loop


'Inscrit "Battu"

Range("D65536").End(xlUp).Offset(1, 0).Select
For V =3D Range("D65536").End(xlUp).Row To 1
If Range("D" & V) =3D 0 Then
Range("D" & V).Value =3D "Battu"
End If
Next


'Supprime les lignes blanches

derni=E8re_ligne =3D ActiveCell.SpecialCells(xlLastCell).Row
For Z =3D derni=E8re_ligne To 1 Step -1
If Application.WorksheetFunction.CountA(Rows(Z)) =3D 0 Then
Rows(Z).Delete
Next Z

End Sub

5 réponses

Avatar
billy bob
Bonjour,

sans passer par une macro,
entre la formule suivante qui me semble fonctionner en colonne D2,
=SI(C2=MAX(SI(B$2:B$65536²;C$2:C$65536;0));"Elu";"Perdu")
puis valide en tapant Controle + Shift + entrée,
enfin recopie la cellule sur toutes ta colonne D

Billy Bob

On 18 mar, 18:30, "Sylvain P." wrote:
Bonjour à tous,

Toujours un problème de science politique :
Soit un fichier avec en colonne A, le nom du candidat, en colonne B
son canton, et en colonne C son score au second tour. Comment inscrire
pour chaque candidat en "Elu" ou "Battu" en colonne D ? Est elu, celui
qui obtient le plus de voix, c'est-à-dire la majorité relative. En
sachant évidemment qu'il peut y avaoir 1, 2, 3 candidats ou plus par
canton.

Voici mon code. j'utilise la fonction Find Max. Mais ça ne me semble
pas très fiable.

Des idées ?
Merci par avance.

Sub EluT2()

'Insère une ligne blanche avant chaque canton

Dim d As Double
For d = Range("B65536").End(xlUp).Row To 1
    If Range("B" & d).Value = Range("B" & d - 1).Value Then Rows(d +
1).Insert Shift:=xlDown
Next

'Inscrit "Elu"

Dim cold As Range
Dim Plage As Range
Dim Ctr As Integer
Ctr = 3
Range("C65536").End(xlUp).Offset(1, 0).Select
Set cold = Selection

Do Until cold = Null Or cold.Value = Cells(1, Ctr)
    Set cold = cold.End(xlUp)
    Set hot = cold.End(xlUp)
    Set Plage = Range(cold.Address & ":" & hot.Address)
    If IsEmpty(cold.Offset(1, 0)) Then Plage.Select
    Dim Max As Double
    Max = Application.WorksheetFunction.Max(Plage)
    On Error Resume Next
    Selection.Find(Max).Select
    ActiveCell.Offset(0, 1).Value = "Elu"
Loop

'Inscrit "Battu"

Range("D65536").End(xlUp).Offset(1, 0).Select
For V = Range("D65536").End(xlUp).Row To 1
    If Range("D" & V) = 0 Then
    Range("D" & V).Value = "Battu"
    End If
Next

'Supprime les lignes blanches

dernière_ligne = ActiveCell.SpecialCells(xlLastCell).Row
For Z = dernière_ligne To 1 Step -1
    If Application.WorksheetFunction.CountA(Rows(Z)) = 0 Then
Rows(Z).Delete
Next Z

End Sub


Avatar
Sylvain P.
Merci Billy Bob.
ça pourrait donctionner si on avait toujours le même nombre de
candidats par cantons. Or ce n'est pas le cas.
Avatar
billy bob
Re;

Je ne comprend pas ta réserve : le résultat donné par cette formule ne
prend pas en compte et n'est pas limité par le nombre de candidat dans
chaque canton,

voir fichier exemple :
http://www.cijoint.fr/cjlink.php?file=cj200803/cijMSLpodR.xls

Ou j'ai mal compris
Avatar
francois.forcet
On 18 mar, 18:54, "Sylvain P." wrote:
Merci Billy Bob.
ça pourrait donctionner si on avait toujours le même nombre de
candidats par cantons. Or ce n'est pas le cas.


Salut Sylvain

Je te propose ce code :

Columns("D:D").Clear
Range("A2", "C" & Range("A65535").End(xlUp).Row).Sort
Key1:=Range("B2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:úlse, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
i = 2
Score = Range("C" & i)
Vainqueur = Range("D" & i).Address
Do While Range("A" & i) <> ""
If Range("B" & i) = Range("B" & i + 1) Then
If Score > Range("C" & i + 1) Then
Range("D" & i + 1) = "Battu"
Else
Range(Vainqueur) = "Battu"
Score = Range("C" & i + 1)
Vainqueur = Range("D" & i + 1).Address
End If
i = i + 1
Else
If Score > Range("C" & i) Then
Range("D" & i) = "Battu"
Else
Vainqueur = Range("D" & i).Address
End If
Range(Vainqueur) = "Elu"
Score = Range("C" & i + 1)
Vainqueur = Range("D" & i + 1).Address
i = i + 1
End If
Loop

Celà devrait faire
Dis moi !!!!

Avatar
Sylvain P.
Merci François !! C'est puissant ! Beaucoup plus puissant et plus
simple que mon code.
Merci encore.

A+