VBA : Inserer une formule recherchev dans une cellule

Résolu
rolynx Messages postés 74 Statut Membre -  
rolynx Messages postés 74 Statut Membre -
Bonjour à tous,

Je souhaite juste, en VBA, intégrer une formule dans une cellule.

Lorsque je suis dans une cellule sur la 1ere colonne :Si la celulle reste vide, je crée une nouvelle ligne en dessous lorsque je change de cellule

Jusque là, c'est ok.

Si je change la valeur de la cellule alors :
- J'insère dans la cellule se situant juste à droite sur la même ligne, ma fonction recherchev
- Je crée une ligne en dessous lorsque je change de cellule

Voici la formule à insérer (en mode excel classique) : RECHERCHEV("celluleactive";'Base article'!$A$3:$D$9;2;0)

cellule active reprenant bien sur les coordonnées de la cellule sur laquelle je me trouve.

Cette formule a une spécificité, il faut que la formule prenne en compte la cellule où je me trouve.

J'espère que vous avez saisi ma demande sinon je répondrai bien sur à vos interrogations.

Voici donc mon code qui ne fonctionne pas pour la 2eme partie et je n'arrive pas à m'en sortir.

Excusez moi pour certaines syntaxes qui pourraient vous faire mal aux yeux, je découvre et apprends sur le tas grâce à ceux que je peux trouver sur le net

Merci de votre aide !!!!

Private Sub Worksheet_Change(ByVal Target As Range)
Dim FORMULE As String

If Target.Column = 1 And Target.Value = "" Then
Application.EnableEvents = False
Cells(ActiveCell.Row, 1).EntireRow.Select
Selection.Insert Shift:=xlDown
Application.EnableEvents = True

Else
Application.EnableEvents = False
FORMULE = "=VLOOKUP(ActiveCell.Address,Base article!$A$3:$D$9,2,FALSE)"
Cells(Target.Row, 2).Formula = FORMULE
ActiveCell.EntireRow.Insert Shift:=xlDown
Application.EnableEvents = True
End If

End Sub

1 réponse

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    bonjour

    Puisque tu découvres (bienvenue à bord du Titanic):
    1/ évite au maximum les Select-Selection qui utilisent beaucoup de mémoire et ralentissent énormément les macros
    2/ pourquoi écrire une formule qui va alourdir ton fichier alors que VBA peut te renvoyer la valeur cherchée
    3/ n'oublie pas de traiter l'erreur possible (nom inconnu dans base article)

    je te propose un code d'ici peu
    Michel
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      ci joint le code:
      Option Explicit
      '----
      Private Sub Worksheet_Change(ByVal Target As Range)
      Dim Valeur As String, Lig As Byte

      If Target.Count = 1 And Target.Column = 1 Then
      Application.EnableEvents = False
      If Target.Value <> "" Then
      With Sheets("Base article")
      On Error GoTo erreur
      Lig = .Columns("A").Find(Target, .Range("A2"), xlValues).Row
      Valeur = .Cells(Lig, "B")
      End With
      Cells(Target.Row, 2) = Valeur
      End If
      Rows(Target.Row + 1).Insert
      Rows(Target.Row + 1).Interior.ColorIndex = 6 ' A SUPPRIMER APRES ESSAIS
      Application.EnableEvents = True
      End If
      Exit Sub

      'gestionnaire erreurs
      erreur:
      Application.EnableEvents = True
      MsgBox " la valeur " & Target & " inconnue !",vbcritical
      End Sub
      '-------------------------------------------------------
      Sub SOS_events()
      Application.EnableEvents = True
      End Sub


      et la maquette de travail
      https://www.cjoint.com/?3Csj7E7uIt2
      Nota: la macro SOS_events est très utile en cas de fausse manip !!! (ça, je sais faire)
      0
    2. rolynx Messages postés 74 Statut Membre 9
       
      Genial, cela fonctionne à merveille !
      Et en si peu de ligne !

      Pour mon info car j'essaie de ne pas recopier bêtement et j'aime comprendre ce que j'écris.
      2 petites choses :
      Peux-tu m'expliquer ce que veut dire le target.count = 1
      Peux tu rapidement m'expliquer la formule ".find" ? Je comprends bien la premiere valeur (target) qui correspond à la valeur recherchée mais pas le .Range("A2") et xlValues

      Encore Merci !!!
      0
    3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Je te dis ca demain !
      0
    4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Bonjour

      Target.count compte le nombre de cellules sélectionnées
      worksheet_change se déclenche sur le changement d' UNE SEULE Cellule
      donc si pls celllulles---> Plantage de la macro


      Find est un peu similaire à la formule EQUIV d'Excel

      dans la colonne A cherche la valeur (xlvalues) de Target, en dessous de la cellule A2
      là je demande la ligne mais je pourrai demander l'adresse,
      ou créer la cellule
      dim cellule as range
      Set cellule=.Columns("A").Find(Target, .Range("A2"), xlValues)

      tu trouveras de l'aide en ligne sur find à la rubrique "Range.find, méthode"

      enfin pour potasser VBA
      https://bidou.developpez.com/article/VBA/

      Très complet, mais ca ne se lit pas comme un roman policier !
      0
    5. rolynx Messages postés 74 Statut Membre 9
       
      Merci encore !
      0