Formule Excel et VBA

Bonjour, je suis à la recherche d'une personne généreuse qui aurait du temps à m'accorder pour me créer un fichier Excel. (formule et VBA)

Ce fichier est pour le téléthon de cette année pour faire 100h de massage cardiaque en relais non stop.

Feuille "PARTICIPANT" :

  • Colonne A : NOM
  • Colonne B : PRENOM
  • Colonne C : AGE

il faudrait un bouton nouveau participant, et quand on clique dessus, un userform s'ouvre et l'on viendra remplir, le nom le prénom et l'âge. Puis avant de valider il faudrait regarder dans la liste des participants déjà existante pour voir s’il existe déjà ou pas avec le même nom prénom pour ne pas créer de doublon, et s’il existe déjà mettre un message d'alerte pour dire que le participant existe déjà. Ensuite à la validation une fois créé il faudrait pouvoir en même temps trier par ordre alphabétique en automatique en VBA les colonne nom et prénom pour que ça soit plus facile à regarder.

Feuille "RELAIS" :

  • Colonne A : RELAI N°
  • Colonne B : NOM
  • Colonne C : PRENOM
  • Colonne D : AGE
  • Colonne E : TEMPS THEORIQUE
  • Colonne F : TEMPS REEL

Il faudrait ensuite un bouton qui ouvre un userform où l'on viendra rechercher un participant soit en tapant le nom ou prénom et dans une liste déroulante. Mettre un temps théorique pour le relais et l’ajouter à la liste à suivre en validant.

En haut de cette feuille il faudrait mettre en automatique le relai en cours suivis des deux prochains relais à venir, pour le savoir c’est par rapport à la colonne temps réel quand la dernière cellule est différente de 0 alors le relai en cours est le participant suivant.

Feuille "RECAP" :

Remplir en automatique et en temps réel en fonction des deux autres feuilles précédente :

  • TEMPS TOTAL REEL
  • NOMBRE TOTAL DE RELAIS
  • NOMBRE DE PARTICIPANT UNIQUE
  • MOYENNE D'AGE
  • PARTICIPANT LE PLUS JEUNE
  • PARTICIPANT LE PLUS AGE
  • RELAIS LE PLUS LONG (Participant + Temps)
  • PERSONNE A AVOIR FAIT LE PLUS DE RELAIS (Participant + Nombre)

Je voudrais ensuite pouvoir afficher cette feuille RECAP (quand j’aurais fait la mise en forme) sur une télé dans la salle.

Je suis ouvert a des propositions pour savoir comment faire pour afficher uniquement cette feuille RECAP sur la télé pendant que les bénévoles travail sur le fichier. Faut-il le faire sur un autre fichier excel ? mais il faudra rafraichir le fichier ? je ne sais pas comment faire.

16classeur1.xlsm (150.87 Ko)

Bonjour, belle idée pour le téléthon, je vais regarder.

Dans l'immédiat pour votre dernière question ne vous inquiétiez pas, dans Excel, onglet "VUE" vous avez "nouvelle fenetre" qui permet d'afficher une 2e fenetre Windows du meme classeur, mais indépendante (vous pouvez changer de feuille). Et ainsi la positionner sur votre second ecran.

Bonjour, merci beaucoup pour votre temps.

d'accord, je vais aller rechercher ça et faire des tests, je n'ai jamais fait.

Bonjour,

Une première approche, je préfèrerai laisser quelqu'un d'autre s'occuper des boutons. Pour l'instant j'ai implémenté la liste des participants.

18classeur1.xlsm (159.28 Ko)

Classe Personne (représentation des participants) :

Option Explicit

Private Type TPersonInfo
  prenom As String
  nom As String
  age As Long
End Type

Private this As TPersonInfo

Private Sub Class_Initialize()
  this.prenom = vbNullString
  this.nom = vbNullString
  this.age = 0
End Sub

Public Property Get prenom() As String
  prenom = this.prenom
End Property

Public Property Get nom() As String
  nom = this.nom
