LE NEWSMAGAZINE Nº1 DES NOUVELLES TECHNOLOGIES
211 utilisateurs connectés

Excel Exécution d'une macro suite à validation d'une cellule

NIALA46 le 07 février 2009 à 16h13
Bonjour,
Sous Excel 2003,après avoir insérer des données dans une cellule(en l'occurrence la cellule "A6" nommée "Objet", je valide par la touche "Entrée".
Je souhaiterai qu'une macro s'exécute automatiquement suite à la validation par la touche "Entrée"
Étant novice, je n'arrive pas à trouver le code qui me permettrait de solutionner mon problème.
Par avance je remercie tous ceux qui voudront m'apporter leur aide.
michel_m le 07 février 2009 à 17h17
Bonjour,
ci joint un petit topo sur le déclenchement après changement validé dans une cellule
http://www.cijoint.fr/cjlink.php?file=cj200902/cijJJwRVQC.xls

n'hésites pas si tu as besoin de renseignements complémentaires
-------
Amicalement
Michel
Gorfael le 07 février 2009 à 17h23
NIALA46 a écrit :
Bonjour,
Sous Excel 2003,après avoir insérer des données dans une cellule(en l'occurrence la cellule "A6" nommée "Objet", je valide par la touche "Entrée".
Je souhaiterai qu'une macro s'exécute automatiquement suite à la validation par la touche "Entrée"
Étant novice, je n'arrive pas à trouver le code qui me permettrait de solutionner mon problème.
Par avance je remercie tous ceux qui voudront m'apporter leur aide.
Salut
Clic-droit sur le nom de l'onglet => Menu contextuel>>Visualiser le code. Tu colles le code suivant :
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("Objet")) Is Nothing Then Exit Sub
MsgBox Target.Address(0, 0)
End Sub
à la place de Msgbox... tu mets : Call nom de ta macro
Là on teste la cellule nommée Objet : Si tu renommes un autre cellule "Objet" ta macro la suivra. tu peux remplacer Range ("Objet") par [A6].

Quand tu demandes des infos, donne des données précises. Comme ça tu sais à quoi se réfère chaque instruction et ça te facilite la vie pour adapter.
A+
-------
Plus tu es moins précis, moins les réponses sont plus adaptées!
La qualité et la précision de la réponse sont proportionnelles à celles de la question, et la conditionne.
NIALA46 le 08 février 2009 à 15h44
Bonjour,
J'ai essayé toutes les solutions proposées mais je rencontre un petit problème, c'est que la macro s'exécute en boucle et il faut que je tape sur la touche "echap" pour arrêter.

Je donne quelques précisions sur mon fichier.
Il s'agit d'un calendrier mensuel perpétuel, donc sur la première feuille nommée "Calendrier" chaque jour du mois utilise plusieurs cellules (notamment une pour le jour = un nombre entre 1 et 28, 29, 30 ou 31, et une autre cellule contenant une info perso, par exemple un anniversaire ou un rendez vous, à l'aide de la fonction =RECHERCHEV. Les données personnelles se trouvent sur une 2éme feuille nommée "Data" sur plusieurs colonnes (notamment une avec les dates et un avec les objets).
Pour alimenter ces données, j'utilise deux cellules sur la feuille "Calendrier" une nommée "Date" et l'autre nommée "Objet".
La cellule nommée "Date" est alimentée à partir d'un calendrier ouvert en cliquant sur les cellules fusionnées "Z16:AA16" et à l'aide de la formule suivante :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("Z16:AA16")) Is Nothing Then
UserForm1.Show
End If
End Sub
et après avoir cliqué sur la date voulue, la formule suivante insert cette date dans la cellule nommée "Date"
Private Sub Calendar1_Click()
Range("AA21").Select
ActiveCell.Value = Format(Calendar1.Value, "mm/d/YY")
Unload UserForm1
End Sub
Je complète ensuite la cellule "Objet" et j'exécute à l'aide d'un bouton la macro suivante pour mettre à jour ma liste de données personnelles.
Sub Nouvel()
Application.Goto Reference:="Evenement"
Selection.Copy
Sheets("Data").Select
ActiveWindow.ScrollRow = 1
Range("Z2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("Z3:AA1002").Select
Selection.Sort Key1:=Range("Z3"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Range("Z2:AA2").Select
Selection.Insert Shift:=xlDown
Sheets("Calendrier").Select
Application.Goto Reference:="Objet"
Selection.ClearContents
End Sub
Ce que j'aurais souhaité, c'est que cette macro s'exécute automatiquement lorsque je clique sur "Entrée" après avoir rempli la cellule "Objet".
Après vos conseils j'ai donc mis comme code à ma feuille "Calendrier" ceci:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("Objet")) Is Nothing Then Exit Sub
Call Application.Run("Nouvel")
End Sub
Malheureusement, lorsque je clique sur entrée l'a macro s'exécute en boucle.
Je ne comprends pas pourquoi malgré divers essais de différentes façons.
Merci encore d'avoir la patience de ma lire.
michel_m le 08 février 2009 à 18h22
Re,
salut, Gorfael, ca va?


vite fait, donc....
essaies:
If Intersect(Target, Range("Objet")) Is Nothing Then Exit Sub
Application.EnableEvents = False
Nouvel 'syntaxe + légère que Call Application.Run("Nouvel")
Application.EnableEvents = True
End Sub

car dans ta procédure "nouvel" tu change la valeur de range("objet") et donc la procéduré "nouvel" redémarre etc.
mais ta macro "nouvel" est à reprendre car en utilisant l'enregistreur, tu as mis un max d'instructions parasites. je ne pas compris à quoi sert le goto ?

Voilà,voila, tu nous dis OK ou pas§
-------
Amicalement
Michel
NIALA46 le 08 février 2009 à 22h02
michel_m a écrit :
Re,
salut, Gorfael, ca va?


vite fait, donc....
essaies:
If Intersect(Target, Range("Objet")) Is Nothing Then Exit Sub
Application.EnableEvents = False
Nouvel 'syntaxe + légère que Call Application.Run("Nouvel")
Application.EnableEvents = True
End Sub

car dans ta procédure "nouvel" tu change la valeur de range("objet") et donc la procéduré "nouvel" redémarre etc.
mais ta macro "nouvel" est à reprendre car en utilisant l'enregistreur, tu as mis un max d'instructions parasites. je ne pas compris à quoi sert le goto ?

Voilà,voila, tu nous dis OK ou pas§



Bonsoir,
Effectivement la macro a été obtenue à l'aide de l'enregistreur de macro et je ne suis pas assez calé pour rectifier, j'ai bien essayé mais ça ne fonctionnait plus.
Mais toutefois avec ton nouveau code et ma macro cela fonctionne bien, alors pour le moment je vais m'en contenter en attendant d'être plus compétent pour apporter des améliorations.
Je te remercie vivement pour ton aide.
Gorfael le 09 février 2009 à 01h26
Salut à tous
Pas testées :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("Z16:AA16")) Is Nothing Then
UserForm1.Show
End If
End Sub

Private Sub Calendar1_Click()
Range("AA21") = Format(Calendar1.Value, "mm/d/YY")
Unload UserForm1
End Sub

Sub Nouvel()
On Error GoTo Err_Nouvel
Application.EnableEvents = False
Range("Evenement").Copy
Sheets("Data").select
Range("Z2").PasteSpecial Paste:=xlPasteValues
[Z3:AA1002].Sort Key1:=Range("Z3"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
Range("Z2:AA2").Insert Shift:=xlDown
Sheets("Calendrier").Range("Objet").ClearContents
Sortie_Nouvel:
Application.EnableEvents = True
Exit Sub
Err_Nouvel:
MsgBox Err.Description, vbOKOnly + vbCritical, "erreur n°" & Err.Number
Resume Sortie_Nouvel
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("Objet")) Is Nothing Then Exit Sub
Call Nouvel
End Sub
En gros
J'ai supprimé les "select"
X.Select
Selection.Action

peut généralement être remplacé par
X.action
Idem pour les feuilles
Sheet("X").Select
Selection.range("Y").Select
Selection.Action

nous donne
Sheet("X").range("Y").Action
C'est plus efficace (sauf pour le tri où il faut que la feuille soit la feuille active)
A+

-->Message édité par Gorfael le 09/02/2009 01:39:19<--
-------
Plus tu es moins précis, moins les réponses sont plus adaptées!
La qualité et la précision de la réponse sont proportionnelles à celles de la question, et la conditionne.
NIALA46 le 15 février 2009 à 17h16
Bonjour,
C'est avec quelques jours de retard du à une absence que je reprends contact pour tout d'abord te remercier.
La macro que tu me donnais ne fonctionnait pas pour le tri et je l'ai modifié ainsi :
Sub Nouvel()
On Error GoTo Err_Nouvel
Application.EnableEvents = False
Range("Evenement").Copy
Sheets("Data").Range("Z3:AA3").PasteSpecial Paste:=xlPasteValues
Worksheets("Data").Range("Z3:AA1002").Sort _
Key1:=Worksheets("Data").Range("Z3"), _
Key2:=Worksheets("Data").Range("AA3")
Sheets("Data").Range("Z3:AA3").Insert Shift:=xlDown
Sheets("Calendrier").Range("Objet").ClearContents
Sortie_Nouvel:
Application.EnableEvents = True
Exit Sub
Err_Nouvel:
MsgBox Err.Description, vbOKOnly + vbCritical, "erreur n°" & Err.Number
Resume Sortie_Nouvel
End Sub

Toutefois j'ai un autre petit problème depuis que j'ai effectué divers essais, lors que Visual Basic Editor est ouvert et que je clique dans n'importe où dans la feuille d'excel un message d'erreur apparaît à chaque action :
Boîte de dialogue avec pour info : "Microsoft Visual Basic" et le message : "Erreur d'entrée/sortie de périphérique".
Je n'arrive pas à savoir de quoi cela vient. Précision étant faite que lorsque la fenêtre de VB editor est fermée tout fonctionne normalement, mais si je veux travailler sur une macro c'est un peu gênant.
Mais encore une fois merci.




À PROPOS DU FORUM MICRO HEBDO

LES FORUMS THÉMATIQUES ET TECHNIQUES

LES FORUMS GÉNÉRAUX

ARCHIVES DU FORUM

publicité
01Informatique
01 INFORMATIQUE
L'hebdo de référence des décideurs informatiques.
Micro Hebdo
MICRO HEBDO
L'hebdo qui vous simplifie la micro
et Internet.
L'Ordinateur Individuel
L'ORDINATEUR INDIVIDUEL
Le mensuel informatique qui vous informe et vous conseille.
Nous contacter  |  Charte de confiance  |  Voir notice légale

01net.  -  01men  -  RMC  -  BFM Radio  -  BFM TV  -  TousLesPodcasts  -  01informatique.fr  -  Association RMC-BFM
Tous droits réservés © 1999 - 2009 Internext - 01net.