vba trouver la date la plus ancienne

zayab

XLDnaute Junior
Bonjour
dans un tableau, dont la taille peut changer, qui débute en a5 j'ai besoin que la date la plus ancienne en colonne b s'affiche dans la cellule b2. (au dessus)
en vba svp
Merci
 

Staple1600

XLDnaute Barbatruc
Re

Il y a des problème de saisie dans ta macro Liste
Code:
Sub Liste() 'mise a jour des données Feuil1 de puis Import
'declaration des plages en dates + heures de debut et de fin
Di
Dim minidate2, maxidate2
Dim minimaldate2, maximaldate2 As Date


With Feuil1
  minidate2 = .Cells(.Rows.Count, "b").End(xlUp).Row
  mm DébP As Date, FinP As Date
inimaldate2 = IIf(minidate2 > 4, Application.Min(.Range("b5:b" & minidate2)), "")
End With
On devrait plutôt lire
VB:
Sub Liste() 'mise a jour des données Feuil1 de puis Import
'declaration des plages en dates + heures de debut et de fin
Dim DébP As Date, FinP As Date
Dim minidate2 As Long , maxidate2 As Long
Dim minimaldate2 As Date , maximaldate2 As Date
With Feuil1
minidate2 = .Cells(.Rows.Count, "b").End(xlUp).Row
minimaldate2 = IIf(minidate2 > 4, Application.Min(.Range("b5:b" & minidate2)), "")
End With
 

Jacky67

XLDnaute Barbatruc
Re..
Bon,
Je ne comprend pas ce que tu veux faire avec ce classeur...
Tu veux mettre une date et une heure (max et min) dans des cellules à l'activation de la feuille et en même temps modifier ces cellules.
Si c'est cela , je ne pense pas que cela soit une bonne méthode
Je ne sais pas si JM à compris la même chose.
En pj, le classeur avec seulement la demande initiale.
 

Pièces jointes

  • ancienne date 2.0 .xlsm
    16.8 KB · Affichages: 33

Si...

XLDnaute Barbatruc
Bon_soir
Je ne comprends pas ce que tu veux faire avec ce classeur..;).
J'ai interprété la demande ainsi : 2 actions
Action 1 : mettre à jour la feuille à son activation après récupération des données. Là c'est simple avec les formats de date !
VB:
Dim MiB as date, MaC as date
Private Sub Worksheet_Activate()
  MiB = Application.Min([B:B])
  MaC = Application.Max([C:C])
  [D3] = MiB
  [B2] = Format(MiB, "dd/mm/yyyy")
  [G2] = Format(MiB, "hh:mm")
  [J3] = MaC
  [I2] = Format(MaC, "dd/mm/yyyy")
  [L2] = Format(MaC, "hh:mm")
End Sub
Action 2 : changements de saisie dans les cellules [B2], [G2], [I2] et [L2]. Cela se corse car la macro ci-dessus impacte l'évènementielle. Il faut se prémunir de cela en bloquant puis libérant les évènements.
VB:
Private Sub Worksheet_Activate()
  Application.EnableEvents = 0  'pour bloquer les évènements
  MiB = Application.Min([B:B])
…
  [L2] = Format(MaC, "hh:mm")
  Application.EnableEvents = 1  'pour libérer les évènements
End Sub
Maintenant, il faut traiter les changements
VB:
Dim T as Boolean  'à rajouter obligatoirement tout en haut
Private Sub Worksheet_Change(ByVal R As Range)
  If Not Intersect(R, [B2:G2,I2:L2]) Is Nothing Then
  T = [B2] = "" Or [G2] = "" Or [I2] = "" Or [L2] = ""
  If T Then Exit Sub   '4 saisies non vides pour conclure
  [D3] = [B2] & " " & Format([G2], "[$-409]h:mm AM/PM;@")
   [J3] = [I2] & " " & Format([L2], "[$-409]h:mm AM/PM;@")
  If CDate([D3]) > CDate([J3]) Then MsgBox "la date de début doit être inférieure à celle de la fin !", vbCritical, "Attention, erreur ..."
  [B3].Select  'ou autre action de nettoyage
  End If
End Sub
Je n'ai pas testé la validité des saisies donc à rajouter.
Tout se passe dans la feuille 1* alors il n'y a plus de WithEnd With donc de point.

Si je suis en dehors de la plaque, il y a quand même une sacrée réduction pour la recherche des dates minimale et maximale et pour l'indication des cellules concernées.

* je vois trop souvent des macros dans des Modules Standards quand tout se passe dans le même onglet donc des codes alourdis !
Il me semble que c'est bien plus simple quand on se dit « Je travaille sur une seule feuille donc je saisis mes macros dans la fenêtre de codes de celle-ci !».
 