End Property

Public Property Get age() As Long
  age = this.age
End Property

Public Property Let prenom(prenom As String)
  this.prenom = VBA.StrConv(prenom, vbProperCase)
End Property

Public Property Let nom(nom As String)
  this.nom = VBA.StrConv(nom, vbProperCase)
End Property

Public Property Let age(ByVal age As Long)
  this.age = age
End Property

Public Sub Definir(prenom As String, nom As String, ByVal age As Long)
  this.prenom = VBA.StrConv(prenom, vbProperCase)
  this.nom = VBA.StrConv(nom, vbProperCase)
  this.age = age
End Sub

Public Function Equals(ByVal p As personne) As Boolean
  Equals = this.prenom = p.prenom _
           And this.nom = p.nom _
           And this.age = p.age
End Function

Public Function toStr() As String
  toStr = this.prenom & " " & this.nom & ", " & this.age & " ans"
End Function

Public Sub AjoutDansClasseur(Destination As Range)
  ' Destination = feuille PARTICIPANTS : A1
  ' verifier d'abord la liste pour les doublons

  If Destination.Value2 <> vbNullString Then
    Set Destination = Destination.End(xlDown).Offset(1, 0)
  End If

  With Destination
    .Value2 = this.prenom
    .Offset(0, 1).Value2 = this.nom
    .Offset(0, 2).Value2 = this.age
  End With
End Sub

Implémentée dans le module FonctionsParticipants :

Private ListeParticipants() As personne

Sub test()
  ' creation de deux profils, et un identique et ajouts dans excel
  AjoutParticipant "jean", "paul", 20
  AjoutParticipant "Paul", "Mirabelle", 27
  AjoutParticipant "jean", "paul", 20

  Dim p As Variant
  For Each p In ListeParticipants
    p.AjoutDansClasseur ThisWorkbook.Worksheets("PARTICIPANT").Range("A1")
  Next p

End Sub

Sub AjoutParticipant(prenom As String, nom As String, age As Long)
  Dim participant As New personne
  participant.Definir prenom, nom, age

  ' liste vide
  If IsEmpty(ListeParticipants) Then
    ReDim Preserve ListeParticipants(LBound(ListeParticipants) To UBound(ListeParticipants) + 1)
    Set ListeParticipants(UBound(ListeParticipants)) = participant
    Exit Sub
  End If

  ' recherche du participant dans la liste
  Dim perso As Variant
  For Each perso In ListeParticipants
    If participant.Equals(perso) Then
      MsgBox participant.toStr & " est déjà dans la liste!"
      Exit Sub
    End If
  Next perso

  ' ajout si non trouvé
  ReDim Preserve ListeParticipants(LBound(ListeParticipants) To UBound(ListeParticipants) + 1)
  Set ListeParticipants(UBound(ListeParticipants)) = participant
End Sub

Fonctionnement :

Le module contient une liste des Personnes participantes, on ajoute une personne dans la liste via la fonction AjoutParticipant, qui s'occupe de faire les vérifications nécessaires.

La fonction AjoutDansClasseur de la classe Personne permet d'insérer la personne dans la liste visible sur le classeur.

Ainsi depuis l'userform il suffira d'appeler les fonctions déjà existantes.

Bonsoir,

Une proposition pour les deux formulaires. Pour les récap, quelques données significatives seraient un plus.

Cordialement

7koshi.xlsm (47.01 Ko)

Bonjour merci énormément pour votre aide et vos réponse.

je viens d'essayer le fichier et j'aurais quelques question.

est-ce qu'il serais possible de mettre un message d'alerte quand il y a une personne identique avec nom prénom âge pour dire qu'il existe déjà et ne pas le créer car actuellement il ne mets pas de message et créer le participant quand même.

pour les relais serais t'il possible d'avoir tout d'un coup dans la liste déroulante (nom-prenom-age) pour trouver la bonne personne car il y auras plusieurs personne avec le même nom de famille ? Et quand j'ajoute un nouveau participant, je ne le vois pas apparaitre dans cette liste déroulante

