Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Dernière ligne si Doublons

  • Initiateur de la discussion Initiateur de la discussion Chris401
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Chris401

XLDnaute Accro
Bonsoir

Quelqu'un peut-il me donner le code pour trouver la dernière ligne occupée par un mot

Feuille 1 : Une liste de noms uniques de A5 à A derligne
Feuille 2 : Une liste de noms pouvant se répéter de B2 à B derligne

Il n'est pas obligatoire de trouver les noms de Feuille 1 dans Feuille 2 (et vice-versa)

Pour chaque cellule de Feuille 1 :
- si le nom ne se trouve pas dans Feuille 2 alors la cellule Cx de feuille 1 est vide
- si le nom se trouve dans Feuille 2 alors la cellule Cx de feuille 1 = la cellule Hx de feuille 2 - MAIS x doit être la dernière ligne s'il y a doublons (ou plus)

Voir fichier

Merci de votre aide
Cordialement
Chris
 

Pièces jointes

Re : Dernière ligne si Doublons

Bonsoir,
à tester (validation matricielle) :
Code:
=SI(NB.SI(Feuil2!B$2:B$20;Feuil1!A5)=0;"";INDEX(Feuil2!H$2:H$20;EQUIV(MAX(SI(Feuil2!B$2:B$20=Feuil1!A5;LIGNE(Feuil2!H$2:H$20)));LIGNE(Feuil2!H$2:H$20);0)))
A+
 
Re : Dernière ligne si Doublons

Bonsoir David

Merci de ta réponse, mais j'aurais dû préciser que je désirais une macro car j'ai déjà les formules ; et comme il y a énormément de lignes les matricielles prennent un temps fou.

Cordialement
Chris
 
Dernière édition:
Re : Dernière ligne si Doublons

Re

A ma décharge, je demandais un code et je parlais de derligne ... 😀

Par contre, comme de l'ai précisé à Hippolite, je suis incapable d'adapter un code dès qu'il faut faire une boucle.

Cordialement
Chris
 
Re : Dernière ligne si Doublons

bonjour

avec le FindNext tu dois partir d'en haut est descendre pour finalement trouvé le dernier.
Je ferais plutot une boucle inversé qui part du bas.


Code:
Sub test()
For Each cell In Range("A:A").SpecialCells(xlCellTypeConstants): cell.Offset(, 2) = Correspondance(cell.Value): Next cell
End Sub

Function Correspondance(valeurCherche) As String
    For i% = Sheets("feuil2").Range("B65536").End(xlUp).Row To 2 Step -1
        If Sheets("feuil2").Range("B" & i) = valeurCherche Then Correspondance = Sheets("feuil2").Range("H" & i): Exit Function
    Next i
End Function
 

Pièces jointes

Re : Dernière ligne si Doublons

Re

C'est fou ce que quelques lignes de code peuvent faire !

Je vois que j'ai à faire à un chef, aussi je me permets de corser le problème si ce style de fonction le permet.

Si je n'ai pas fait ma demande complète dans mon 1er message c'est que je pensais qu'on me donnerait un code "classique" dans lequel j'aurais ajouté un If et un Offset (ça, je savais le faire)

Détail dans le fichier

Un grand merci pour ton aide.

Chris
 

Pièces jointes

Re : Dernière ligne si Doublons

Re,

donc...

Avec paramétrage, ca évite de bouclé 2 fois

Code:
Sub test()
For Each cell In Range("A:A").SpecialCells(xlCellTypeConstants): PlacerInfo cell: Next cell
End Sub

Function PlacerInfo(ByVal cell As Range)
    Dim v1$, d1#, v2$, d2#: Set sh = Sheets("feuil2")
    Parametrage sh, cell.Value, Cells(4, 3), Cells(4, 5), v1, d1, v2, d2
    cell.Offset(, 2) = v1: cell.Offset(, 3) = IIf(d1 = 0, "", d1): cell.Offset(, 4) = v2: cell.Offset(, 5) = IIf(d2 = 0, "", d2)
End Function

