Trouver la date la plus récente dans une base de donnée

Résolu
Floka61 Messages postés 7 Date d'inscription mercredi 18 juin 2014 Statut Membre Dernière intervention 24 mars 2017 - 18 mars 2017 à 16:12
adsens Messages postés 12 Date d'inscription samedi 14 mars 2009 Statut Membre Dernière intervention 19 avril 2017 - 19 avril 2017 à 01:28
Bonjour le forum
j'ai une base de données sur une feuille excel que je dois consulter a l'aide d'un Userform, cette consultation consiste a trouver la dernière date saisie pour chaque occurrence.
j'ai trouver ce code sur le Net je l'ai adapter mais apparemment il fonctionne pas bien.
la disposition des données sur la feuille :
A= Date B= Occurences (Critère de recherche)


Private Sub ListBox1_Click()
Dim ln&, flag&
Dim dd As Date

dd = Format(dd, "dd/mm/yyyy")

With Sheets("BD")
flag = 0
For ln = 10 To .Range("A65536").End(xlUp).Row
If .Range("B" & ln) = .Range("B" & ln) = Val(ListBox1) Then
TextBox1.Value = .Range("A" & ln).Value
TextBox2.Value = .Range("F" & ln).Value
flag = 1
Exit For
End If
Next ln
If flag = 0 Then
TextBox1.Value = "Pas d'entrée"
TextBox2.Value = "Pas d'entrée"
End If
End With
End Sub

merci d'avance de votre aide.

11 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 21/03/2017 à 08:26
Bon
Je vais te mettre sur la voie, mais te laisserai faire des efforts (d'apprentissage des rudiments, mais également de réflexion).
1)
.Range("A65536").End(xlUp).Row 
retourne bien la dernière ligne remplie de la colonne A pour une version Excel ancienne (dont la limite du nombre de lignes était 65536). Les nouvelles versions ont une limite très nettement supérieure. On évite donc de préciser "en dur" ce nombre et on préfère lui substituer la propriété Rows.Count (aide vba à ouvrir aux rubriques Application.Rows, propriété et Count, propriété
)
2) je suppose que tu as imparfaitement exposé ton problème et qu'en fait :
- tu sélectionnes un élément d'une listbox
- tu veux alors déterminer la date (en colonne B) la plus récente de données qui, en colonne A de ta feuille "80", ont la valeur sélectionnée dans ta listbox
3) il te faut donc :
- déclarer une variable derdate de type date
parcourir, comme tu le fais, les cellules de la colonne A et pour chaque correspondance de valeur (avec la listbox) :
- lire le contenu de la colonne B de la même ligne
- si ce contenu est > que derdate : dire que derdate = ce contenu

Commence ainsi. Je veux t'y voir, en te précisant que la mise en oeuvre de ce je t'ai exposé est au niveau de vraiment débutant (la seule petite difficulté d'un tout débutant serait peut-être la boucle, mais on l'écarte, puisque ton bout de code montre que tu en fais une, précisément).

Nous verrons ensuite (et seulement alors) que tu aurais par exemple intérêt à faire un tri hiérarchisé des colonnes A et B de ta feuille (cela agiliserait énormément)

Allez-->> au boulot, maintenant (ce sera plus sérieux que de prendre des "postures" verbales du genre "cher ami").
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
1
adsens Messages postés 12 Date d'inscription samedi 14 mars 2009 Statut Membre Dernière intervention 19 avril 2017
19 avril 2017 à 01:28
Bravo !!!
c'est très agréable de vous lire
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 18/03/2017 à 18:40
Bonjour
Tu copies/colles apparemment des choses dont tu ne connais manifestement ni le "pourquoi", ni le "comment".
Ces deux lignes :
 Dim dd As Date
dd = Format(dd, "dd/mm/yyyy")