Pour le tableau des prochains relais en haut serais t'il possible de remplir automatiquement la colonne n° relais aussi ? (il est défini en fonction de la colonne TEMP REEL, un relais est terminé quand le bénévole à rempli le temps réel donc différent de 0 ou vide dans la cellule. du coup le relais en cours est celui juste après la cellule qui viens d'être rempli.

quelques info supplémentaire pour le récap :

  • TEMPS TOTAL REEL = somme total de la colonne TEMPS REEL
  • NOMBRE TOTAL DE RELAIS = le dernier n° de relais enregistrer
  • NOMBRE DE PARTICIPANT UNIQUE = la somme de tout les participant
  • MOYENNE D'AGE = la moyenne d'âge de ces participant
  • PARTICIPANT LE PLUS JEUNE = l'âge le plus petit des participants
  • PARTICIPANT LE PLUS AGE = l'âge de plus grands des participant
  • RELAIS LE PLUS LONG (Participant + Temps) = le temps reel le plus important dans les relais avec le prénom de la personne
  • PERSONNE A AVOIR FAIT LE PLUS DE RELAIS (Participant + Nombre) = la personne qui reviens le plus dans la feuille relais(nom+prenom+age) et mettre combien de fois elle est passé

Bonjour,

Quasiment terminé, voir ci-joint.

J'ai repris les Userforms de Koshi car j'aime pas trop les userforms et qu'ils étaient bien selon moi.

N'hésitez pas si vous avez un retour.

Edit : le fichier en question

5classeur1-1.xlsm (59.98 Ko)

Re :

j'ai laissé en jaunes les cases à faire (filtres divers) : elles prennent avantage des nouvelles fonctions office 365 que je n'ai pas avec moi. Je laisserai donc bien quelqu'un d'autre s'en occuper.

De mon coté les boutons sont fonctionnels.

17classeur1-1.xlsm (56.71 Ko)

Bonjour,

est-ce qu'il serais possible de mettre un message d'alerte quand il y a une personne identique avec nom prénom âge pour dire qu'il existe déjà et ne pas le créer car actuellement il ne mets pas de message et créer le participant quand même.

C'est déjà le cas

pour les relais serais t'il possible d'avoir tout d'un coup dans la liste déroulante (nom-prenom-age) pour trouver la bonne personne car il y auras plusieurs personne avec le même nom de famille ? Et quand j'ajoute un nouveau participant, je ne le vois pas apparaitre dans cette liste déroulante

Fichier modifié en conséquence

Cordialement

9koshi.xlsm (43.22 Ko)

Merci pours vos fichiers,

je viens de faire un test et j'ai effacer les nom des participants pour repartir de 0. quand je test de taper un nom déjà dans la liste, il ne me mets pas de message d'erreur. il viens toujours le créer.

Quand je vais ensuite sur le bouton nouveau relais, il affiche toujours les anciens nom dans le menu déroulant et pas les nouveaux
est-ce que la case NOM juste en dessous est utile ? il faut la remplir ?

je trouve l'idée de Saboh très bien pour mettre le temps théorique en divisant par 3 les cases pour facilité la saisie pour les personnes.

