Macro
Résolu/Fermé
A voir également:
- Macro
- Macro word - Guide
- Macro logiciel - Télécharger - Organisation
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Macro recorder - Télécharger - Confidentialité
- Macro souris ✓ - Forum Windows
3 réponses
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 743
5 avril 2016 à 12:51
5 avril 2016 à 12:51
Bonjour tous les deux,
Il y a plus simple qu'une boucle sur toutes les lignes.
Vous pourriez utiliser la méthode find.
Regardez ce bout de code :
Il y a plus simple qu'une boucle sur toutes les lignes.
Vous pourriez utiliser la méthode find.
Regardez ce bout de code :
Dim rngCell As Range, mot As String, Ligne As Long mot = InputBox("nom") Set rngCell = Sheets("Feuil1").Range("A1:A22").Cells.Find(what:=mot) If rngCell Is Nothing Then MsgBox "Pas trouvé " & mot Exit Sub Else Ligne = rngCell.Row End If
Utilisateur anonyme
Modifié par albkan le 5/04/2016 à 05:57
Modifié par albkan le 5/04/2016 à 05:57
Bonjour,
Dans ton code, tu as oublié le Next correspondant à For each ;
les lignes 5 et 7 doivent être sur une seule ligne ; mais de toute façon, je te propose quelque chose qui devrait mieux te plaire.
J'ai appelé ma macro Essai ; tu lui donnera le nom que tu préfère. Voici plusieurs remarques importantes :
1) Cette sub marche quelle que soit la longueur de ta liste,
et pas seulement pour 22 lignes !
2) Le Mot que tu introduit doit avoir au minimum 3 caractères,
sinon, la sub ne fera rien.
3) Pour la recherche :
a) La sub recherche le Mot en colonne A, à partir de la ligne 1 et vers le bas.
b) La recherche s'arrête dès qu'elle rencontre une cellule vide (même si ta colonne A est vide et qu'il n'y a rien en cellule A1).
c) S'il y a une ou plusieurs cellules vides dans ta liste de mots, la recherche s'arrêtera dès la première cellule vide rencontrée et ignorera tous les mots situés en dessous ; mais en principe, ta liste doit être continue et ne doit comporter aucun « trou » !
d) Si la recherche trouve le Mot que tu as introduit, elle sélectionnera la ligne correspondante et s'arrêtera aussitôt ; sinon, elle ne fera rien du tout et si une ligne était sélectionnée avant, elle la laissera ainsi ; ce qui signifie qu'une ligne sélectionnée ne sera pas forcément le résultat de la dernière recherche !
Dans ton code, tu as oublié le Next correspondant à For each ;
les lignes 5 et 7 doivent être sur une seule ligne ; mais de toute façon, je te propose quelque chose qui devrait mieux te plaire.
J'ai appelé ma macro Essai ; tu lui donnera le nom que tu préfère. Voici plusieurs remarques importantes :
1) Cette sub marche quelle que soit la longueur de ta liste,
et pas seulement pour 22 lignes !
2) Le Mot que tu introduit doit avoir au minimum 3 caractères,
sinon, la sub ne fera rien.
3) Pour la recherche :
a) La sub recherche le Mot en colonne A, à partir de la ligne 1 et vers le bas.
b) La recherche s'arrête dès qu'elle rencontre une cellule vide (même si ta colonne A est vide et qu'il n'y a rien en cellule A1).
c) S'il y a une ou plusieurs cellules vides dans ta liste de mots, la recherche s'arrêtera dès la première cellule vide rencontrée et ignorera tous les mots situés en dessous ; mais en principe, ta liste doit être continue et ne doit comporter aucun « trou » !
d) Si la recherche trouve le Mot que tu as introduit, elle sélectionnera la ligne correspondante et s'arrêtera aussitôt ; sinon, elle ne fera rien du tout et si une ligne était sélectionnée avant, elle la laissera ainsi ; ce qui signifie qu'une ligne sélectionnée ne sera pas forcément le résultat de la dernière recherche !
Option Explicit Sub Essai() Dim Mot As String, dv As Long Mot = InputBox("Nom"): If Len(Mot) < 3 Then Exit Sub With [A1] Do If IsEmpty(.Offset(dv)) Then Exit Do If .Offset(dv) = Mot Then Rows(dv + 1).Select: Exit Do dv = dv + 1 Loop End With End Sub
J'ai oublié une précision importante :
Si le Mot recherché apparaît dans la liste plus d'une fois, la recherche s'arrêtera pour le 1er Mot rencontré (après avoir sélectionné la ligne correspondante) et ignorera ceux qui suivent.
Si ta liste doit comporter des doublons, cette sub n'est pas valable
et il faudra l'écrire autrement !
------------------------------------------------------------------------------------------------------------
pijaku a raison dans son message 2 (voir ci-dessous) : on pourrait utiliser la méthode Find.
Je la connaissais déjà, et j'y avais bien pensé ; mais j'y ai renoncé car en écrivant le code comme il l'a fait, avec .Range("A1:A22"), la sub est limitée à 22 lignes !
On pourrait utiliser à la place .Columns(1), mais s'il y a un autre tableau sous ta liste, ça posera problème, car le Find pourrait trouver Mot dans cette 2ème table alors que tu veux que ça marche seulement pour
la 1ère table.
Voici alors une autre solution qui recherche la dernière ligne de ta liste AVANT utilisation de la méthode Find :
ATTENTION : Ci-dessus, les lignes de code 10 et 11 doivent être sur la même ligne ! De même pour les lignes 12 et 13 !
Si le Mot recherché apparaît dans la liste plus d'une fois, la recherche s'arrêtera pour le 1er Mot rencontré (après avoir sélectionné la ligne correspondante) et ignorera ceux qui suivent.
Si ta liste doit comporter des doublons, cette sub n'est pas valable
et il faudra l'écrire autrement !
------------------------------------------------------------------------------------------------------------
pijaku a raison dans son message 2 (voir ci-dessous) : on pourrait utiliser la méthode Find.
Je la connaissais déjà, et j'y avais bien pensé ; mais j'y ai renoncé car en écrivant le code comme il l'a fait, avec .Range("A1:A22"), la sub est limitée à 22 lignes !
On pourrait utiliser à la place .Columns(1), mais s'il y a un autre tableau sous ta liste, ça posera problème, car le Find pourrait trouver Mot dans cette 2ème table alors que tu veux que ça marche seulement pour
la 1ère table.
Voici alors une autre solution qui recherche la dernière ligne de ta liste AVANT utilisation de la méthode Find :
Option Explicit Sub Essai() Dim Mot As String, cellX As Range, lig As Long Mot = InputBox("Nom :"): If Len(Mot) < 3 Then Exit Sub Do lig = lig + 1: If IsEmpty(Cells(lig, 1)) Then Exit Do Loop Set cellX = Sheets("Feuil1").Range("A1:A" & lig - 1).Cells.Find(what:=Mot) If cellX Is Nothing Then MsgBox "Mot " & Chr$(34) & Mot & Chr$(34) & " non trouvé !" Else Rows(cellX.Row).Select End Sub
ATTENTION : Ci-dessus, les lignes de code 10 et 11 doivent être sur la même ligne ! De même pour les lignes 12 et 13 !
5 avril 2016 à 17:02
Mon message 3 ci-dessus est un ajout pour mon message 1 et aussi pour ton message 2. J'espère que tu le lira et que tu nous donnera ton opinion !
6 avril 2016 à 07:40
Nos deux propositions fonctionnent pour trouver sa ligne. C'est là le principal. Pour trouver une solution idéale, il nous faudrait soit plus d'éléments, soit le classeur.
Le problème du demandeur est qu'il ne donne pas suffisamment de détails.
Sa question principale va être de placer les valeurs des cellules contenues dans la ligne trouvée en Feuil3 et dans un UserForm.
Comme nous ne sommes (ni toi, ni moi) devins, il nous est impossible d'avancer.
On ne connait ni le nom de l'userform, ni les textbox qui le composent, ni le nombre de colonnes, ni ou placer ces cellules en feuil3, etc..., etc..., etc...
Donc, sans réponse de ordinateur!, on attend...