Salut,
Pour commencer, tu dois être capable de surveiller la saisie dans les cellules.
Pour faire cela, VBA mets à ta disposition un certain nombre d'évènements qui sont déclenchés lorsque tu effectues certaines manipulations (comme l'ouverture du classeur, le changement d'une feuille ...). Tu as la possibilité d'effectuer des traitements lorsque ces évènement surviennent grace aux procédures évenementielles.
Malheureusement, ces procédures sont attachées aux objets feuille et classeur. Ce qui signifie que tu dois coder les évènements pour chaque feuille et chaque classeur. Ceci n'est pas tout à fait vrai car on a la possibilité de suivre les évènements au niveau application mais le niveau requis est déjà très élevé pour ce type de traitement.
On va donc se contenter de traiter le problème au niveau de la feuille de calcul, tu pourras ensuite reproduire le code sur les autres feuilles.
Je disais donc qu'il faut intercepter la saisie dans les cellules et on va utiliser l'évènement Change de l'objet Worksheet.
Cet évènement est déclenché dès que l'on change quelque chose dans la feuille (c'est pas tout à fait vrai mais pour une saisie dans une cellule ça marche) et nous permet de travailler avec la cellule qui a été modifiée.
Il se déclare dans le module de code de l'objet feuille comme suit :
Private Sub Worksheet_Change(ByVal Target As Range)
On remarque que cet évènement fourni l'objet Target de la classe Range (il s'agit de la cellule qui a été modifiée).
L'objet Range represente donc la cellule modifiée, on va pouvoir utiliser deux de ses propriétés pour la suite de ton projet :
Value (qui retourne la valeur de la cellule)
Address (qui retourne l'adresse de la cellule)
il faut donc tester si la valeur de la cellule est "AI", on procède avec l'instruction if, comme suit :
if target.value = "AI" then 'target représentant la cellule modifiée
'ici, on mets le traitement à faire
end if
bon, maitenant, on va s'attaquer à ce qu'il faut modifier si la cellule contient "AI".
On va créer une procédure dans un module de code à part qui sera appelé dans la procédure évenementielle.
on la déclare comme suit :
Public Sub Traitement(CelluleAI as range)
à noter que Traitement et CelluleAI sont des nom arbitraires.
Cette procédure est particulière car elle necessite une variable (CelluleAI) qui représente une cellule.
C'est cette variable qui va nous servir à déterminer dans quelle cellules il faut inscrire tes valeurs.
Pour modifier tes cellules, on va utiliser la methode offet de l'objet range qui permet d'effectuer un décalage de ligne et de colonne par rapport à une cellule de référence.
par exemple avec l'objet CelluleAI, on notera :
CelluleAI.offset(0,1).value = "cellule à droite de AI"
Offset s'utilise de la manière suivante :
Range.offset(décalage de ligne, décalage de colonne).
Offset retourne un objet range.
on a maintenant toutes les clefs pour commencer à écrire le code, on va juste prendre garde à ne pas créer d'erreur :
étant donné que l'on travaille sur des cellules décalées, il ne faut pas sortir de la plage de cellule de la feuille (A1:IV65536).
On va donc également tester si la cellule est dans une plage permettant tout les décalages à savoir :
au moins 14 lignes après la ligne 1 et 206 lignes avant la ligne 65536.
c'est à dire la plage "A15:IV65330"
On utilise la méthode intersect qui renvoie un objet range, représentatnt la plage de cellule de l'intersection de plusieurs plages., elle se note :
Dim inter as range
set intersect = intersect(CelluleAI,range("A15:IV65330" ).
Ataquons maintenant le code :
Dans le module de feuille :
Public encours As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
If encours = True Then Exit Sub
If Target.Value = "AI" Then
If Intersect(Target, Range("a15:iv65330" )) Is Nothing Then
MsgBox "impossible de traiter la demande car vous sortez de la plage de traitement"
Else
Call Traitement(Target)
End If
End If
End Sub
et dans un module de code :
Public Sub Traitement(CelluleAI As Range)
encours = True
CelluleAI.Offset(-14, 0).Value = "PE"
CelluleAI.Offset(-2, 0).Value = "RE"
CelluleAI.Offset(170, 0).Value = "PARIDERIA"
CelluleAI.Offset(206, 0).Value = "CALIF MAM"
CelluleAI.Offset(177, 0).Value = "GEN1MACH"
encours = False
End Sub
Voilà, la variable public encours sert à sortir de l'évènement pendant le traitement car comme on modifie les cellule, l'évènement Worksheet_Change se déclanche à chaque instruction "CelluleAI.offset(x,y).value=z".
Voili voulou.
Note bien que tu risque d'avoir des soucis avec ce genre de macro qui demandent beaucoup de mémoire à Excel.
@+++
http://www.excelpourtous.com
Message édité par ladislas2609 le 29-01-2007 à 17:45:01