Macro RechercheV

Résolu
pajude Messages postés 84 Statut Membre -  
pajude Messages postés 84 Statut Membre -
Bonjour,

J'ai trouvé cette macro sur le net que j'arrive un peu à comprendre (je n'y connais pas grand chose en VBA) et je bloque.

 Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Application.Intersect(Target, Range("B5")) Is Nothing Then
  Target.Offset(0, 1).Formula = "=VLOOKUP(B5,Feuil1!A2:D7,2,0)"
   Target.Offset(0, 1).Value = Target.Offset(0, 1).Value

  End If
  End Sub


Je voudrais la modifier pour faire des recherches de la colonne B de la Feuil2 et afficher les valeurs des colonnes B à D de la Feuil1 si les valeurs sont trouvées, sinon afficher NA.
Y a t'il quelqu'un pour me répondre avec une macro simple que je puisse comprendre

Fichier joint : https://www.cjoint.com/?0HfpGOu6EBH

Merci

1 réponse

  1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Bonjour,

    Pourquoi voulez-vous une macro ??????
    0
    1. pajude Messages postés 84 Statut Membre
       
      Même si je maitrise plutôt bien la fonction recherche que j'utilise actuellement, je cherche à simplifier, avoir un tableau plus léger (mes données font près de 10000 lignes), et éviter les suppressions de formules par les utilisateurs...Et en même temps découvrir ce qui est possible en VBA !
      0
    2. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
       
      Bonjour,

      Ok. Je vous fais un fichier exemple.

      A+
      0
    3. pajude Messages postés 84 Statut Membre
       
      Bonjour,
      J'ai testé, et si je comprends, les 2 macros sont donc liées, et une doit être dans la Feuil2 et l'autre laissé dans Module 1.
      Que fait la 1ère macro, car je ne vois que la colonne B
      La 2ème je comprends mieux, elle écrit dans C,D,E si B est trouvé dans A Feuil1, sinon écrit NA (texte de TNA, qu'il est possible de modifier) dans les cellules.
      Y a t'il moyen de mettre les 2 dans le module1.
      Merci de vos explications
      0
    4. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
       
      Re,

      Y a t'il moyen de mettre les 2 dans le module1. Non, tout dans le code VBA de la feuil2 oui. Le code dans la feuil2 vous permet de traiter en temps reel la recherche sur l'evenement change d'une cellule, sinon il faut un autre evenement (ex: un click bouton ou une combinaison de touches) pour lancer le code si vous voulez tout mettre dans le module1

      Private Sub Worksheet_Change(ByVal Target As Range)
      Dim derlig As Long, lig, Ligne, Plage As Range, Nb
      Dim TNA
      'si erreur rendre evenements excel actifs
      On Error GoTo traite_erreur
      'Desactive les evenements excel: cause--->passage en majuscule de la cellule active cree une recurcivite qui plante excel
      Application.EnableEvents = False
      'derniere cellule non vide colonne B
      derlig = Range("B" & Rows.Count).End(xlUp).Row
      'test cellule active colonne B
      If Not Application.Intersect(Target, Range("B5:B" & derlig)) Is Nothing Then
      'ecriture en majuscule
      Target = UCase(Target)
      'ligne cellule active
      Ligne = Target.Row
      'Tableau NA
      TNA = Array("NA", "NA", "NA")
      With Worksheets("feuil1")
      'derniere cellule non vide colonne A
      derlig = .Range("A" & Rows.Count).End(xlUp).Row
      'mise en memoire plage cellule colonnre A---> recherche plus rapide (vous avez 10000 lignes)
      Set Plage = .Range("A1:A" & derlig)
      'recherche si l'infos existe
      Nb = Application.CountIf(Plage, Target)
      'test si >0
      If Nb > 0 Then
      lig = 1
      'recherche ligne des infos a copier
      lig = .Columns("A").Find(Target, .Cells(lig, "A"), , xlWhole).Row
      'ecriture des infos sur feuil1
      Range("C" & Ligne).Resize(, 3) = .Range("B" & lig).Resize(, 3).Value
      Else
      'ecriture NA si infos pas trouvees
      Range("C" & Ligne).Resize(, 3) = TNA
      End If
      'libere la memoire
      Set Plage = Nothing
      End With
      End If
      traite_erreur:
      Application.EnableEvents = True
      End Sub
      0