Fichiers élections : beaucoup de questions

Didou59

XLDnaute Nouveau
Bonjour à toutes et tous,
Je travaille sur un fichier qui permettra aux communes de 3 500 habitants et plus de suivre les élections municipales de 2014.
Dans un premier temps, pouvez vous jeter un oeil sur les macros existantes afin de les optimiser ?
Dans un second temps, je vais créer une feuille avec listes déroulantes par bureau de vote qui permettra de valider les résultats de chaque centaine par nom de liste. Je commence à y réfléchir mais si vous avez des idées je suis preneur. Merci pour votre aide.
 

Pièces jointes

  • Municipales 2014.xls
    237 KB · Affichages: 304

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Fichiers élections : beaucoup de questions

Bonjour Didou59,

J'ai fait un test (5000 habitants - 1er tour - deux listes - 10 conseillers - 27 candidats)

Il se termine par une une erreur à la validation de la liste (sur une modification impossible de cellule fusionnée).

Mais comme je n'y connais rien, je ne sais pas si j'ai rentré des données cohérentes ou pas...
 
Dernière édition:

Didou59

XLDnaute Nouveau
Re : Fichiers élections : beaucoup de questions

Bonjour à toutes et tous,
Afin que vous compreniez mieux mon problème, je vous explique ci-dessous.
Dans ma feuille "Candidats" je sélectionne le tour de scrutin dans la liste déroulante située en E10, puis le nom de la liste dans le menu déroulant situé en D12. On saisit ensuite le nombre de conseillers en H12 ce qui affiche les lignes correspondantes de B16 à B84. Les utilisateurs doivent saisir les informations relatives à chaque candidat de la colonne D à la colonne G. Pour chaque liste, la macro "Transpose_candidats" doit copier ce qui vient d'être saisi dans la feuille "Listes de candidats" sur les colonnes G à H, copie la cellule E10 sur la cellule E2 puis recopie vers le bas sir la colonne G est non vide et fait la même chose pour la cellule D12. J'ai un souci sur cette copie car la première validation fonctionne apparement mais la seconde écrase la copie de E10 et D12. Quand j'aurai réglé ce problème, l'outil continue d'être développé donc d'autres questions viendront comme par exemple la modification du nom des listes ou celle des candidats ainsi que les opération de dépouillement (que j'ai commencé à faire).
Je vous met les codes ci-dessous :
Transpose_listes :
Code:
Sub Transpose_listes()
Application.Calculation = xlCalculationManual
Dim Plg As range
Dim Cel As range
Dim Cmpt As Variant
Sheets("Listes").Select
range("I11").Select
If Selection.Value = "Premier tour" Then
    Set Plg = range("D13:D27")
        For Each Cel In Plg
            If Cel.Formula <> "" Then
            Sheets("Listes de candidats").Select
            range("A3").Activate
            range("A3").Offset(Cmpt).Formula = Cel
            Cmpt = Cmpt + 1
            Else: End If
        Next Cel
                Application.CutCopyMode = False
                Sheets("Listes").Select
                range("I11").Copy
                Sheets("Candidats").Select
                range("E10").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
                    Sheets("Listes").Activate
                    range("A1").Select
                    range("D11,I11,D13:D27").ClearContents
End If
If Selection.Value = "Deuxième tour" Then
    Set Plg = range("D13:D27")
        For Each Cel In Plg
            If Cel.Formula <> "" Then
            Sheets("Listes de candidats").Select
            range("B3").Activate
            range("B3").Offset(Cmpt).Formula = Cel
            Cmpt = Cmpt + 1
            Else: End If
        Next Cel
                Application.CutCopyMode = False
                Sheets("Listes").Select
                range("I11").Copy
                Sheets("Candidats").Select
                range("E10").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
                    Sheets("Listes").Activate
                    range("A1").Select
                    range("D11,I11,D13:D27").ClearContents
End If
Sheets("Candidats").Select
range("E10").Select
Application.Calculation = xlCalculationAutomatic
End Sub
Transpose_candidats :
Code:
Sub Transpose_candidats()
Application.Calculation = xlCalculationManual
Application.CutCopyMode = False
Sheets("Candidats").Select
range("D16:G84").Copy
Sheets("Listes de candidats").Select
range("G65535").End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Dim c As Integer
For c = 2 To range("G65535").End(xlUp).Row
If Not IsEmpty(range("G" & c)) Then
Sheets("Candidats").Select
range("E10").Copy
Sheets("Listes de candidats").Select
range("E65535").End(xlUp).Offset(1, 0).Select
range("E" & c).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Candidats").Select
range("D12").Copy
Sheets("Listes de candidats").Select
range("F65535").End(xlUp).Offset(1, 0).Select
range("F" & c).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End If
Next c
Sheets("Candidats").Select
range("D16:G84,D12:E12,H12,E10").ClearContents
range("E12").Select
Application.Calculation = xlCalculationAutomatic
End Sub
Merci pour votre aide.
 

Modeste

XLDnaute Barbatruc
Re : Fichiers élections : beaucoup de questions

Bonjour Didou59, mapomme, kjin, ... et puis tous les autres,

Comme je suis intervenu dans d'autres discussions du même Didou59, voici quelques modifs ...
Dans la pièce jointe, jai redéfini la plage "Listes". Elle fait référence à:
Code:
=DECALER('Listes de candidats'!$A$2;;;NBVAL('Listes de candidats'!$A:$A)-1)
et ai supprimé celle nommée "Premier_Tour", qui me semblait faire doublon.
La validation en D12 de la feuille Candidat a maintenant comme source, la plage nommée "Listes" (supprimé au passage la fusion sur cette cellule et sa voisine de droite et ajouté une validation en H12: nombre entier entre 1 et 69)

Dans la même feuille "Candidats", la colonne B contient déjà le texte "Candidat n° x", simplement la couleur de police est orange. Sur le même principe, toutes les cellules de D16 à G84 sont en remplissage orange. C'est au moment où est encodé le nombre de candidats en H12, que la police en colonne B est colorée en blanc (jusqu'au Xième candidat) et que le remplissage des cellules concernées est mis à "aucun" pour les colonnes D à G.
Un bouton permet de remettre les cellules en leur état d'origine.