Pièces jointes

  • Compare dates.xlsm
    20.7 KB · Affichages: 40

Staple1600

XLDnaute Barbatruc
Re,

Re..
Bon,
Je ne comprend pas ce que tu veux faire avec ce classeur...
Tu veux mettre une date et une heure (max et min) dans des cellules à l'activation de la feuille et en même temps modifier ces cellules.
Si c'est cela , je ne pense pas que cela soit une bonne méthode
Je ne sais pas si JM à compris la même chose.
Je viens d'apprendre que le libre-arbitre serait un leurre (selon les neurosciences)
Du coup si je comprends ou pas la question, ce n'est pas de mon fait. ;)
"29/5/18 7:00 AM 31/5/18 6:00 PM trouer"
Cependant, je me demande bien qui creuse des trous (et dans quoi) durant un si grand laps de temps ;)
Au final, je crois bien que comme toi, Jacky67, je ne comprenne pas vraiment la demande du demandeur.

Mais celui-ci finira bien par trouver chaussure à son pied parmi toutes les réponses postées dans son fil.
 

zayab

XLDnaute Junior
je veux mettre une date et une heure (max et min) dans des cellules à l'activation de la feuille et après modifier ces cellules
quand ces cellules seront modifiées les boites de dialogues s'activeront (au besoin*) via Sub Liste()
*si les valeurs saisies sortent du cadre de la plage [b2:g2,i2:L2]

à l'activation de la feuille b2:g2 sera au minimum et i2:L2 au maximum
 

Pièces jointes

  • ancienne date 2.01.xlsm
    24.6 KB · Affichages: 17

zayab

XLDnaute Junior
Bon_soir

J'ai interprété la demande ainsi : 2 actions
Action 1 : mettre à jour la feuille à son activation après récupération des données. Là c'est simple avec les formats de date !
VB:
Dim MiB as date, MaC as date
Private Sub Worksheet_Activate()
  MiB = Application.Min([B:B])
  MaC = Application.Max([C:C])
  [D3] = MiB
  [B2] = Format(MiB, "dd/mm/yyyy")
  [G2] = Format(MiB, "hh:mm")
  [J3] = MaC
  [I2] = Format(MaC, "dd/mm/yyyy")
  [L2] = Format(MaC, "hh:mm")
End Sub
Action 2 : changements de saisie dans les cellules [B2], [G2], [I2] et [L2]. Cela se corse car la macro ci-dessus impacte l'évènementielle. Il faut se prémunir de cela en bloquant puis libérant les évènements.
VB:
Private Sub Worksheet_Activate()
  Application.EnableEvents = 0  'pour bloquer les évènements
  MiB = Application.Min([B:B])
…
  [L2] = Format(MaC, "hh:mm")
  Application.EnableEvents = 1  'pour libérer les évènements
End Sub
Maintenant, il faut traiter les changements
VB:
Dim T as Boolean  'à rajouter obligatoirement tout en haut
Private Sub Worksheet_Change(ByVal R As Range)
  If Not Intersect(R, [B2:G2,I2:L2]) Is Nothing Then
  T = [B2] = "" Or [G2] = "" Or [I2] = "" Or [L2] = ""
  If T Then Exit Sub   '4 saisies non vides pour conclure
  [D3] = [B2] & " " & Format([G2], "[$-409]h:mm AM/PM;@")
   [J3] = [I2] & " " & Format([L2], "[$-409]h:mm AM/PM;@")
  If CDate([D3]) > CDate([J3]) Then MsgBox "la date de début doit être inférieure à celle de la fin !", vbCritical, "Attention, erreur ..."
  [B3].Select  'ou autre action de nettoyage
  End If
End Sub
Je n'ai pas testé la validité des saisies donc à rajouter.
Tout se passe dans la feuille 1* alors il n'y a plus de WithEnd With donc de point.

Si je suis en dehors de la plaque, il y a quand même une sacrée réduction pour la recherche des dates minimale et maximale et pour l'indication des cellules concernées.

* je vois trop souvent des macros dans des Modules Standards quand tout se passe dans le même onglet donc des codes alourdis !
Il me semble que c'est bien plus simple quand on se dit « Je travaille sur une seule feuille donc je saisis mes macros dans la fenêtre de codes de celle-ci !».

je dois partir bosser je regarde + tard merci beaucoup
 

Jacky67

XLDnaute Barbatruc
Bon_soir