j'ai rajouté dans le récap :
Personne qui a fait le plus de temps de massage en cumulé (Participant + Temps) : il faudrait trouver la personne qui a fait le plus de temps de massage en calculant tout ces passage (s'il en a fait plusieurs)

a quoi sert la feuille paramètres avec le tableau ? je dois faire quelque chose dessus ?

7koshi2.xlsm (46.22 Ko)

re,

Sur mon poste

image

Il semble qu'il faille respecter la casse.

Cordialement

Edit

macro mise à jour pour l'actualisation de la requête.

18koshi2.xlsm (50.03 Ko)

Bonjour,

Fichier amendé, prise en compte des doublons à la saisie, saisie du temps théorique décomposé.

La feuille Paramètres contient la requête servant de base à la liste déroulante du formulaire de saisie des relais.

J'y ai placé les TCD permettant de mettre à jour la feuille récap, cela permet d'avoir les exæquo, il est possible de masquer cet onglet.

Il risque d'avoir un problème en cas d’exæquo, j'ai utilisé le temps pour les départager pour le nb de relais.

A tester pour voir les coquilles et imperfections.

Cordialement.

12koshi.xlsm (68.75 Ko)

Rebonjour, je vous laisse continuer avec Zebulon alors puisque son projet est plus avancé.

Zebulon, pour éviter les problèmes de casses tu peux remplacer

If Me.txtNom & Me.txtPrenom & Me.txtAge = .Range("B" & J) & .Range("C" & J) & .Range("D" & J) Then

Par

If StrComp(Me.txtNom & Me.txtPrenom & Me.txtAge, .Range("B" & J) & .Range("C" & J) & .Range("D" & J), vbTextCompare) = 0 Then

Bien il semble que le projet soit quasi terminé :D

Bonjour, merci beaucoup pour toutes les modifications, et explication.

Vous pensez qu'il serait possible de ne pas prendre en compte les majuscule et minuscule lors de la saisie d'un participant ? pour bien envoyer que le participant existe déjà ? même si une majuscule à été oublié ? ou alors de forcer l'écriture en majuscule ou en minuscule pour tout dans la case quand on écrit ? peut importe comment le clavier est. Comme ça il n'y aurais plus de problème ?

Est-ce qu'il serait possible de rajouter un espace dans la concaténation de la liste déroulante pour la saisie d'un relai ?

Dans le temps réel il y a une formule "=SI([@[Relais N°]]<>"";0;"")" qui viens ce mettre lors de la saisie. il n'y a pas le choix de la mettre ? ou est-ce que vous pourriez mettre juste 00:00:00 pour juste avoir à double cliquer et modifier un 0 en 2 par exemple "00:20:00" ? car j'ai peur que les bénévoles soit perdu avec la formule lorsque qu'ils devront saisir le temps réel.

Pour le reste tout à l'air de fonctionner parfaitement, c'est parfait

re,

Fichier amendé en conséquence.

Cordialement.

9koshi.xlsm (67.94 Ko)

Edit :

merci à @saboh12617 pour l'instruction pour gérer la casse.

Bonne journée

Merci énormément à tous les deux pour votre aide et votre temps.

j'ai masqué la feuille paramètre

16telethon-2024.xlsm (110.68 Ko)

s, je viens de faire ma mise en forme du récap, j'ai protéger mes cellules et feuille pour que personne ne casse les formules (le mot de passe de toutes les feuilles est "telethon") cela ce désactive et réactive quand je lance la macro pour faire la saisie.

par contre j'ai du mal faire un truc... je ne sais pas pourquoi dans la feuille relais, quand je saisie un relai le nom et prénom de la personne n'apparait plus nul par

re,

les formules de calcul ont été effacées.

Cordialement

18telethon-2024.xlsm (111.28 Ko)

re,

Bravo Zebulon beau travail !

Ci-joint le dernier fichier avec le code de l'uf saisie relais mis a jour pour prendre en compte le reset de la liste des participants... je ne comprends pas comment il est initialisé. Devrait fonctionner en théorie mais je n'ai pas pu le tester car le fichier est lock de toutes parts...

12telethon-2024.xlsm (101.41 Ko)

re,

C'est ta macro ci-dessous qui pose problème.

Private Sub UserForm_Initialize()
  With Feuil1.Range("t_Participant")
    Dim ligne As Variant
    For Each ligne In .Rows
      Me.cbxParticipant.AddItem ligne(1).Cells(1, 1).Value2 & _
      " " & ligne(1).Cells(1, 2).Value2 & _
      " " & ligne(1).Cells(1, 3).Value2 & " ans"
    Next ligne
  End With
End Sub

Cordialement

Rechercher des sujets similaires à "formule vba"