Extraire des données d'un tableau Excel selon un interval du temps

11excel.xlsx (8.74 Ko)

Bonjour à tous et à toutes;

SVP, pouvez-vous m'aider dans ce tableau excel. En faite, je veux apprendre une astuce qui me permet de garder les Y qui ont des observations continues de 2000 à 2005, soit 6 observations. Ceux qui ne suivent pas cette chronologie c'est à dire de 2000 à 2005 ou bien qui ont moins ou plus que 6 observations seront éliminées.

merci beaucoup.

Bonjour et bienvenue sur le forum

Un essai à tester. Te convient-il ?

11excel.xlsm (23.79 Ko)
Option Explicit

Dim dico As Object, tablo, tabloR(), cle
Dim i&, j&, n&, k&

Sub Extraire()

    tablo = Range("A1").CurrentRegion
    Set dico = CreateObject("Scripting.Dictionary")

    'on compte le nombre de valeurs de chague valeur différente de Y
    For i = 2 To UBound(tablo, 1)
        If dico.exists(tablo(i, 1)) Then
            dico(tablo(i, 1)) = dico(tablo(i, 1)) + 1
        Else
            dico(tablo(i, 1)) = 1
        End If
    Next i
    cle = dico.keys

    k = 0
    For n = 0 To dico.Count - 1
        If dico(cle(n)) = 6 Then
            For i = 2 To UBound(tablo, 1)
                If tablo(i, 1) = cle(n) Then
                    If tablo(i, 2) = 2000 Or tablo(i, 2) = 2001 _
                            Or tablo(i, 2) = 2002 Or tablo(i, 2) = 2003 _
                            Or tablo(i, 2) = 2004 Or tablo(i, 2) = 2005 Then
                        ReDim Preserve tabloR(1 To 4, 1 To k + 1)
                        For j = 1 To 4
                            tabloR(j, 1 + k) = tablo(i, j)
                        Next j
                        k = k + 1
                    End If
                End If
            Next i
        End If
    Next n
    Range("F2").CurrentRegion.Offset(1, 0).ClearContents
    Range("F2").Resize(UBound(tabloR, 2), 4) = Application.Transpose(tabloR)
End Sub

Bye !

Bonsoir à tous !

Une proposition Power Query :

Bonjour

Bonjour à tous

En comparant les résultats de ma copie à ceux de JFL (Salut à lui !) je m'aperçois que les miens sont faux ...

Un nouvel essai pour les corriger et ne pas rester sur un échec.

8excel.xlsm (23.88 Ko)
Option Explicit

Dim dico As Object, tablo, tabloR(), cle
Dim i&, j&, n&, k&

Sub Extraire()

    tablo = Range("A1").CurrentRegion
    Set dico = CreateObject("Scripting.Dictionary")

    'on compte le nombre de valeurs de chague valeur différente de Y
    For i = 2 To UBound(tablo, 1)
        If dico.exists(tablo(i, 1)) And tablo(i, 2) > 2000 And tablo(i, 2) <= 2005 Then
            dico(tablo(i, 1)) = dico(tablo(i, 1)) + 1
        Else
            dico(tablo(i, 1)) = 1
        End If
    Next i
    cle = dico.keys

    k = 0
    For n = 0 To dico.Count - 1
        If dico(cle(n)) = 6 Then
            For i = 2 To UBound(tablo, 1)
                If tablo(i, 1) = cle(n) Then
                        ReDim Preserve tabloR(1 To 4, 1 To k + 1)
                        For j = 1 To 4
                            tabloR(j, 1 + k) = tablo(i, j)
                        Next j
                        k = k + 1
                End If
            Next i
        End If
    Next n
    Range("F2").CurrentRegion.Offset(1, 0).ClearContents
    Range("F2").Resize(UBound(tabloR, 2), 4) = Application.Transpose(tabloR)
End Sub

Bye !

Bonjour à tous,

Une alternative en Sql avec requête imbriquée :

Sub Bilan()
Dim T As Variant

    Req = "SELECT `Y`,`nb` " & _
          " FROM (SELECT  `Y`, COUNT(`Date`) AS `nb` FROM [Feuil1$A:D]  " & _
          "  WHERE `Date` BETWEEN 2000 AND 2005 GROUP BY `Y`)" & _
          " WHERE `nb`=6"

    Connect_xls ThisWorkbook.FullName
    T = Select_Db(Req, 1)
    Close_Cnx

    Sheets("Feuil1").Range("G1:J500").ClearContents
    Sheets("Feuil1").Range("G1").Resize(UBound(T, 1), UBound(T, 2)) = T
End Sub
11copie-de-excel.xlsm (28.36 Ko)

Pierre

Bonjour à tous

Bonjour à JEL et GMB. Merci beaucoup pour vos réponses que j’apprécie beaucoup...

Il est clair que vous etes des pro en excel. Les résultats sont bonnes mais le script est complexe pour moi . Ma tableau réelle contient 402834 lignes, et l'interval temporel qui je veut le sélectionner est de 2005 à 2019 soit 15 observations. Mes questions si vous me permettez:

Est-ce que ces scripts sont valables dans ce cas?

Ou dois-je saisir ces scripts?

Excite-il une autre méthode qui se base sur le tableau croisée dynamique?

avec un grand merci.

Même si la question ne m'est pas adressée, dans l'alternative que je propose la requête devient :

    Req = "SELECT `Y`,`nb` " & _
          " FROM (SELECT  `Y`, COUNT(`Date`) AS `nb` FROM [Feuil1$A:D]  " & _
          "  WHERE `Date` BETWEEN 2005 AND 2019 GROUP BY `Y`)" & _
          " WHERE `nb`=15"

Et ce quelque soit le nb de lignes du tableau réel

Pierre

Bonjour de nouveau !

Je vous livre une version Power Query amendée qui intègre un tableau "Paramètres" pour faciliter la saisie des bornes de la périodicité choisie.

Votre volumétrie (+/- 400.000 lignes) n'est absolument pas un souci pour Power Query. Si la structure du fichier réel est conforme à votre exemple, la requête Power Query vous restituera le tableau attendu.

Vous pouvez aussi en passer par un TCD. Mais, sauf à faire intervenir du code VBA, vous n'aurez pas la même souplesse qu'avec Power Query. J'ai ajouté cette option à mon fichier (avec segment et différentes opérations manuelles). Cela me semble toutefois fastidieux. Peut-être que les spécialistes en TCD auront des solutions plus pertinentes à proposer !

Pour en revenir à Power Query : Menu Données / Requêtes et connexions puis clic droit sur "t_Data" vous ouvrira les portes de l'éditeur Power Query. Les différentes étapes appliquées à vos données initiales seront affichées alors à droite de votre écran.

Bonne découverte !

bonjour de nouveau;

Merci beaucoup Pierrep56, JFL et gmb.

je vais essayer avec les différentes méthodes et j'espère que j'arriverai à trouver les bonnes résultats.

Grand merci pour votre aide !

Nadia.

Rechercher des sujets similaires à "extraire donnees tableau interval temps"