VBA : Inserer une formule recherchev dans une cellule

Résolu/Fermé
rolynx Messages postés 73 Date d'inscription mardi 12 février 2008 Statut Membre Dernière intervention 10 avril 2014 - 17 mars 2014 à 19:01
rolynx Messages postés 73 Date d'inscription mardi 12 février 2008 Statut Membre Dernière intervention 10 avril 2014 - 21 mars 2014 à 18:46
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

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 18/03/2014 à 09:39
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
Modifié par michel_m le 18/03/2014 à 10:00
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
rolynx Messages postés 73 Date d'inscription mardi 12 février 2008 Statut Membre Dernière intervention 10 avril 2014 9
Modifié par rolynx le 19/03/2014 à 18:55
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
19 mars 2014 à 18:54
Je te dis ca demain !
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
20 mars 2014 à 14:41
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
rolynx Messages postés 73 Date d'inscription mardi 12 février 2008 Statut Membre Dernière intervention 10 avril 2014 9
21 mars 2014 à 18:46
Merci encore !
0