en disent énormément sur la conscience de ce que tu fais. Et ce : d'autant que tu n'en utilises même pas le résultat !
Le code montré ne correspond par ailleurs pas à ce que tu exposes vouloir rechercher.
Il ne me semble pas que tu sois un développeur, ni même que tu te sois un jour intéressé au développement. Me trompe-je ?
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
Floka61 Messages postés 7 Date d'inscription mercredi 18 juin 2014 Statut Membre Dernière intervention 24 mars 2017
20 mars 2017 à 21:24
Bonjour Monsieur ucfoutu
Oui je ne suis pas un as de l'informatique
Ni un expert en programmation mais sachez mon cher ami
Que je me débrouille pas mal en vba pour le petit bout code dont tu fais allusion c'est sans importance ce n'est qu'une variable déclarer et non utilisé
Et elle ne figure nulle par ailleurs dans le code.
J'espère avoir été clair quant on fait appel à ses forum c'est pour apprendre
Et avoir des solutions et non pas être humilié par des réponses qui font mal
Au coeur.
Bonne journée monsieur
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 mars 2017 à 04:42
Ah ...
On a toujours "mal au coeur" lorsque l'on n'obtient rien sans travailler.
Mais bon ... Je crois que tu as eu exactement le même genre de réponse (et pour les mêmes raisons) ailleurs.
Bonne chance.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Floka61 Messages postés 7 Date d'inscription mercredi 18 juin 2014 Statut Membre Dernière intervention 24 mars 2017
Modifié par Floka61 le 21/03/2017 à 13:58
Bonjour ucfoutu et le forum
Oubliant ce que j'ai posté hier j'étais vraiment agacé par ce code je travaille dessus ça fait plus d'une semaine.

j'ai refait le code selon vos recommandations et j'ai procéder aussi a un changement dans la disposition de La feuille "BD" les dates figure dans la Colonne "F".
j'ai créer la derdate et je l'ai déclare ainsi Dim derdate As Date
mais apparemment le code me donne rien ça doit être un mauvais codage de ma part il me semble que le problème est dans les "If" je vous laisse le soins de jeter un coup d’œil.

Private Sub ListBox1_Change()
Dim ln&, flag&
Dim derdate As Date

With Sheets("BD")
flag = 0
For ln = 2 To .Range("A" & Rows.Count).End(xlUp).Row 'parcourir, comme tu le fais, les cellules de la colonne A et pour chaque correspondance de valeur (avec la listbox)
If .Range("F" & ln) = .Range("F" & ln) = Val(ListBox1) And _
.Range("F" & ln) > CDate(derdate) Then 'si ce contenu est > que derdate
derdate = .Range("F" & ln).Value 'dire que derdate = ce contenu
TextBox1.Value = .Range("F" & ln).Value
TextBox2.Value = .Range("E" & ln).Value
flag = 1
Exit For
End If
Next ln
If flag = 0 Then
TextBox1.Value = "Pas d'entrée"
TextBox2.Value = "Pas d'entrée"
End If
End With
End Sub


Merci d'avance et bonne journée
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 mars 2017 à 16:03
Tu vois ? Ce sont bel et bien les bases mêmes (tant de codage que de logique pure)qui te manquent --->>
Ton parcours --> il est à faire sur toutes les cellules, puis -->>
--- si on y trouve la valeur de la listbox, --->>
------ regarder la date en colonne F --->>
--------- si la date > derdate --->>
----------- derdate = la date
--------- fin de si
--- fin du second si

Passons maintenant à l'erreur de logique pure et( totalement indépendante de connaissances en informatique
Analyse donc ton propre code : Il quitte ta boucle de parcours dès que tu trouve une date supérieure à derdate ! Elle est bien bonne, celle-là -->> qu'est-ce qui te permet de penser que c'est elle, la date la plus grande et non une autre, plus bas dans ton parcours ?

Enfin :
 .Range("F" & ln) > CDate(derdate)
n'a aucune justification ni logique, puisque derdate est typée en date (on ne convertit pas une date en ... date ... elle est DEJA une date !
Comme tu peux le constater, c'est vraiment la connaissance des rudiments qui fait ici cruellement défaut.
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
Floka61 Messages postés 7 Date d'inscription mercredi 18 juin 2014 Statut Membre Dernière intervention 24 mars 2017
21 mars 2017 à 17:07
Salut et Merci Ucfoutu

j'avoue que que je lève le drapeau blanc je n'arrive plus a le faire fonctionné malgré que j'ai modifier

Private Sub ListBox1_Change()
Dim ln&, flag&
Dim derdate As Date