Function Parametrage(sh, nom, m1, m2, ByRef v1$, ByRef d1#, ByRef v2$, ByRef d2#)
    For i% = sh.Range("B65536").End(xlUp).Row To 2 Step -1
        valeur = sh.Range("J" & i): laDate = sh.Range("I" & i)
        If sh.Range("B" & i) = nom Then
            If Right(sh.Range("H" & i), Len(m1)) = m1 And v1 = "" Then v1 = valeur: d1 = laDate
            If Right(sh.Range("H" & i), Len(m2)) = m2 And v2 = "" Then v2 = valeur: d2 = laDate
        End If
        If v1 <> "" And v2 <> "" Then Exit For
    Next i
End Function
 

Pièces jointes

Re : Dernière ligne si Doublons

Bonjour

Je vois que tu es un couche tard ...

Merci pour ta solution. Le code fonctionne parfaitement bien.

Cependant le temps de traitement dans le fichier réel (800 lignes en Feuil1 et 2000 en Feuil2) est de 1:45 minutes ; ce qui est plus long que le recalcul de la feuille avec les formules matricielles.

Est-ce qu'il y a une autre solution ?

Cordialement
Chris
 
Re : Dernière ligne si Doublons

Bonjour à tous,
Pour réduire les temps de traitement,
1- Désactiver le rafraîchissement de l'écran avant la macro, et réactiver après :
Application.ScreenUpdating = False
' Faire plein de choses qui affectent le contenu des cellules
Application.ScreenUpdating = True
2- Bloquer éventuellement le recalcul automatique :
Application.Calculation = xlCalculationManual
Penser à remettre en automatique avant la fin de la macro :
Application.Calculation = xlCalculationAutomatic
3- si la macro déclenche des macros événementielles inutiles
Application.EnableEvents = False
Pensez à rétablir avant la fin de la macro :
Application.EnableEvents = True
A+
 
Re : Dernière ligne si Doublons

Bonjour Hippolite

J'ai fait ce que tu conseilles mais je ne gagne que 5 secondes puisque le temps est de 1:40 minutes.

Question bête : c'est bien dans la sub test qu'il faut mettre les application. ?

Voici le code :

Code:
Sub test()
Dim derlg As Long
Dim t
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
t = Time
derlg = Range("A65536").End(xlUp).Row
For Each cell In Range("A5:A" & derlg).SpecialCells(xlCellTypeConstants): PlacerInfo cell: Next cell
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With
MsgBox Format(Time - t, "hh:mm:ss")
End Sub
Cordialement
Chris
 
Re : Dernière ligne si Doublons

Re
A tester :
Code:
Sub test()
Dim MOT1 As String, MOT2 As String, PremAdresse, c, PlageNoms, Zone, i&, _
Nb As Byte, pos As Byte
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Set PlageNoms = Sheets("Feuil1").Range("A5:F" & Sheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row)
Set Zone = Sheets("Feuil2").Range("B2:J" & Sheets("Feuil2").Range("J" & Rows.Count).End(xlUp).Row)
MOT1 = "MOT1"
MOT2 = "MOT2"
For i = 1 To PlageNoms.Rows.Count
Nb = Application.WorksheetFunction.CountIf(Zone.Columns(1), PlageNoms(i, 1))
If Nb > 0 Then
With Worksheets(2).Range("B2:B" & Zone.Rows.Count + 1)
    Set c = .Find(PlageNoms(i, 1), LookIn:=xlValues, lookat:=xlWhole, searchdirection:=xlPrevious)
    If Not c Is Nothing Then
        PremAdresse = c.Address
        Do
        pos = InStr(1, CStr(Sheets("Feuil2").Range("H" & c.Row).Value), MOT1)
            If pos > 0 Then PlageNoms(i, 4) = Sheets("Feuil2").Range("I" & c.Row).Value: PlageNoms(i, 3) = _
            Sheets("Feuil2").Range("J" & c.Row).Value: Exit Do
            Set c = .FindPrevious(c)
        Loop While Not c Is Nothing And c.Address <> PremAdresse
    End If
End With
End If
Next i
For i = 1 To PlageNoms.Rows.Count
Nb = Application.WorksheetFunction.CountIf(Zone.Columns(1), PlageNoms(i, 1))
If Nb > 0 Then
With Worksheets(2).Range("B2:B" & Zone.Rows.Count + 1)
    Set c = .Find(PlageNoms(i, 1), LookIn:=xlValues, lookat:=xlWhole, searchdirection:=xlPrevious)
    If Not c Is Nothing Then
        PremAdresse = c.Address
        Do
        pos = InStr(1, CStr(Sheets("Feuil2").Range("H" & c.Row).Value), MOT2)
            If pos > 0 Then PlageNoms(i, 6) = Sheets("Feuil2").Range("I" & c.Row).Value: PlageNoms(i, 5) = _
            Sheets("Feuil2").Range("J" & c.Row).Value: Exit Do
            Set c = .FindPrevious(c)
        Loop While Not c Is Nothing And c.Address <> PremAdresse
    End If
End With
End If
Next i
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
A+
 
Dernière édition:
Re : Dernière ligne si Doublons

re,

Avec 6h de décalage, il n'était pas si tard...


Le code est asser simple et asser peu efficace
Pour chaque occurrences dans la feuil1, il boucle pratiquement la feuil2 en entier.
donc 1min40s pour 800*~2000 c'est relativement bon.

C'est possible de travailler avec des tableaux, sans doute plus rapide.
Alors que le plus efficace reste encore le module de classe.

a suivre...
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
1 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…