J'ai "élagué" le code de la procédure "Transpose_candidats", fruit vraisemblable de l'enregistreur de macro. En fin de cette même procédure, j'ai mis en commentaire l'appel à la procédure de "remise à blanc".

... Le tout ... si j'ai bien compris!?

Je ne me suis pas occupé du reste: ça risque de représenter un sacré travail (qui n'est pas tout à fait circonscrit au stade actuel, j'en ai peur :eek:).
Dans les modifs que je propose ici, il y a encore un tombereau d'améliorations à apporter (en termes de contrôle, notamment!)
 

Pièces jointes

  • Municipales 2014 (2).xls
    264.5 KB · Affichages: 219

Didou59

XLDnaute Nouveau
Re : Fichiers élections : beaucoup de questions

Bonjour Modeste, mapomme, kjin, ... et tous ceux qui pourront ou voudront m'aider,
Effectivement tu m'as bien simplifier le transpose_candidats et je t'en remercie (pour info cette macro n'a pas été réalisée avec l'enregistreur mais en cherchant et modifiant des codes trouvés sur le net). Par contre je continue de faire évoluer l'outil, et ma foi je m'étonne du résultat, mais là je séche. Je voudrais pouvoir controler ou afficher les listes du premier ou deuxieme tour via un bouton qui me ramene ce qui a déjà été validé.
Voici le code mais il est très "lourd". En fait je pars de cellules contigues sur une colonne pour recopier sur des cellules non contigues d'une colonne d'une autre feuille. J'épère que je me suis correctement fais comprendre.
Merci pour votre aide.
Code:
Sub Modifier_listes()
    Sheets("Listes").Select
    Range("I11").Select
    If Selection.Value = "" Then
    MsgBox "Veuillez sélectionner un tour de scrutin avant de contrôler ou modifier", vbOKOnly: Exit Sub
    End If
    If Selection.Value = "1er tour" Then
    Sheets("Listes de candidats").Select
    Dim Tour1 As Integer
    Tour1 = WorksheetFunction.CountA(Columns(1)) - 1
    Sheets("Listes").Select
    Range("D11") = Tour1
    Sheets("Listes de candidats").Select
    Range("A3").Copy
    Sheets("Listes").Select
    Range("D13").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
    Sheets("Listes de candidats").Select
    Range("A4").Copy
    Sheets("Listes").Select
    Range("D15").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
    Sheets("Listes de candidats").Select
    Range("A5").Copy
    Sheets("Listes").Select
    Range("D17").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
    Sheets("Listes de candidats").Select
    Range("A6").Copy
    Sheets("Listes").Select
    Range("D19").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
    Sheets("Listes de candidats").Select
    Range("A7").Copy
    Sheets("Listes").Select
    Range("D21").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
    Sheets("Listes de candidats").Select
    Range("A8").Copy
    Sheets("Listes").Select
    Range("D23").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
    Sheets("Listes de candidats").Select
    Range("A9").Copy
    Sheets("Listes").Select
    Range("D25").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
    Sheets("Listes de candidats").Select
    Range("A10").Copy
    Sheets("Listes").Select
    Range("D27").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
    End If
    If Selection.Value = "2me tour" Then
    Sheets("Listes de candidats").Select
    Dim Tour2 As Integer
    Tour2 = WorksheetFunction.CountA(Columns(2)) - 1
    Sheets("Listes").Select
    Range("D11") = Tour2
    Sheets("Listes de candidats").Select
    Range("B3").Copy
    Sheets("Listes").Select
    Range("D13").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
    Sheets("Listes de candidats").Select
    Range("B4").Copy
    Sheets("Listes").Select
    Range("D15").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
    Sheets("Listes de candidats").Select
    Range("B5").Copy
    Sheets("Listes").Select
    Range("D17").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
    Sheets("Listes de candidats").Select
    Range("B6").Copy
    Sheets("Listes").Select
    Range("D19").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
    Sheets("Listes de candidats").Select
    Range("B7").Copy
    Sheets("Listes").Select
    Range("D21").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
    Sheets("Listes de candidats").Select
    Range("B8").Copy
    Sheets("Listes").Select
    Range("D23").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
    Sheets("Listes de candidats").Select
    Range("B9").Copy
    Sheets("Listes").Select
    Range("D25").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
    Sheets("Listes de candidats").Select
    Range("B10").Copy
    Sheets("Listes").Select
    Range("D27").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
    End If
