Macro pour trouver la dernière ligne qui contient un mot X.

Goundard

XLDnaute Nouveau
Bonjour,

je cherche un moyen de sélectionner la dernière ligne contenant un mot dans la colonne J. Je m'explique, j'ai une colonne (J) qui contient une description ex Frais 1, frais 2, frais 3, Retrait 1, Dépôt 3, etc... à la base ils sont trié de manière à ce que tout les types de frais ce trouve en haut de ma feuille. Toutefois je dois aller sélectionner la dernière ligne qui contient Frais dans sa description pour ensuite insérer un ligne pour séparer le bloc du reste.

Frais 1
Frais 2
Frais 3
Retrait 1
Dépôt 3
Retrait 4.

J'ai chercher et essayer ce que je pouvais avec mes connaisances mais il me manque encore certaines notions. Si quelqu'un peut me débloquer je serais plus qu'heureux :D

Merci à l'avance.
 

job75

XLDnaute Barbatruc
Re : Macro pour trouver la dernière ligne qui contient un mot X.

Bonsoir Goundard,

Il faut en effet que la colonne J soit triée en ordre croissant.

Elle se présentera alors ainsi :

Dépôt 3
Frais 1
Frais 2
Frais 3
Retrait 1
Retrait 4

Le numéro de la dernière ligne contenant "Frais" sera donné par la formule :

Code:
=EQUIV("Frais*";J:J)
En VBA cela se traduira par exemple par cette macro :

Code:
Sub Test()
Dim t As String, lig As Variant
t = "Frais" 'à adapter éventuellement
lig = Application.Match(t & "*", [J:J])
If IsNumeric(lig) Then Range("J" & lig).Select
End Sub
A+
 

Goundard

XLDnaute Nouveau
Re : Macro pour trouver la dernière ligne qui contient un mot X.

