Forums Rue-Montgallet.com
Rue-Montgallet.comRue-Hardware.comRue-Occasion.comRue-DVD.comRue-Jeuxvideo.comRue-AudioVideo.comRue-Telephone.comForums
S'inscrire | S'identifier |
| Recherche avancée | Aide
 
 

Il y a 64 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

SOS Excel VBA

 
n°18219
duponlajoi​e
Profil : Jeune recrue
Posté le 28-01-2007 à 17:31:05  profilanswer
 

:hello: Bonsoir à tous,
 
Je me suis cassé la tête toute la journée sur ce problème VBA qui va sans doute vous paraître simplissime.... en fait je ne connais pas assez bien le langage VBA!
VOici la macro que je veux écrire:
Dans un tableur excel, pour chaque fois où j'entrerai le mot clé 'IA" dans une cellule, je voudrais faire apparaître:
PE: dans la même colonne 14 lignes avant
RE: dans la même colonne 2 lignes avant
PARIDERIA: dans la même colonne170 lignes après
CALIF MAM: dans la même colonne 206 lignes après
GEN1MACH: dans la même colonne 177 lignes après.
 
J'ai commencé à écrire la macro, mais je n'y arrive pas correctement. Je n'ai pas trouvé de soluce sur les topics d'internet et je suis un peu perdu.
 
SI l'un d'entre vous a la gentillesse de m'aider, je lui en serai très reconnaissant.
 
Nico
 
Voici le début de la macro... Si vous pouvez me la corriger ou me donner un trick!

Sub Macro1()
'
' Macro1 Macro
' Macro enregistrée le 28/01/2007 par Ordinateur
'
' Touche de raccourci du clavier: Ctrl+m
'for Each IA  
Range("?????" ).Select
    ActiveCell.FormulaR1C1 = "PE"
    Range("????" ).Select
    ActiveCell.FormulaR1C1 = "RE"
    Range("????" ).Select
    ActiveCell.FormulaR1C1 = "PARIDERIA"
    Range("????" ).Select
    ActiveCell.FormulaR1C1 = "CALIF MAM"
    Range("????" ).Select
    ActiveCell.FormulaR1C1 = "GEN1MACH"
    Range("????" ).Select
'next IA
 
End Sub

n°18225
ladislas26​09
Profil : Membre
Posté le 29-01-2007 à 17:18:03  profilanswer
 

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
n°18234
duponlajoi​e
Profil : Jeune recrue
Posté le 29-01-2007 à 23:54:52  profilanswer
 

Bonsoir et merci de ce petit coup de pouce:
Ca fonctionne du tonnerre comme ça!
 
J'ai une question supplémentaire à poser......  
 
Je voudrais que les modifications se fassent en dynamique:  
 
si j'efface maintenant une case IA dans le tableur excel, je voudrais que toutes les cases liées IA s'effacent en même temps.  
 
Dans quelle mesure cela est-il possible et quelle est la formule VBA à écrire en plus?..
 
Merci de votre aide efficace!
 
Nico


Aller à :
Ajouter une réponse