End Sub
 

Modeste

XLDnaute Barbatruc
Re : Fichiers élections : beaucoup de questions

Bonjour Didou59, le fil, le forum,

Je manquerai de temps pour faire un suivi aussi "rapproché", dans les prochains jours/semaines :rolleyes:
Il faudrait que tu prennes le temps, lorsque je dis que j'ai "élagué" le code précédent, de déterminer ce qui a été modifié ... pour pouvoir refaire quelque chose d'approchant. Si tu regardes bien le code précédent, j'avais notamment supprimé toutes les instructions 'Select' (qui ralentissent fort le code).

Le code suivant, fait (je pense) la même chose que le tien avec quelques "économies" réalisées à droite et à gauche (suppression des 'Select', utilisation d'un tableau dont je ne remplis qu'une ligne sur deux).
J'ai renommé (oui, encore!) la plage "Listes" en "ListesT1" et ajouté une plage nommée "ListesT2", déplacé les noms des listes en B2 et B3 de la feuille "Listes candidats", pour éviter les cellules vides. Cette plage fait référence à:
Code:
=DECALER('Listes de candidats'!$B$2;;;NBVAL('Listes de candidats'!$B:$B)-1)
Tu peux continuer d'utiliser Listes au lieu de ListesT1, si tu préfères (moi ça me semblait plus clair). Attention, si tu fais le même choix que moi aux validations de données avec comme Source la plage "Listes".

A tester, donc:
VB:
Option Base 1
Sub Modifier_listes()
With Sheets("Listes")
    .Range("D13:D" & Application.Max(13, .Range("D65000").End(xlUp).Row)).ClearContents
    .Range("D11").ClearContents
    If .Range("I11").Value = "" Then _
       MsgBox "Veuillez sélectionner un tour de scrutin avant de contrôler ou modifier", vbOKOnly: Exit Sub
    Dim monTablo() As String
    Dim numTour As Integer, lig As Integer, i As Integer
    If .Range("I11").Value = "Premier tour" Then 'pas "1er tour"
       numTour = Sheets("Listes de candidats").Range("ListesT1").Rows.Count
    Else
       numTour = Sheets("Listes de candidats").Range("ListesT2").Rows.Count
    End If
    ReDim monTablo(numTour * 2)
    i = 1
    .Range("D11") = numTour
    For lig = 1 To numTour
       monTablo(i) = Sheets("Listes de candidats").Range("A" & lig + 1)
       i = i + 2
    Next lig
    .Range("D13:D" & 12 + UBound(monTablo)) = Application.Transpose(monTablo)
End With
End Sub

Bonne continuation,
 

Didou59

XLDnaute Nouveau
Re : Fichiers élections : beaucoup de questions

