Macro

Résolu/Fermé
ordinateur! - Modifié par NHenry le 19/03/2016 à 16:13
 ordinateurs! - 9 avril 2016 à 18:41
Bonjour,


merci de m' aider a résoudre cette macro

Dim mot As String

mot = InputBox("nom")
For Each c In Range("A1:A22")
If c.Value = mot Then

 c.EntireRow.Select


XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

la ligne sélectionne les valeurs des cellules de cette ligne apparaisse sur feuil3 et
textbox dans userform




EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
A voir également:

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
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 :

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

1
Utilisateur anonyme
5 avril 2016 à 17:02
Bonjour pijaku,

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 !
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743 > Utilisateur anonyme
6 avril 2016 à 07:40
Salut albkan,

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...
0
merci pour votre aide
0
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 !



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
-1
Utilisateur anonyme
5 avril 2016 à 16:33
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 :


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 !
0
Utilisateur anonyme
6 avril 2016 à 23:12
Correction :

J'aurais mieux fait d'écrire ainsi, sur une seule ligne, les 3 lignes
de la boucle Do .. Loop :

Do: lig = lig + 1: Loop Until IsEmpty(Cells(lig, 1))

Plus besoin de Exit Do inutile puisque de toute façon, il n'y avait
aucune instruction à sauter entre le Exit Do et le Loop !
0