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 :
| ID | date | dé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 !.
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 SubMerci 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 SubHello,
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
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