With Sheets("BD")
flag = 0
For ln = 2 To .Range("A" & Rows.Count).End(xlUp).Row 'parcourir, comme tu le fais, les cellules de la colonne A et pour chaque correspondance de valeur (avec la listbox)
If .Range("F" & ln) = .Range("F" & ln) = Val(ListBox1) Then
If CDate(.Range("F" & ln).Value) > derdate Then 'si ce contenu est > que derdate
derdate = CDate(.Range("F" & ln).Value) 'dire que derdate = ce contenu
TextBox1.Value = .Range("F" & ln).Value
TextBox2.Value = .Range("E" & ln).Value
flag = 1
Exit For
End If
End If
Next ln
If flag = 0 Then
TextBox1.Value = "Pas d'entrée"
TextBox2.Value = "Pas d'entrée"
End If
End With
End Sub


merci beaucoup
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 21/03/2017 à 17:36
j'avoue que que je lève le drapeau blanc

Ah !
Je constate que tu sais écrire. Tuè sais donc forcément également lire, non ?
Relis-moi donc, car tu n'as tenu aucun compte de deux remarques que je t'ai faites : l'une concernant une sortie indue de boucle, l'autre concernant une conversion par cdate !

Je te l'ai pourtant dit et répété : ce sont les rudiments mêmes qui sont- absents de tes connaissances .
Précipite-toi sur ton aide VBA (elle est là pour cela et notamment pour les acquérir, ces rudiments indispensables).
Deux rubriques (déjà et pas les seules, loin de là) à consulter : Exit, instruction et Fonctions de conversion de types de données (dont Cdate)
Ne pas confondre ce forum de développement avec un forum d'enseignement des bases (à acquérir à l'aide de l'aide VBA, dont la consultation est indispensable au même titre que le serait n'importe quel manuel d'emploi de n'importe quel ustensile).
Bonne étude et bonnes lectures en te précisant qu'il faut beaucoup beaucoup beaucoup moins d' "une semaine" (le temps depuis lequel tu dis travailler sur cette broutille) pour acquérir les connaissances rudimentaires (il ne m'a fallu qu'environ 4 heures au total, à l'époque)

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
Floka61 Messages postés 7 Date d'inscription mercredi 18 juin 2014 Statut Membre Dernière intervention 24 mars 2017
21 mars 2017 à 17:46
rebonjour
voila j'ai supprimé le Cdate et j'ai aussi enleve Exit For.

Private Sub ListBox1_Change()
Dim ln&, flag&
Dim derdate As Date

With Sheets("BD")
flag = 0
For ln = 2 To .Range("A" & Rows.Count).End(xlUp).Row 'parcourir, comme tu le fais, les cellules de la colonne A et pour chaque correspondance de valeur (avec la listbox)
If .Range("F" & ln) = .Range("F" & ln) = Val(ListBox1) Then
If .Range("F" & ln) > derdate Then 'si ce contenu est > que derdate
derdate = .Range("F" & ln) 'dire que derdate = ce contenu
TextBox1.Value = .Range("F" & ln).Value
TextBox2.Value = .Range("E" & ln).Value
flag = 1
End If
End If
Next ln

If flag = 0 Then
TextBox1.Value = "Pas d'entrée"
TextBox2.Value = "Pas d'entrée"
End If
End With
End Sub

toujours rien
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 mars 2017 à 18:09
Le code est maintenant ENFIN correct
Si "toujours rien", la cause est ailleurs et tu es maintenant seul à pouvoir la déterminer. Elle peut être :
- une listbox nommé autrement
- une listbox bien nommée mais pas d'évènement change provoqué
- aucune valeur en colonne F correspondant à la sélection faite dans la listbox (en te précisant que l'évènement Change nécessite une sélection différente de l'éventuelle sélection précédente)
- les valeurs en colonne F ne sont pas typées (formatées) en Date
etc ...
A ce niveau s'arrête la possibilité de t'aider au delà (il me faudrait être physiquement à ton clavier et devant ton écran !)
Je te laisse donc là.

0
Floka61 Messages postés 7 Date d'inscription mercredi 18 juin 2014 Statut Membre Dernière intervention 24 mars 2017
24 mars 2017 à 18:01
Bonjour ucfoutu

je voulais juste vous remercie de votre aide c'est grâce a vous que j'ai pu mettre en marche ce code finalement il a fallu juste remplacer cette ligne du code:
If .Range("A" & ln) = .Range("B" & ln) = Val(ListBox1)

par
If .Range("A" & ln) = (Me.ListBox1)


je te remercie infiniment mon cher ami ça marche parfaitement
0
Rejoignez-nous