Trouver la première et dernière ligne correspondant à un critère de date

Sebast

XLDnaute Impliqué
Bonjour à toutes et à tous,

j'importe dans l'onglet Destination des données à stocker, qui transitent par l'onglet Origine
Dans Origine, j'extrais la date la plus lointaine et la plus proche et toutes les dates au sein de cette plage sont à supprimer dans Destination, avant remplacement par celles d'Origine

Le fichier joint est un tout petit extrait mais avec les données réelles, ma méthode de purge est trop longue et je voudrais l'améliorer en ne balayant plus toute la base mais en définissant une plage
que je supprimerais d'un seul coup.
En effet, la boucle suivante n'est vraiment pas performante car je passe tout en revue, de la première à la dernière ligne … :

Code:
For i = dernlign To 2 Step -1
     If Cells(i, 1) >= Min_Tranche And Cells(i, 1) <= Max_Tranche Then Rows(i).Delete
Next i

Mon problème est que je ne sais pas comment trouver la ligne correspondant au critère de date donné.

Qui peut me dire comment trouver la première ligne correspondant au minimum d'une plage (critère=date) et la dernière ligne correspondant au maximum de la plage (critère=date) ?

Je pense que tout sera plus clair avec le fichier joint

Merci d'avance pour votre aide
 

Pièces jointes

  • Bloc_à_supprimer.xlsm
    211.2 KB · Affichages: 58

Pierrot93

XLDnaute Barbatruc
Re : Trouver la première et dernière ligne correspondant à un critère de date

Bonjour,

essaye ceci, utilisation du filtre automatique :
Code:
Option Explicit
Sub test()
Dim p As Range, m1 As Long, m2 As Long

With Sheets("Origine")
    m1 = Application.Min(.Range("A2", .Cells(.Rows.Count, 1).End(xlUp)))
    m2 = Application.Max(.Range("A2", .Cells(.Rows.Count, 1).End(xlUp)))
End With

With Sheets("Destination")
    If .FilterMode Then .ShowAllData
    .Range("A1").AutoFilter 1, ">" & Format(m1, "mm/dd/yyyy"), xlAnd, _
        "<" & Format(m2, "mm/dd/yyyy")
    With .Range("_FilterDatabase")
        If WorksheetFunction.Subtotal(3, .Offset(1).Resize(.Rows.Count - 1, 1)) > 0 Then
            .Offset(1).Resize(.Rows.Count - 1).EntireRow.Delete
        End If
    End With
    .ShowAllData
End With

End Sub

peut être lieu de rajouter = à < et > si tu veux tester supérieure et égal et inférieure et égal...

bon après midi
@+
 

Sebast

XLDnaute Impliqué
Re : Trouver la première et dernière ligne correspondant à un critère de date

Bonjour Pierrot,

merci pour ton code, je suis en train de tester mais je m'y perds un peu : beaucoup de notions nouvelles pour moi !
Pour revenir à mon idée initiale, n'y a-t-il pas une instruction intégrée qui renvoie le rang de la ligne correspondant à un critère ?

bon après-midi
 

Pierrot93

XLDnaute Barbatruc
Re : Trouver la première et dernière ligne correspondant à un critère de date

Re,

pour utiliser "find" afin d'obtenir les numéros de ligne....
Code:
Sub test2()
Dim p As Range, m1 As Date, m2 As Date
Dim x As Long, y As Long
With Sheets("Origine")
    Set p = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
End With
m1 = Application.Min(p)
m2 = Application.Max(p)
'Première ligne contenant m1
x = p.Find(m1, Cells(p.Rows.Count, 1), xlValues, xlWhole, 1, 1, 0).Row
'Dernière ligne contenant m2
y = p.Find(m2, Cells(p.Rows.Count, 1), xlValues, xlWhole, 1, 2, 0).Row
End Sub
 

Sebast

XLDnaute Impliqué
Re : Trouver la première et dernière ligne correspondant à un critère de date

Pierrot,

Merci pour ton dernier code que j’ai testé, mais en fait j’avais probablement mal formulé mon besoin au début de ce fil.
J’ai essayé d’adapter ton code à mon besoin et je n’y arrive pas quand je passe d'un onglet à l'autre.

Pour être synthétique, ce que je voudrais :

1) Dans « Origine », je repère la date la plus récente et la plus ancienne (qui donc forment un intervalle)
2) Avec ces deux valeurs, je veux marquer dans « Destination » les lignes qui se trouveraient dans cet intervalle (car « Destination » est trié par date ; en rose dans le fichier joint)
3) Je supprime dans « Destination » le bloc ainsi formé (en une seule opération, sans avoir à balayer toute la base)

Comme tu peux le voir dans le fichier joint, j’ai essayé d’adapter mais ça coince quand je passe à l’onglet « Destination » : les instructions sont pourtant semblables ...

Merci d'avance pour ton aide
 

Pièces jointes

  • Bloc_à_supprimer_V2.xlsm
    185.9 KB · Affichages: 47

Pierrot93

XLDnaute Barbatruc
Re : Trouver la première et dernière ligne correspondant à un critère de date

Bonjour,

normal, dans ton fichier, onglet "origine" la date la plus ancienne est le 10/01/2000, mais comme cette date n'existe pas dans l'onglet destination.. message d'erreur....

bonne journée
@+
 

Sebast

XLDnaute Impliqué
Re : Trouver la première et dernière ligne correspondant à un critère de date

Bonjour Pierrot,

merci pour ta vigilance. Effectivement, c'est la raison du plantage. Je vais placer un test sur la date pour contourner le problème.

Juste pour pouvoir avancer, et comme je ne connaissais pas la syntaxe du style :

Code:
y = p.Find(m2, Cells(p.Rows.Count, 1), xlValues, xlWhole, 1, 2, 0).Row

1) le p revient à factoriser le range défini plus haut ?

2) dans cette ligne, contrairement à x, tu as les paramètres 1,2,0
le 2 signifie "dernière ligne" ?

Merci et bonne journée
 

Pierrot93

XLDnaute Barbatruc
Re : Trouver la première et dernière ligne correspondant à un critère de date

Re,

1) le p revient à factoriser le range défini plus haut ?

oui effectivement, utilisation d'une variable de type "range"

2) dans cette ligne, contrairement à x, tu as les paramètres 1,2,0
le 2 signifie "dernière ligne" ?

les arguments sont les suivants :
SearchOrder : 1= xlByRows, 2 = xlByColumns
SearchDirection : 1 = xlNext, 2 = xlPrevious
MatchCase : 0 = False
 

Sebast

XLDnaute Impliqué
Re : Trouver la première et dernière ligne correspondant à un critère de date

Pierrot,

j’ai essayé de trouver un moyen de contourner le problème en mettant un test sur la date mais avec cette instruction Find, j’ai l’impression qu’il faut absolument une stricte correspondance, sinon ça plante.

Existe-t-il à ta connaissance un paramètre qui permet de se positionner sur la valeur immédiatement proche ?

Pour résumer, si dans » Origine » mon intervalle va du 01/03/2012 au 15/06/2012, je veux donc supprimer les enregistrements dans » Destination » présents dans cet intervalle mais si par exemple pile le 15/06/2012 il n’y a pas de ligne dans Destination, alors ça plante.

Comment trouver par exemple que le 17/06/2012 est la borne haute ?

J’ai regardé l’aide microsoft sur Find, mais pas très didactique …

As-tu une idée

Merci d’avance
 

Discussions similaires

Statistiques des forums

Discussions
312 109
Messages
2 085 384
Membres
102 878
dernier inscrit
asmaa