Microsoft 365 atteindre la 1ère date égale ou supérieure à aujourd'hui

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour à toutes et à tous,
J'espère que vous allez bien :)

J'ai besoin dans mon fichier d'atteindre la cellule qui contient la 1ère date égale ou supérieure à aujourd’hui.

J'ai fait pas mal de tests sans succès ... bcp de recherches et j'ai trouvé un code sur le forum :
#Post de CBernardT en 2006 que je remercie au passage :)

J'ai modifié le code pour qu'il corresponde au besoin de mon fichier.
ça fonctionne mais c'est très long et je ne sais pas comment l'améliorer.
J'ai joint un fichier qui contient une douzaine de milliers de lignes .... dans mon fichier de travail c'est 60.000 lignes et +++ et ce serait c'est très très très long
Auriez-vous une solution pour ce que soit plus rapide ?
Avec mes remerciements,
Je vous souhaite une belle journée,
Amicalement,
lionel,
 

Pièces jointes

  • TrouveDate_ProcheCLng(Date)2.xlsm
    279.7 KB · Affichages: 15
Dernière édition:
Solution
Je trouve cette solution plus élégante :
VB:
Sub ChercheDate()
Dim c As Range, dat As Date
On Error Resume Next 'si aucune SpecialCell
With [J:J].SpecialCells(xlCellTypeVisible)
    For dat = Int(Application.Min(Date, Application.Max(.Cells))) To Int(Application.Min(.Cells)) Step -1
        Set c = .Find(dat, , xlFormulas, xlPart, , IIf(dat = Date, xlNext, xlPrevious))
        If Not c Is Nothing Then
            c.Select 'pour tester
            Exit For
        End If
    Next
End With
End Sub

job75

XLDnaute Barbatruc
Je trouve cette solution plus élégante :
VB:
Sub ChercheDate()
Dim c As Range, dat As Date
On Error Resume Next 'si aucune SpecialCell
With [J:J].SpecialCells(xlCellTypeVisible)
    For dat = Int(Application.Min(Date, Application.Max(.Cells))) To Int(Application.Min(.Cells)) Step -1
        Set c = .Find(dat, , xlFormulas, xlPart, , IIf(dat = Date, xlNext, xlPrevious))
        If Not c Is Nothing Then
            c.Select 'pour tester
            Exit For
        End If
    Next
End With
End Sub
 

job75

XLDnaute Barbatruc
Chez moi la recherche d'une date sur 65 000 par la méthode Find prend au maximum 0,05 seconde.

Cela veut dire que la macro précédente peut prendre 1 seconde si 20 itérations de la boucle.

La solution par tableau VBA sera bien sûr beaucoup plus rapide.
 

job75

XLDnaute Barbatruc
Avec un tableau VBA ce n'est pas toujours le plus rapide mais c'est la sécurité :
VB:
Sub ChercheDate()
Dim cible As Date, P As Range, tablo, i&, x As Variant, lig&, maxi As Date
cible = Date 'modifiable
Set P = Intersect(ActiveSheet.UsedRange, [J:J])
If P Is Nothing Then Exit Sub
tablo = P.Resize(, 2) 'matrice, plus rapide, au moins 2 éléments
For i = 1 To UBound(tablo)
    x = tablo(i, 1)
    If IsDate(x) Then
        If x < cible + 1 Then
            If Not P(i).Rows.Hidden Then
                If Int(x) = cible Then
                    lig = i
                    Exit For
                ElseIf x > maxi Then
                    maxi = x
                    lig = i
                End If
            End If
        End If
    End If
Next
If lig Then P(lig).Select 'pour tester
End Sub
Sur 65 000 lignes la durée maximum d'exécution sera de 0,5 seconde chez moi.

Quelle que soit l'ordre des dates, quelles que soient les lignes masquées.

Re-bonne nuit.
 

job75

XLDnaute Barbatruc
Bonjour Lionel, le forum,

Ce n'était pas fini, il y a mieux.

Sur 65 000 lignes cette macro s'exécute en 0,05 seconde, elle est donc 10 fois plus rapide :
VB:
Sub ChercheDate()
Dim cible As Date, P As Range, tablo, i&, x As Variant, lig&, maxi As Date
cible = Date 'modifiable
Set P = Intersect(ActiveSheet.UsedRange, [J:J])
If P Is Nothing Then Exit Sub
Application.ScreenUpdating = False
On Error Resume Next 'si aucune SpecialCell
P.Columns(2).Insert xlToRight 'insère une colonne auxiliaire
P.Columns(2).SpecialCells(xlCellTypeVisible) = True 'repérage des lignes visibles
tablo = P.Resize(, 2) 'matrice, plus rapide
For i = 1 To UBound(tablo)
    x = tablo(i, 1)
    If IsDate(x) Then
        If x < cible + 1 Then
            If tablo(i, 2) Then 'si ligne visible
                If Int(x) = cible Then
                    lig = i
                    Exit For
                ElseIf x > maxi Then
                    maxi = x
                    lig = i
                End If
            End If
        End If
    End If
Next
P.Columns(2).Delete xlToLeft 'supprime la colonne auxiliaire
Application.ScreenUpdating = True
If lig Then P(lig).Select 'pour tester
End Sub
Bonne journée.
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour Gérard, le Forum,
J'espère que tout le monde va pour le mieux :)

Merci Gérard, pour ce code
imageonline-co-whitebackgroundremoved.png

effectivement très rapide et qui fonctionne nickel :)
Bonne journée Gérard, à toutes et à tous,
lionel,
 

job75

XLDnaute Barbatruc
Bah toutes mes macros traitent le problème de la 1ère date égale ou inférieure à aujourd'hui.

Si l'on veut la 1ère date supérieure à aujourd'hui il faut toutes les revoir, c'est un bon exercice.

Pour la dernière macro :
VB:
Sub ChercheDate()
Dim cible As Date, P As Range, mini As Date, tablo, i&, x As Variant, lig&
cible = Date 'modifiable
Set P = Intersect(ActiveSheet.UsedRange, [J:J])
If P Is Nothing Then Exit Sub
mini = Application.Max(P)
Application.ScreenUpdating = False
On Error Resume Next 'si aucune SpecialCell
P.Columns(2).Insert xlToRight 'insère une colonne auxiliaire
P.Columns(2).SpecialCells(xlCellTypeVisible) = True 'repérage des lignes visibles
tablo = P.Resize(, 2) 'matrice, plus rapide
For i = 1 To UBound(tablo)
    x = tablo(i, 1)
    If IsDate(x) Then
        If x >= cible Then
            If tablo(i, 2) Then 'si ligne visible
                If Int(x) = cible Then
                    lig = i
                    Exit For
                ElseIf x < mini Then
                    mini = x
                    lig = i
                End If
            End If
        End If
    End If
Next
P.Columns(2).Delete xlToLeft 'supprime la colonne auxiliaire
Application.ScreenUpdating = True
If lig Then P(lig).Select 'pour tester
End Sub
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 225
Messages
2 086 411
Membres
103 201
dernier inscrit
centrale vet