Merci pour la réponse, malheureusement je ne peux pas trier la feuille, mais les frais sont toujours au début de la feuille comme montré dans mon exemple. Est-ce qu'il y a moyen de passer par dessus celà? J'ai aussi essayer le code EQUIV mais il me renvoie à la ligne 810 alors que mes frais arrête à la ligne 780. Je suis vraiment bloqué :(
 

job75

XLDnaute Barbatruc
Re : Macro pour trouver la dernière ligne qui contient un mot X.

Bonsoir Goundard,

Si les items "Frais" sont groupés :

Code:
=EQUIV(B9&"*";J:J;0)+NB.SI(J:J;B9&"*")-1
Code:
Sub Test()
Dim t As String, lig As Variant
t = "Frais" & "*" 'à adapter éventuellement
lig = Application.Match(t, [J:J], 0) '1ère ligne
If IsNumeric(lig) Then
  lig = lig + Application.CountIf([J:J], t) - 1 'dernière ligne
  Range("J" & lig).Select 'facultatif
  MsgBox "Ligne " & lig 'facultatif
End If
End Sub
Fichier joint.

A+
 

Pièces jointes

  • Dernière ligne(1).xls
    36.5 KB · Affichages: 52

job75

XLDnaute Barbatruc
Re : Macro pour trouver la dernière ligne qui contient un mot X.

Re,

Maintenant si les items du même genre ne sont pas groupés, formule matricielle :

Code:
=SI(B11="";"";MAX(ESTNUM(CHERCHE(B11;Liste))*LIGNE(Liste)))
Et cette macro :

Code:
Sub Test()
If [B11] = "" Then Exit Sub
Dim t As String, a, i As Long, lig As Long
t = LCase([B11]) & "*" 'à adapter éventuellement"
a = [Liste] 'matrice, plus rapide
For i = 1 To UBound(a)
  If LCase(a(i, 1)) Like t Then lig = i
Next
[Liste].Cells(lig).Select
MsgBox "Ligne " & lig 'facultatif
End Sub
Liste de validation en B11.

Fichier (2).

A+
 

Pièces jointes

  • Dernière ligne(2).xls
    41.5 KB · Affichages: 65

klin89

XLDnaute Accro
Re : Macro pour trouver la dernière ligne qui contient un mot X.

Bonsoir Goundard, job75

Une formule matricielle :
Les données figurant en plage J2:J7
Code:
{=MAX(LIGNE(J2:J7)*(GAUCHE(J2:J7;6)="Frais "))}
Reste à traduire en VBA :(
Klin89
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Macro pour trouver la dernière ligne qui contient un mot X.

Bonjour Goundard, job75 :)

Un autre essai. Pour insérer une ligne (soit uniquement dans la colonne de recherche, soit une ligne complète ) activer l'instruction option 1 ou bien option 2.
VB:
Sub derListe(liste As Range, quoi)
Dim xrg As Range
  Set xrg = liste.Find(what:=quoi & "*", LookIn:=xlValues, lookat:=xlPart, _
    SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False)
  If Not xrg Is Nothing Then
    xrg.Select
'    puis option 1 - insère une ligne uniquement dans la colonne de recherche
    xrg.Offset(1).Insert xlShiftDown
'    ou bien option 2 - insère une ligne complète
'    xrg.Offset(1).EntireRow.Insert xlShiftDown
  Else
    MsgBox """" & quoi & "*"" -> non trouvé."
  End If
End Sub
 

Pièces jointes

  • trouver derniere cellule debutant par xxx v1.xlsm
    24.1 KB · Affichages: 71

Si...

XLDnaute Barbatruc
Re : Macro pour trouver la dernière ligne qui contient un mot X.

salut

Si... on connait la première contenant le texte à chercher (3 par exemple)
Code:
Option Compare Text
Sub Insère()
   Rows(Application.CountIf([J:J], "frais*") + 3).Insert
End Sub
sinon on la cherche
Code:
Option Compare Text
Sub Insère2()
  Rows(Application.CountIf([J:J], "frais*") + Columns(10).Find("frais*").Row).Insert
End Sub

On peut introduire une variable de recherche et des garde-fous.
 

Goundard

XLDnaute Nouveau
Re : Macro pour trouver la dernière ligne qui contient un mot X.

Je me sens vraiment bête -_- j'ai pas pensé dire que ma macro ce fait à partir d'un autre classeur. J'ai essayé d'adapter vos formules en insèrant la feuille voulu mais j'ai toujours des erreurs 400. Est-ce qu'il y a un moyen rapide pour ne pas toujours inscrire Sheets("feuil1").blablabla ?

Merci beaucoup et je suis désolé pour l'oubli, les joie d'être débutant...
 

tany

XLDnaute Occasionnel
Re : Macro pour trouver la dernière ligne qui contient un mot X.

Bonjour,
je dépose un numéro incrémenté dans la dernière cellule de la colonne B par ceci
Cells(Cells(Rows.Count, "B").End(xlUp).Row + 1, 2).Select
ActiveCell.Value = Range("G2").Value + 1
et ça marche au poil depuis...
 

Goundard

XLDnaute Nouveau
Re : Macro pour trouver la dernière ligne qui contient un mot X.

J'ai trouvé une macro que j'ai pu adapter mais j'ai un petit problème. Voici le code

Code:
Sheets("Règlement Financier").Select
    
For i = Sheets("Règlement Financier").Range("J65535").End(xlUp).Row To 3 Step -1
    If Sheets("Règlement Financier").Cells(i, 10) = "FRAIS*" Then
    Sheets("Règlement Financier").Rows(i).Select
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    End If
Next i

Toutefois si je met FRAIS* il ne sépare rien mais si je mets le nom complet réel d'un de mes frais alors il les sépare. Donc je vois que ca marche bien mais on dirait qu'il ne lit pas le *. Une idée?
 

Discussions similaires

Réponses
12
Affichages
558