J'ai interprété la demande ainsi : 2 actions
Action 1 : mettre à jour la feuille à son activation après récupération des données. Là c'est simple avec les formats de date !
Action 2 : changements de saisie dans les cellules [B2], [G2], [I2] et [L2]. Cela se corse car la macro ci-dessus impacte l'évènementielle. Il faut se prémunir de cela en bloquant puis libérant les évènements.

* je vois trop souvent des macros dans des Modules Standards quand tout se passe dans le même onglet donc des codes alourdis !
Il me semble que c'est bien plus simple quand on se dit « Je travaille sur une seule feuille donc je saisis mes macros dans la fenêtre de codes de celle-ci !»
.
Bon_soir à toi aussi
Je suis entièrement d'accord avec toi
Mais dans ce fil la notion de code évènementiel n'est apparu qu'au 12ème message...
Tous ces codes ne me permettent pas de comprendre la finalité de ce classeur.
La modification de la date et de l'heure ne sera pas effectuée pour autant dans le classeur d'exportation(s'il y a), ni même dans le classeur en question.

Bonne nuit
 
Dernière édition:

zayab

XLDnaute Junior
Re

@zayab
Pour infos:
C'est un choix esthétique les cellules fusionnées?
(Tu peux obtenir le même effet en utilisant Centrer sur plusieurs colonnes)

Un choix pratique plutôt. Centrer sur plusieurs colonnes impose d'entrer les criteres de dates sur la cellule de gauche de la sélection. Ce sont des champs qui seront renseignés par les utilisateur pour extraire plusieurs rapport d'activités sur des créneaux réduits.
 

zayab

XLDnaute Junior
Re,


Je viens d'apprendre que le libre-arbitre serait un leurre (selon les neurosciences)
Du coup si je comprends ou pas la question, ce n'est pas de mon fait. ;)
"29/5/18 7:00 AM 31/5/18 6:00 PM trouer"
Cependant, je me demande bien qui creuse des trous (et dans quoi) durant un si grand laps de temps ;)
Au final, je crois bien que comme toi, Jacky67, je ne comprenne pas vraiment la demande du demandeur.

Mais celui-ci finira bien par trouver chaussure à son pied parmi toutes les réponses postées dans son fil.


Faut bien s'occuper... certain lime du 14/5/18 4:00 PM au 18/6/18 2:30 PM. Il doit plus rester grand chose à la fin:D
 

zayab

XLDnaute Junior
Merci Si...
Le code est clairement plus léger

Pourrais tu stp apporter un éclaircissement j ’avoue je nage
Dans "If Not Intersect(R, [B2:G2,I2:L2]) Is Nothing Then" qu'est ce que R vient faire?
que signifie "[$-409]h:mm AM/PM;@" que signifie [$-409] quel en est usage?
 

zayab

XLDnaute Junior
Re..
Bon,
Je ne comprend pas ce que tu veux faire avec ce classeur...
Tu veux mettre une date et une heure (max et min) dans des cellules à l'activation de la feuille et en même temps modifier ces cellules.
Si c'est cela , je ne pense pas que cela soit une bonne méthode
Je ne sais pas si JM à compris la même chose.
En pj, le classeur avec seulement la demande initiale.

Holala :eek::eek: Jacky67 :cool:a très bien vu j'ai fais une grosse erreur :(dans ma demande et mon fichier d'exemple qui trompe tout le monde

Je souhaite que à la 1ere activation de la Feuil1 [B2:G2,I2:L2] cette plage affiche 2 dates et heures (max et min) issue d'un autre onglet qui n'est pas présent dans mon exemple initial (ça sera Feuil2 - elle même une extraction) ce qui renvoi donc la totalité des données de Feuil2 dans la Feuil1

Pour qu'après l'utilisateur modifie ces cellules Feuil1 [B2:G2,I2:L2] ce qui renvoi dans le tableau de la Feuil1 l'ensemble des données selon ces nouveaux critères depuis les données de la Feuil2
Et si l'utilisateur saisie des date et heure de début B2:G2 anterieur a celle de la Feuil2 alors message d'erreur et retour à la saisie
idem avec date et heure de fin I2:L2 posterieur a celle de la Feuil2
idem si date et heure de fin antérieur à date et heure de début

Je joins un nouvel exemple
Je vais essayer maintenant que le problème est mieux posé avec l'aide des codes que vous avez tous apporté
Pas si facile d’être clair j’espère que ca l'est pour vous

Désolé du temps perdu:oops:
 

Pièces jointes

  • exemple.xlsm
    5.4 MB · Affichages: 22

Discussions similaires

Réponses
21
Affichages
384

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 084
Messages
2 085 192
Membres
102 809
dernier inscrit
Sandrine83