Elu ou battu ? Second tour !

Le
Sylvain P.
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
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
billy bob
Le #5191121
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."
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


Sylvain P.
Le #5191111
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.
billy bob
Le #5191101
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
francois.forcet
Le #5190741
On 18 mar, 18:54, "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.


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 !!!!

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

A+
Publicité
Poster une réponse
Anonyme