1ere et dernière ligne d'une valeur répétitive dans une plage de donnée

Bonjour à tous !

Je suis actuellement en train de créer un macro sur VBA pour importer des données d'un fichier excel vers un autre.

Je cherche à trouver la 1ere ligne et la dernière ligne d'une valeur répétée dans une plage de données.

Exemple :

IDdatedépartement
1
01/01/2025
56
2
03/05/2024
72
2
04/11/2025
35
3
06/08/2023
01

Il faudrait une formule VBA qui ressorte la 1ere ligne de la valeur 2 (ici 3) et la dernière ligne de la valeur 2 (ici 4).

Le but final est d'avoir une feuille excel avec une cellule qui contient l'ID souhaité et un bouton VBA. Quand l'utilisateur appui sur le bouton, la macro va regarder la valeur ID dans la cellule et ressortir toutes les lignes concerné par cet ID avec les valeurs de date et département.

Dites moi si ce n'est pas clair ?

Merci infiniment !

Bonjour à tous !

Et.....

L'outil idoine pour lire, retraiter et amender une source externe est Power Query. Cet outil est nativement intégré dans votre environnement Excel.

Votre demande est ambiguë.
Si pour un ID donné, il existe 3 lignes (par exemple), faut-il retourner les lignes 1 et 3 ou toutes les lignes ?

Bonjour JFL

En fait mon excel source, celui qui contient des données, est constitué de plusieurs dizaines de milliers de lignes.

Et comme j'utilise des boucles je voudrais optimiser le code pour ne pas avoir à analyser la totalité de l'excel à chaque fois.

Il faudrait donc qu'au début la macro analyse tout les ID et sorte la 1ere et derniere ligne pour que la boucle utilise cette donnée et non la totalité de l'excel.

J'espère avoir répondu à ta question,

Merci !

Bonjour à tous de nouveau !

VBA semblant être un point de passage obligé, je laisse le soin aux spécialistes de la chose de vous accompagner

Bonne continuation !.

Une proposition PowerQuery :

Pas besoin de VBA, PQ est beaucoup plus adapté

14book1.xlsx (20.23 Ko)

Merci pour ton alternative saboh12617 !

Cependant l'excel source est variable d'un mois à l'autre et d'une année à l'autre j'ai besoin de VBA.

Est ce que quelqu'un aurait une solution ?

J'ai du mal à comprendre ce que vous voulez dire, cette histoire d'année/mois n'a pas été évoquée dans la question. Ci-après un code qui vous extrait les lignes d'ID correspondant à la recherche. En se basant sur mon dernier fichier joint.

Public Sub FiltreVBA()
  Dim searchID As Long: searchID = Range("searchID").Value2

  Dim tblData As ListObject
  Set tblData = Sheet1.ListObjects("tblData")

  tblData.Parent.AutoFilterMode = False

  Dim rngRes As Range
  With tblData.DataBodyRange
    .AutoFilter 1, CStr(searchID)
    On Error Resume Next
    Set rngRes = .SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    If Not rngRes Is Nothing Then
      rngRes.Copy Sheet1.Cells(Rows.Count, 9).End(xlUp).Offset(2)
    End If
    .AutoFilter
  End With
End Sub

Merci pour ton code !

Je ne l'avais pas mentionné plus tôt car je ne pensais pas que ce serait pertinent, mais voici ce que j’essaie de faire :

L’objectif final est que, lorsqu’un utilisateur clique sur un bouton, un ensemble de données se mette à jour automatiquement. Pour cela, je dois créer une macro capable d’aller chercher des informations dans 4 ou 5 fichiers Excel différents, chacun avec une structure propre.

L’un de ces fichiers contient plus de 100 000 lignes et s’enrichit progressivement au fil de l’année. C’est d’ailleurs à cause de celui-là que j’ai posté un message sur le forum.

Ensuite, la macro doit interroger d'autres fichiers Excel, plus petits, qui changent chaque mois (par exemple : A_Manger_2025_05.xlsx, puis A_Manger_2025_06.xlsx, etc.). L’idée, c’est que la macro puisse vérifier quels mois ont déjà été importés, ignorer ceux qui le sont déjà, et ajouter uniquement les nouveaux. Le nom des excel change chaque mois mais la structure reste la même.

Voici ce que j’ai réussi à bricoler jusqu’à maintenant. Toute aide est la bienvenue :) (je débute en VBA)

Sub Bouton1_Cliquer()

Dim fichiersource As String
fichiersource = "fichier 2.xlsx" 'ici je nomme mon fichier 2 (source) pour pouvoir modif le nom'

Dim fichier_destination As String
fichier_destination = "fichier 1.xlsm"

Dim chemin As String  'va chercher le chemin du fichier destination'
chemin = "\\XXXXXX\fichier 2.xlsx"

Workbooks(fichier_destination).Activate
Dim numérovoulu As Double                                   'ici je lui donne le code installation pour qu'il puisse le comparer dans la liste des cubes'
numérovoulu = Sheets("feuil1").Range("F2").Value

Workbooks.Open chemin 'va ouvrir le fichier au bout du chemin'

Workbooks(fichiersource).Activate

Dim L As Long
L = Sheets("feuil1").Range("A10000").End(xlUp).Row

Dim numéroinsta As Double
Dim ladate As Date
Dim ph As Double
Dim mes As Double