Modeste,
Je te remercie pour ces améliorations apportées. Je vais me réapproprier tes codes puisque je j'ai déplacé certaines données pour une meilleure présentation. Sachant que cet outil n'est pas trop urgent, je ferais en sorte de ne pas trop alimenter la discussion pour ne pas t'importuner outre mesure. Je vais effectivement prendre le temps de bien comprendre les modifications apportées qui me serviront probablement dans la continuation de mon développement.
Merci encore à toi.
 

Didou59

XLDnaute Nouveau
Re : Fichiers élections : beaucoup de questions

Bonsoir Modeste,
Afin de ne plus trop te solliciter, peux-tu m'expliquer ce que veux dire & 15 dans la macro "transpose candidats". J'ai bien compris le reste mais là je ne vois pas.
Merci beaucoup et bonne soirée.
 

Modeste

XLDnaute Barbatruc
Re : Fichiers élections : beaucoup de questions

Salut Didou59,

Je suppose que tu veux parler de
Code:
Sheets("Candidats").Range("D16:G" & 15 + nbCandidats).Copy
la variable nbCandidats a pris ici, comme valeur, le contenu de H12 (le nombre de candidats). Dans l'instruction ci-dessus, on veut copier la plage qui commence en D16 (où figurera le nom du premier candidat) et qui s'étend jusqu'en colonne Gxx. Le xx devant correspondre à la ligne où figurera le dernier candidat. Si le nombre de candidats est de 5, l'addition 15 + 5 donnera 20, qui sera bien le n° de la ligne du 5e candidat.
Le '&' permet (en vba, comme dans la feuille de calcul) de "concaténer", assembler (au moins) deux chaînes de caractères "D16:G" & 15 + nbCandidats donnera donc, en définitive "D16:G20"

... Tu m'as suivi?
 

angeldut

XLDnaute Nouveau
Re : Fichiers élections : beaucoup de questions

Bonjour,

Je comprends le but de ta démarche et c'est intéressant. À titre d'info, la Pref du Nord transmet aux communes de son arrondissement un module sous OoO pour saisir et renvoyer les données le soir du scrutin. Tu rentres bureau par bureau le nombre de voix, le nombre d'inscrits, le nombre de nuls ... Peut-être y-a-t'il moyen de s'en inspirer.

Pour ma part, je me suis contenté d'un simple fichier excel qui, en fonction des résultats, me calcule le nombre de sièges pour chaque liste en piste.

(Ce qui m'interpelle, c'est de voir le CDG59 sur ce forum. Mais c'est sympa ;) )

Par ailleurs, il y a aussi d'autres applis en php qui font la même chose (et mieux). J'avais d'ailleurs testé ce principe en 2007. Tu trouveras tout ce dont tu as besoin sur le site de l'adullact (openElec...).

À ta disposition. ;)
 

Didou59

XLDnaute Nouveau
Re : Fichiers élections : beaucoup de questions

Bonjour angeldut,

Effectivement, il existe un outil créé par l'adullact mais celui-ci va de l'inscription de l'électeur jusqu'à la production des résultats. Mon objectif est tout simplement de proposer un outil ludique de gestion des listes de candidats aux élections et d'affichage des résultats (avec statistiques éventuelles). De plus, ce développement me permet de mieux appréhender le vba et donc d'appliquer ces connaissances à d'autres applications peut-être à venir.
Je remarque que tu connais, apparemment, les Cdgs et plus particulièrement celui du 59.
Dans tous les cas, merci pour tes informations et ton intéressement.
A bientôt peut-être.
 

Didou59

XLDnaute Nouveau
Re : Fichiers élections : beaucoup de questions

Modeste,
Avec ton explication j'ai bien compris le "& 15" dans le code? C'est maintenant plus clair pour moi et pourrais éventuellement le réutiliser. J'essaie maintenant de comprendre le dernier code qui "contrôle modifie les listes". je l'ai testé dans ton fichier joint mais il me décale d'une ligne les listes du premeier tour et ne fais rien pour le deuxième tour. J'y regarde et te tiens informé.
Merci
 

Modeste

XLDnaute Barbatruc
Re : Fichiers élections : beaucoup de questions

Bonsoir,

Merci à angeldut (... qui doit avoir une meilleure connaissance du système électoral français que moi :p) pour ces pistes

@Didou: relire les indications au début de mon message #8, à propos des plages nommées ... ton souci vient peut-être de là (c'est en tout cas par là que je commencerais à vérifier)
Attention également à l'instruction "Option Base 1" qui doit se trouver tout en haut du module (dans les "déclarations et donc avant les différentes procédures)
 

Discussions similaires

Statistiques des forums

Discussions
312 321
Messages
2 087 266
Membres
103 502
dernier inscrit
talebafia