Fonction Find

Bonsoir,

Je suis en train de réaliser un programme permettant de faire l'appel des élèves dans un établissement scolaire (pas d'ENT traditionnel car c'est une école à l'intérieur d'un hôpital). Je suis professeure d'EPS et pas du tout programmeuse même si ça m'amuse

Je suis actuellement bloquée sur la fonction find. Je souhaiterais que lorsque les enseignants enregistrent l'appel (en appuyant sur le bouton) l'ensemble des données rentrées soient collés dans une autre feuille. Jusque là pas de soucis. Par contre je n'arrive pas à organiser les données. Je souhaiterais que les date soient rangées dans l'ordre (le plus récent en haut) et quelles n'apparaissent qu'une fois (d'où la fonction find). A côté les heures de la même journée seraient rangées du matin jusqu'au soir et les cellules plus loin mettraient le nom des élèves et s'ils étaient présent ou non.

Je me trouve coincé avec la fonction find. Au cours des nombreuses modifications que j'ai pu faire la seule chose que j'ai pu obtenir c'est que la fonction me renvoi "nothing" alors que la date était bien présente.

Je vous joint mon fichier. La feuille "Appel_6e" est celle où les enseignants font l'appel et la feuille "Taux_de_presence_6e" celle où les informations sont enregistrées au fur et à mesure. J'ai crée plusieurs boutons pour faire des tests mais celui où il y a la fonction find est le bouton 4 nommé "Date".

Vous m'avez été d'une grande aide en lisant de nombreux postes que j'ai adaptés à ma situation mais là je n'ai rien trouvé de similaire. Si quelqu'un peut m'aider à comprendre ce qu'il faut changer se serait top !

Bonsoir Meve, le fil

C'est bien confus tout ça il y a du boulot pour tout remettre en ordre.

Mais faut bien débuter quelque part donc :

Find recherche dans une plage de cellules, fait ta recherche dans la plage "D3:D" & Drow

Private Sub CommandButton4_Click()
    Dim DRow As Integer
    With Worksheets("Taux_de_presence_6e")
    'dernière ligne écrite et le + & pour la dernière ligne vide'
        DRow = .Range("D" & .Rows.Count).End(xlUp).Row + 1
    End With

    Dim A As Range, Donnee As Date

    Donnee = Sheets("Appel_6e").Range("I3")
    With Sheets("Taux_de_presence_6e").Range("D3:D" & DRow)  '.Select
        Set c = .Find(Donnee, LookIn:=xlValues)
        If Not c Is Nothing Then
            Sheets("Taux_de_presence_6e").Range("C6") = "ok"
'Là j'ai pas compris...
'        Else
'            Sheets("Taux_de_presence_6e").Range("C6") = "ok"
        End If
    End With

End Sub

Bon courage pour le reste...

Bonjour,

Merci mais ça me renvoi "nothing" même si la date y est déjà. Auriez-vous une solution ?

Salut Meve,

Salut Jean-Paul,

En supposant que tu donnes le même format à toutes les dates de ton fichier, demande à FIND de rechercher simplement la chaîne de caractère qu'elle représente : mes lectures semblent aller toutes dans cette direction!

J'ai quelque peu essayé "d'arranger" ton code en passant...

  • un seul With Worksheets("XXX") suffit pour la macro qui s'y réfère ;
  • une référence à la feuille active n'a pas besoin d'une spécification supplémentaire xSheet ;
  • pas besoin, en général, de Select multiples pour copier une valeur, même sur une autre feuille : de .Value à .Value directement ;
  • souvent, un traitement par lot suffit : pas toujours nécessaire de passer par une boucle et surtout éviter de placer ces traitements par lot... dans une boucle comme l'était ton SORT !

C'est en forgeant...

Private Sub CommandButton3_Click()
'
Dim CC As Range
Dim DRow%, i%
'
Application.ScreenUpdating = False
'
With Sheets("Taux_de_presence_6e")
    DRow = .Range("D" & .Rows.Count).End(xlUp).Row + 1
    .Range("D" & DRow).Value = Range("I3").Value
    .Range("D3:D" & DRow).NumberFormat = "dd/mm/yyyy;@"
    For Each CC In .Range("D3:D" & DRow)
        CC.Value = DateSerial(Split(CC.Text, "/")(2), Split(CC.Text, "/")(1), Split(CC.Text, "/")(0))
    Next CC
    .Range("D3:D" & DRow).Sort Key1:=.Range("D3"), Order1:=xlAscending, Header:=xlYes 'si en-tête
    .Range("D:D").RemoveDuplicates Columns:=1, Header:=xlNo
    Union(Range("I3:I5"), Range("H7:I50")).Value = ""
End With
'
Application.ScreenUpdating = True
MsgBox "Appel enregistré "
'
End Sub

Le code ci-dessus ne fait peut-être pas exactement ce que tu souhaites : le but était surtout de corriger certaines "approximations" de codage.

Un code clair et condensé facilite grandement ses lecture, compréhension et maintenance.

Dans ton code-test initial, tu demandais à c s'il contenait le résultat de FIND assigné à... A!

Ça ne risquait pas d'aller, ce que Jean-Paul avait bien détecté également.

Private Sub CommandButton4_Click()
'
Dim A As Range
Dim DRow%, Donnee$
'
Donnee = Range("I3").Value
With Worksheets("Taux_de_presence_6e")
    DRow = .Range("D" & .Rows.Count).End(xlUp).Row + 1
    Set A = .Cells.Find(what:=Donnee, LookAt:=xlWhole, LookIn:=xlValues)
    If Not A Is Nothing Then
        .Range("C6") = "OK"
    Else
        .Range("C6") = "NO"
    End If
End With
'
End Sub

Espérant t'avoir aidé à avancer...

A+

Bonjour,

vous m'avez bien aidé à avancer et je vous en remercie fortement !

Je me retrouve coincé avec la fonction de tri que j'utilise pour les dates. Actuellement le tri s'effectue bien en revanche il n'y a qu'une ligne qui se déplace et vient remplacer les cellules déjà écrites. J'aimerais que l'ensemble de ma liste d'élèves associé à la date se déplace j'ai essayé de modifier les arguments de la fonction Range.sort mais dans ce cas le tri ne s'effectue plus.

Existe-t-il une autre méthode de tri ? Celle-ci est-elle modifiable ?

Sachant que j'aurais de nouveau besoin du tri pour classer les heures d'appels de la même journée.

Je vous joint mon fichier que j'ai essayer d'épurer sur vos conseils. Le code est dans le button4 appeler "enregistrer l'appel" sur la feuille "Appel_6e"

Merci de votre aide.

Rechercher des sujets similaires à "fonction find"