For i = 2 To L

    numéroinsta = Sheets("feuil1").Range("A" & i).Value     'ici c'est pour rentrer les valeurs d'une ligne dans des variables'
    If numéroinsta = numérovoulu Then
    ladate = Sheets("feuil1").Range("B" & i).Value
    ph = Sheets("feuil1").Range("C" & i).Value
    mes = Sheets("feuil1").Range("D" & i).Value

    Workbooks(fichier_destination).Activate
    Sheets("feuil1").Select
    Dim L2 As Long
    L2 = Sheets("feuil1").Range("A10000").End(xlUp).Row + 1

    Sheets("feuil1").Range("A" & L2).Value = numéroinsta        'ici c'est pour imprimer les variables dans les cellules cible'
    Sheets("feuil1").Range("B" & L2).Value = ladate
    Sheets("feuil1").Range("C" & L2).Value = ph
    Sheets("feuil1").Range("D" & L2).Value = mes
    Workbooks(fichiersource).Activate

    Else
    End If

Next i

Workbooks(fichiersource).Close savechanges:=True 'ferme et enregistre le fichier reception'

Workbooks(fichier_destination).Activate

MsgBox "info transmise"

End Sub

Hello,

Honnêtement vous devriez considérer la piste PowerQuery qui contient des connecteurs directs aux fichiers Excel, et tout autre type de source.

Peut être qu'avec des exemples de fichiers anonymisés nous pouvons faire un test ?

@+

Comme évoqué par Baroute et JFL, vous n'utilisez pas l'outil adapté. De base le VBA est lent, et votre code l'est encore plus. Prenez donc le temps de vous renseigner sur PowerQuery, et si vous voulez une aide concrète joignez un fichier.

Bonne journée.

Bonjour,

en lisant le premier message je reste perplexe..." La première valeur 2(ici 3) et la dernière valeur 2 (ici 4)" par rapport au tableau...

Après est-ce que l'idée d'un tableau (liste) de fichier déjà rapatrié pourrait faire l'affaire ? Comme cela avant d'aller chercher une donner sur le fichier du mois de juin, on vérifie s'il n'est pas inscrit sur cette liste : si oui, on y va pas, si non on y va et on l'inscrit à la suite sur la liste.

Liste des fichiers rapatriés
A_Manger_2025_04
A_Manger_2025_05

Ici juin n'y est pas alors on récupère ses données...

@ bientôt

LouReeD

Bonjour Annibal, à tous ,

Une fonction VBA qui renvoie le numéro de la première ligne ou de la dernière ligne d'une plage en colonne contenant la valeur cherchée.

Cette fonction est utilisable soit dans une feuille de calcul Excel ou directement dans du code VBA.

La fonction : Function ChercheNumLigABS(Plage, quoi, dernier)
on recherche la valeur quoi dans la 1ère colonne de la plage Plage
si dernier est absent, on renvoie le numéro absolu de la première ligne contenant quoi
si dernier est présent (et vaut n'importe quoi), on renvoie le numéro absolu de la dernière ligne contenant quoi

nota : une autre version (aussi dans le classeur joint) ChercheNumLigREL(Plage, quoi, dernier) renvoie le numéro relatif à la première cellule de Plage et non le n° absolu au sein de la feuille..

  • En colonne E à L, les tableaux montrent une utilisation des fonctions sur une feuille de calcul
  • Le bouton "Chercher" recherche la valeur de G17 au sein de la plage via une macro VBA 'Test' utilisant les deux fonctions

Le code (garanti sans boucle et sans IA ) dans Module1 de la fonction ChercheNumLigABS est un peu commenté :

Function ChercheNumLigABS(Plage As Range, quoi, Optional dernier) As Long
' on recherche la valeur quoi dans la  1ère colonne de la Plage
' si dernier est absent, on renvoie le numéro absolu de la première ligne contenant quoi
' si dernier est présent, on renvoie le numéro absolu de la dernière ligne contenant quoi
Dim premCol As Range, Cell As Range, ligne As Long
   If Plage Is Nothing Then Exit Function    ' si la plage est vide, on quitte
   Set premCol = Plage.Columns(1)            ' première colonne de la plage
   On Error Resume Next                      ' si quoi n'est pas dans premCol
   If Not IsMissing(dernier) Then            ' dernier est présent, on recherche le dernier quoi
      Set Cell = premCol.Cells(1, 1)         ' cellule de départ (première cellule de premCol)
      ' on recherche quoi AVANT la cellule de départ Cell (ce sera la dernière cellule avec quoi)
      ligne = premCol.Find(What:=quoi, After:=Cell, LookIn:=xlValues, LookAt:= _
         xlWhole, SearchDirection:=xlPrevious, MatchCase:=False, SearchFormat:=False).Row
   Else
      Set Cell = premCol.Cells(premCol.Rows.Count, 1) ' cellule de départ (dernière cellule de premCol)
      ' on recherche quoi APRES la cellule de départ Cell (ce sera la première cellule avec quoi)
      ligne = premCol.Find(What:=quoi, After:=Cell, LookIn:=xlValues, LookAt:= _
         xlWhole, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Row
   End If
      On Error GoTo 0            ' on rétablit l'interception des erreurs
      ChercheNumLigABS = ligne      ' on affecte le numéro de ligne à la fonction
End Function
Rechercher des sujets similaires à "1ere derniere ligne valeur repetitive plage donnee"